Witam. Mam dziwny problem z paginatorem. Wyciąganie w layoucie danych trwa strasznie wolno. Około 6 sekund.
Sprawdzałem i zapytanie w bazie danych jest wykonywane bardzo szybko.
W czym jest problem? Przecież to zwykła funkcja foreach.
Dane wyświetlają się poprawnie po kliknięciu na numer strony. Więc paginacja działa.
Może mam jakieś złe parametry i z bazy wyciągane są wszystkie rekordy o później w php jest wykonywana paginacja ?
Po to użyłem metody setRowCount i select z adaptera aby liczyć ilość rekordów z bazy.
Sprawdziłem jescze profilerem czas wykonania tych zapytań:
Executed 2 queries in 0.010357141494751 seconds
Ma ktoś pomysł o co biega ?
model:
public function lista( $sort, $direction )
{
$adapter = new Zend_Paginator_Adapter_DbSelect( $this->select()
->setIntegrityCheck(false)
->from('top_orders')
->joinleft('top_orders_total', 'top_orders_total.orders_id = top_orders.orders_id', array( 'wartosc' => 'text') ) ->group('top_orders.orders_id')
->order( $sort.' '.$direction ) );
$adapter->setRowCount(
$this->select()->setIntegrityCheck(false)->from(
'top_orders',
Zend_Paginator_Adapter_DbSelect::ROW_COUNT_COLUMN => 'COUNT(orders_id)'
)
)
);
return $adapter;
}
Kontroler:
public function indexAction()
{
$direction = $this->_getParam('direction', 'DESC');
$sort = $this->_getParam('sort', 'date_purchased');
$zamowienia = new Zamowienia_Model_Sklepinternetowylista;
$adapter = $zamowienia->lista( $sort, $direction );
$statusy = $zamowienia->Statusy();
$paginator = new Zend_Paginator ( $adapter );
$paginator->setItemCountPerPage( 50 )->setCurrentPageNumber( $this->_getParam( 'page', 1 ) );
$this->view->paginator = $paginator;
$this->view->statusy = $statusy;
$this->view->page = $paginator->getCurrentPageNumber();
$this->view->itemperpage = $paginator->getItemCountPerPage();
$this->view->direction = $direction == 'ASC' ? 'DESC' : 'ASC';
}
widok:
$i = 1 + ( $this->page * $this->itemperpage ) - $this->itemperpage;
foreach ( $this->paginator as $item )
{
echo '<td>'.$item['customers_name'].'</td>'; echo '<td>'.$item['orders_id'].'</td>'; echo '<td>'.round($item['wartosc'], 2).' '.$item['currency'].'</td>'; echo '<td>'.$item['date_purchased'].'</td>'; echo '<td>'.$item['orders_send_date'].'</td>'; echo '<td>'.$this->statusy[$item['orders_status_wlasny']].'</td>'; echo '<td>'.($item['ups_exported'] == 1 ?
'<img src="'.$this->basePath.'/gfx/ups.gif" alt="ups" />' : '').'</td>'; $i++;
}