cakephp-как изменить условие пагинации?
На нескольких местах в одном контроллере у меня есть код типа:
$publications = $this->paginate('Publication', $conditions);
...где $conditions-массив условий, какие поля выбрать и как (используя как в mysql).
Каждый из них имеет различное утверждение" Order by".Как я могу достичь этого и определить другой "порядок" частью sql?
UPDATE (2011-03-11): это часть того, как я определил разбиение на страницы:
$this->paginate = array(
'limit' => 1,
'fields' => array('`Publication`.*, PublicationNumeration.*, Collection.*, Publisher.*, Publication.title as PublicationTitle'),
'joins' => array( array('table' => 'publication_numerations', 'alias' => 'PublicationNumeration', 'type' => 'LEFT', 'conditions' => array( 'Publication.id = PublicationNumeration.publication_id' ) ) )
, 'order' => array('PublicationTitle desc')
);
$publications = $this->paginate('Publication', $conditions);
$this->set(compact('publications', 'urlArgs'));
Часть с 'limit' работает, но 'order' не работает, и не отображается в debug режим вообще.
3 ответа:
Вы можете переопределять функцию разбиения на страницы для каждого раза, когда вы реализуете ее в каждом отдельном действии. Например:
function list_recipes() { $this->paginate = array( 'limit' => 10, 'order' => array( 'Recipe.title' => 'asc' ) ); $data = $this->paginate('Recipe'); $this->set(compact('data')); }
В вашем случае вы, вероятно, захотите повторно использовать свой массив
$conditions
, но изменить значение'order'
для каждой отдельной реализации.Дополнительная ссылка: Pagination doc
Я использовал эту идею для создания пользовательского выбора элементов на странице.
Моя пагинация по умолчанию:var $paginate = array( 'order' => array('User.id' => 'asc') );
Я добавил Это к своему контроллеру, чтобы изменить ограничение на 25 (также добавил 1 для 5 и 10, чтобы посмотреть, как это будет происходить, и соответственно изменил предельное значение):
function list25() { //fetches with different limit than default $this->paginate = array( 'limit' => 25, 'order' => array( 'User.id' => 'asc' ) ); $data = $this->paginate('User'); $this->set('users', $data); }
Затем, в моем основном представлении (index.ctp) я добавил Это в нижней части списка данных:
<span style="float:right;"> <?php echo " <span style='vertical-align:top;font-size:12px;'>Show:</span>"; echo $html->link(' 5', array('controller'=>'users', 'action' => 'list5')); echo $html->link(' 10', array('controller'=>'users', 'action' => 'list10')); echo $html->link(' 25', array('controller'=>'users', 'action' => 'list25')); ?> </span> <span style="float:right;margin-right:10px;"><?php echo $paginator->numbers(); ?></span>
...в нижней части экрана отображается следующий текст: показать: 5 10 25
То числа при нажатии связаны с действием контроллера и, таким образом, сбрасывают лимит (и обновляют страницу с новым установленным лимитом).Возможно, есть лучший способ достичь той же функциональности, что и при создании представления для каждого варианта: list5.ctp, list10.ОСАГО и лист25.ГЦП. В любом случае, это дает пользователю возможность выбрать, сколько данных он хочет видеть на странице. Комментарии?
....пользователь noob cakePHP...