2012-02-02 2 views
0

Я создал Zend_Paginator на основе AJAX, однако я не хочу извлекать все записи из запроса. Например; У меня есть десять элементов на странице, поэтому я хочу, чтобы мой запрос извлекал только 10 строк.Как улучшить производительность zend paginator pagination

Вот код: -

$request = $this->getRequest(); 
$phone_service_id = $request->getParam("id"); 
$registry = Zend_Registry::getInstance(); 
$DB = $registry['DB']; 
$sql ="SELECT caller_name,call_number,call_start_time,call_duration,call_direction 
     FROM CALL_LOG 
     WHERE phone_service_id = $phone_service_id"; 
$result = $DB->fetchAll($sql); 
$page=$this->_getParam('page',1); 
$paginator = Zend_Paginator::factory($result); 
$paginator->setItemCountPerPage(10); 
$paginator->setCurrentPageNumber($page); 
$this->view->paginator=$paginator; 
$page = $paginator->getCurrentPageNumber(); 
$perPage = $paginator->getItemCountPerPage(); 
$total = $paginator->getTotalItemCount(); 
$A = ($page - 1) * $perPage + 1; 
$B = min($A + $perPage - 1, $total); 
$C = $total; 
$this->view->assign('url', $request->getBaseURL()); 
$this->view->assign('total',$total); 
$this->view->assign('page',$page); 
$this->view->assign('A',$A); 
$this->view->assign('B',$B); 
$this->view->assign('C',$C); 

Как я могу ограничить мой вопрос, так что извлечь сначала 10 строк на первой странице, и если его второй странице, так это только извлечь из 11 до 20 строк и так на?

ответ

2

Вы можете сделать что-то вроде этого

$select = $DB->select() 
      ->from('CALL_LOG', array('caller_name','call_number','call_start_time','call_duration','call_direction')) 
      ->where('phone_service_id = ?', $phone_service_id); 
$adapter = new Zend_Paginator_Adapter_DbSelect($select); 
$paginator = new Zend_Paginator($adapter); 

, а затем остальной части кода.

+0

работает отлично, но может у PLZ сказать мне, как я могу убедиться, что он действительно делает то, что я хочу .means сказать querring только specfic 10 строк –

+1

вы можете проверить свои файлы журнала mysql, чтобы точно увидеть, какой запрос выполняется при просмотре стр. Также я уверен, что для этого можно использовать профилировщик zend db. – Optimus

2

Форма запроса к объекту Zend_Db_Select. Затем используйте Zend_Paginator_Adapter_DbSelect. Он автоматически добавит ограничение и смещение к вашему запросу.

+0

любезно скажите мне, как изменить свой код? –

1

Если вы посмотрите на Zend_Paginator manual page, вы увидите, что требуемое поведение уже встроено, если вы предоставили Zend_Paginator объект Zend_Select. На данный момент вы предоставляете его array.

Чтобы изменить это, вы должны изменить свой код следующим образом: -

$request = $this->getRequest(); 
$phone_service_id = $request->getParam("id"); 

//altered code follows 
$select = new Zend_Db_Select(Zend_Db_Table::getDefaultAdapter()); 
$select = $DB->select() 
     ->from('CALL_LOG', array(
       'caller_name', 
       'call_number', 
       'call_start_time', 
       'call_duration', 
       'call_direction')) 
     ->where('phone_service_id = ?', $phone_service_id); 
$paginator = Zend_Paginator::factory($select); 
//End of altered code 

$paginator->setItemCountPerPage(10); 
$page=$this->_getParam('page',1); 
$paginator->setCurrentPageNumber($page); 
$this->view->paginator=$paginator; 
$page = $paginator->getCurrentPageNumber(); 
$perPage = $paginator->getItemCountPerPage(); 
$total = $paginator->getTotalItemCount(); 
$A = ($page - 1) * $perPage + 1; 
$B = min($A + $perPage - 1, $total); 
$C = $total; 
$this->view->assign('url', $request->getBaseURL()); 
$this->view->assign('total',$total); 
$this->view->assign('page',$page); 
$this->view->assign('A',$A); 
$this->view->assign('B',$B); 
$this->view->assign('C',$C); 

Zend_Paginator теперь будет выглядеть после того, как запрос к базе данных, как и когда это требуется.
Необходимым условием успешного использования Zend Framework является чтение manual и API documentation, с которыми вы действительно будете бороться.

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

Обратите внимание: я не смог проверить этот код, но я не вижу причин, почему он не должен работать.

+0

Допустимая фатальная ошибка: аргумент 1 передан в Zend_Db_Select :: __ construct() должен быть экземпляром Zend_Db_Adapter_Abstract, null задан, вызывается в C: \ xampp \ htdocs \ phoggi \ application \ controllers \ LoginController.php в строке 111 и определен в C : \ xampp \ htdocs \ phoggi \ library \ Zend \ Db \ Select.php в строке 163 –

+0

= чем Q очень сильно сэр –