Пагинация по уму

Discussion in 'Создание расширений для Joomla' started by ujhgj, Jul 6, 2010.

  1. Offline

    ujhgj Недавно здесь

    Joined:
    Jul 6, 2010
    Messages:
    3
    Likes Received:
    0
    Gender:
    Male
    Здравсвуйте!

    Я сделал пагинацию в своём компоненте по этой статье:
    http://kjoomla.com/notes/36-notes/51-2008-02-29-10-27-31.html

    Моя модель:
    Код (PHP):
    1. function getCurrentDeals()
    2. {
    3.   $db =& JFactory::getDBO();
    4.   $user =& JFactory::getUser();
    5.  
    6.   // пагинация
    7.   if (! $paginatorStart = JRequest::getVar('start'))
    8.   {
    9.     $paginatorStart = 0;
    10.   }
    11.   $paginatorLimit = 10; // 10 строк на страницу
    12.  
    13.   $query = 'SELECT * from repository WHERE user_id = '.$user->id.' ORDER BY ticket DESC LIMIT '.$paginatorStart.', '.$paginatorLimit;
    14.   $db->setQuery( $query );
    15.   return $db->loadObjectList();
    16. }
    17.  
    18. function getTotalRowsNumber()
    19. {
    20.   $db =& JFactory::getDBO();
    21.   $user =& JFactory::getUser();
    22.   [B]$query = 'SELECT COUNT(*) from repository WHERE user_id = '.$user->id;[/B]
    23.   $db->setQuery( $query );
    24.   return $db->loadResult();
    25. }
    26.  
    27. function getCurRowNumber()
    28. {
    29.   if (! $paginatorStart = JRequest::getVar('start'))
    30.   {
    31.     $paginatorStart = 0;
    32.   }
    33.   return $paginatorStart;
    34. }


    Функция моей вьюхи:
    Код (PHP):
    1. function display($tpl = null)
    2.   {
    3.     $model =& $this->getModel();
    4.     $currentDeals =& $model->getCurrentDeals();
    5.     $this->assignRef( 'currentDeals', $currentDeals );
    6.    
    7.     $total = $model->getTotalRowsNumber();
    8.     $limitstart = $model->getCurRowNumber();
    9.     $limit = 10; // 10 строк на страницу
    10.     $pagination = new JPagination($total, $limitstart, $limit);
    11.  
    12.     $this->assignRef('pagination', $pagination);
    13.     $this->assignRef('total', $total);
    14.     $this->assignRef('limitstart', $limitstart);
    15.  
    16.     parent::display($tpl);
    17.   }


    В статье даны общие указания, додумывать нужно самому. Я пока еще не вполне освоился с MVC и Joomla, поэтому прошу подтвердить мои догадки относительно функционирования такого механизма. Получается, при каждом перелисте пагинатора, модель будет заново лезть в базу данных, запуская функцию getTotalRowsNumber(), и выполнять один и тот же запрос, чтобы получить общее кол-во строк в таблице. Мне хотелось бы снизить нагрузку на СУБД, а гонять попусту один и тот же запрос - недопустимая роскошь.
    Пожалуйста, посоветуйте как оптимизировать мою пагинацию.
     
  2.  
  3. woojin
    Offline

    woojin Местный Staff Member => Cпециалист <=

    Joined:
    May 31, 2009
    Messages:
    3,204
    Likes Received:
    334
    Gender:
    Male
    желание конечно очень правильное!!!!!!!

    но если с сайтом в этот момент будут работать несколько человек которые будут добавлять материал?

    то при перелистывании в стандартном варианте (каждый раз лезть в БД) количество страниц будет увеличиваться или уменьшаться смотря что делают эти люди

    а если обратится один раз и только туда сюда передвигаться по уже полученным данным то как узнать что количество материала уменьшилось или увеличилось?

    если сможешь сделать такой алгоритм работы выкладывай компонент сюда многим пригодится
     

Share This Page

Loading...