Одним из основных препятствий при создании гибких и дружественных к пользователю веб-приложений является создание интуитивно-понятного интерфейса. Большинство приложений очень быстро разрастаются и разработчики обнаруживают, что они не в состоянии справиться с отображением сотен или даже тысяч записей. Рефакторинг долог, а производительность и удовлетворение пользователя могут пострадать.
Отображение разумного количества записей на странице всегда было важной частью любого приложения и доставляло множество забот разработчикам. Cake PHP? облегчает участь разработчика, предоставляя ему быстрый и легкий путь разбиения данных по страницам.
Paginator Helper? является отличным решением, потому что его легко использовать. Кроме собственно разбиения на страницы, он включает в себя несколько возможностей сортировки. Также поддерживается ajax сортировка и разбиение на страницы.
В контроллере мы установим параметры разбиения в переменной $paginate контроллера. Здесь следует упомянуть, что ключ сортировки должен быть задан в виде массива.
<?php
class RecipesController extends AppController {
var $paginate = array(
'limit' => 25,
‘order' => array(
'Post.title' => 'asc'
)
);
}
?>
<?php
class RecipesController extends AppController {
var $paginate = array(
'Recipe' => array (...) ,
'Author' => array (...)
);
}
?>
function list_recipes() {
// similar to findAll(), but fetches paged results
$data = $this->paginate('Recipe');
$this->set(compact('data'));
}
Ваше дело решать, как показывать данные пользователю, но чаще всего они отображаются в HTML таблицах. Пример ниже предполагает размещение в таблице, но Paginator Helper?, доступный в отображениях не всегда должен быть так ограничен.
Как упоминалось, Paginator Helper? предоставляет возможности сортировки, которые могут быть интегрированы в заголовки таблицы:
// app/views/recipes/list_recipes.ctp
<table>
<tr>
<th><?php echo $paginator->sort('ID', 'id');?></th>
<th><?php echo $paginator->sort('Title', 'title');?></th>
</tr>
<?php foreach($data as $recipe): ?>
<tr>
<td><?php echo $recipe['Recipe']['id']; ?></td>
<td><?php echo $recipe['Recipe']['title']; ?></td>
</tr>
<?php endforeach; ?>
</table>
Ссылки, которые создает метод Paginator Helper?->sort(), позволяют пользователю сортировать данные по определенному полю, щелкнув на заголовке столбца таблицы.
И последний ингредиент разбиения на страницы в отображениях – навигация по страницам, также генерируемая Paginator Helper?’ом.
<!-- Отображает ссылки на предыдущую и следующую страницы-->
<?php
echo $paginator->prev('<< Previous ', null, null, array('class' => 'disabled'));
echo $paginator->next(' Next >>', null, null, array('class' => 'disabled'));
?>
<!—выводит X из Y, где X – текущая страница, а Y – их общее количество. -->
<?php echo $paginator->counter(); ?>
Вывод метода counter() может быть настроен с помощью специальных маркеров:
<?php
echo $paginator->counter(array(
'format' => 'Page %page% of %pages%, showing %current% records out of
%count% total, starting on record %start%, ending on %end%'
));
?>
В разбиение страниц легко добавить ajax-функциональность. Единственное, что потребуется – это подключить js-библиотеку Prototype, установить индикатор (иконка загрузки внутри DIV’а) и указать DIV, который будет обновляться вместо перезагрузки страницы.
В заголовке подключаем Prototype, устанавливаем индикатор (spinner.gif), и определяем DIV с содержимым (“content”).
Верстка может выглядеть вот так (код приведен частично):
<head>
<title><?php echo $title_for_layout; ?></title>
<?php echo $javascript->link(array('prototype')); ?>
<style type="text/css">
div.disabled {
display: inline;
float: none;
clear: none;
color: #C0C0C0;
}
</style>
</head>
<body>
<div id="main">
<div id="spinner" style="display: none; float: right;">
<?php echo $html->image('spinner.gif'); ?>
</div>
<div id="content">
<?php echo $content_for_layout; ?>
</div>
</div>
</body>
</html>
Единственная дополнительная настройка для разбиения на страницы с использованием ajax производится с помощью метода Pagination Helper?::options(), который определяет необходимые параметры ajax. В данном случае, мы определяем, что все ссылки должны обновлять элемент, ID которого равен ”content”, данными и во время загрузки будет отображаться 'spinner'.
Обратите внимание: если ключ ‘update’ не задан, Pagination Helper? будет выводить обычные (не-ajax) ссылки.
<?php
//Sets the update and indicator elements by DOM ID
$paginator->options(array('update' => 'content', 'indicator' => 'spinner'));
echo $paginator->prev('<< Previous', null, null, array('class' => 'disabled'));
echo $paginator->next('Next >>', null, null, array('class' => 'disabled'));
?>
<!-- prints X of Y, where X is current page and Y is number of pages -->
<?php echo $paginator->counter(); ?>
Надо заметить, что paginating подерживается начиная с 1.2.x. В stable еще нет.
Приношу извинения за клевету %), проглядел, ибо новичок в Cake PHP? и на этом ресурсе. Отличный ресурс, творческих успехов в этом году всем, кто его развивает!
Эм, а как изменить кол-во записей на странице?.. Кроме того, что выставить по умолчанию ?
'limit' => 5 в var $paginate, первый же пример. вместо 5 – нужное число.
Это да, но я не об этом. Как сделать что чтото вроде такого:
Record per page 5|10|20|30
Нажал на к примеру на 30, 30 записей и выводит...
а я об этом. сделай ссылки и в пиши в куку/сессию/бд/передавай именованным параметром это значение. а при паджинации указывай это число в лимите.