Zend Framework и постраничная навигация
Кратко о том как сделать постраничный вывод с помощью 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_num, 10);
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