Zend Framework и постраничная навигация

в разделе Программирование | Метки: Zend Framework, PHP

Кратко о том как сделать постраничный вывод с помощью Zend_Paginator можно прочитать из официального руководства. Однако не все там описано, к примеру у меня есть 100 организаций, которые выводятся по 10 штук на каждой странице. Я хочу чтобы на каждой странице нумерация была в нормальном виде, то есть на первой странице с 1-й по 10, на второй с 11 по 20 итд.

Код, который описывает таблицу /var/www/project-name/application/models/OrganizationsTable.php

<?php
class OrganizationsTable extends Zend_Db_Table
{
    protected 
$_name 'organizations';

    public function 
getByTypeID($type_id$page 0$items_on_page 10)
    {
        
$select $this->getAdapter()->select()
                                     ->
from(array('o' => $this->_name),
                                             array(
'name''address''website''telephone',
                                                   
'work_time''latitude''longitude''id'
                                                 
)
                                         )
                                     ->
join(array('ot' => 'organizations_type'),
                                                   
'o.id = ot.organization_id'
                                         
)
                                     ->
where('ot.type_id = ?'$type_id);
        
$paginator = new Zend_Paginator(new Zend_Paginator_Adapter_DbSelect($select));
        
$paginator->setCurrentPageNumber($page);
        
$paginator->setItemCountPerPage($items_on_page);
        
        return 
$paginator;
    }
}
?>

контроллер /var/www/project-name/application/controllers/OrganizationController.php


<?php

class OrganizationController extends Zend_Controller_Action
{
    public function 
byTypeAction()
    {
        
$this->view->type_found false;
        
$id intval($this->_request->getParam('id'));
        
$page_num intval($this->_request->getParam('page'));
        if (!
$id) {
            return;
        }
        if (!
$page_num) {
            
$page_num 0;
        }
        
$org_table = new OrganizationsTable();
        
$org_data $org_table->getByTypeID($id$page_num10);
        if (
$org_data->count()) {
            
$this->view->type_found true;
            
$this->view->paginator $org_data;    
        }    
    }
}
?>

Кусок шаблона /var/www/project-name/views/scripts/organization/by-type.phtml


<?php 
$pagination_control 
$this->paginationControl($this->paginator,
                             
'Sliding',
                             
'pagination_control.phtml');

echo 
$pagination_control;
$first_item_number $this->paginator->getPages()->firstItemNumber;
echo 
"<ol start='{$first_item_number}'>";
foreach (
$this->paginator as $item) {
    echo 
"<li><p>{$item['name']}</p><p>Адрес: {$item['address']}</li>";
}
echo 
'</ol>';
echo 
$pagination_control;
?>

Тут вот в чем хитрость, мы получаем номер первого item ($first_item_number ), который выводится на странице и передаем его в html тег ol, в параметр start