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 2

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 "&nbsp;&nbsp;<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...

Попробуйте следующее:
echo $this- > Paginator - >link ('5', array ('limit' = > '5')) echo $this- > Paginator - >link ('10', array ('limit' = > '10')); echo $this- > Paginator - >link ('10', array ('limit' => '25'));