Cakephp две отдельные нумерации страниц одной и той же модели - PullRequest
4 голосов
/ 21 февраля 2010

Я понятия не имею, как обрабатывать эти две отдельные нумерации страниц в одном представлении. Спасибо за помощь.

Код контроллера:

[...]
$this->Post->bindModel(array(
'hasAndBelongsToMany'=>array('Tag'),
'belongsTo'=>array('User')),false);
if($this->Session->check('Auth.User.id'))
  $this->Post->bindModel(array(
  'hasMany'=>array(
    'UserVote'=>array('conditions'=>array('UserVote.user_id'=>$this->Session->read('Auth.User.id') )),
    'Favorite'=>array('conditions'=>array('Favorite.user_id'=>$this->Session->read('Auth.User.id') ))
  )), false);


$posts = $this->paginate($this->Post,array('Post.public'=>1,'Post.user_id'=>$uid));

$posts2 = $this->paginate($this->Post,array('Post.public'=>0,'Post.user_id'=>$uid));


$this->set('posts',$posts);
$this->set('posts2',$posts2);

[...]

Ответы [ 4 ]

2 голосов
/ 04 мая 2011

Мне недавно пришлось сделать то же самое, потому что у меня была одна HTML-страница, на которой были вкладки, и в каждой вкладке была разная разбитая на страницы таблица одной и той же модели с разными условиями для каждой.

Способ, которым я обошел проблему, заключался в том, чтобы создать фиктивные модели, основанные на модели, которую я хотел разбить на страницы несколько раз. Затем я просто сослался на эти фиктивные модели для своей нумерации страниц.

Пример:

Базовая модель

class Post extends appmodel { };

Фиктивные модели - важно, чтобы они использовали ту же таблицу, что и базовая модель

class Posts1 extends Post { var $useTable = 'posts'; }
class Posts2 extends Post { var $useTable = 'posts'; }

В вашем контроллере

    function multiview($id = null) {

    $this->paginate['Posts1'] = array(
        'conditions'=>array('Posts1.field'=>0),
        'limit'=>5
    );
    $this->set('posts1', $this->paginate('Posts1'));

    $this->paginate['Posts2'] = array(
        'conditions'=>array('Posts2.field'=>1),
        'limit'=>5
    );
    $this->set('posts2', $this->paginate('Posts2'));
}

Тогда, по вашему мнению,

Display first paginated data
<?php foreach ($posts1 as $post):   ?>
Do Paginated row display here...
<?php endforeach; ?>

<!-- Shows the page numbers -->
<?php echo $this->Paginator->numbers(array('model'=>'Posts1')); ?>
<!-- Shows the next and previous links -->
<?php echo $this->Paginator->prev('« Previous', null, null, array('class' => 'disabled')); ?>
<?php echo $this->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 $this->Paginator->counter(); ?>

Display second paginated data

<?php foreach ($posts2 as $post):   ?>
Do Paginated row display here...
<?php endforeach; ?>

<!-- Shows the page numbers -->
<?php echo $this->Paginator->numbers(array('model'=>'Posts2')); ?>
<!-- Shows the next and previous links -->
<?php echo $this->Paginator->prev('« Previous', null, null, array('class' => 'disabled')); ?>
<?php echo $this->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 $this->Paginator->counter(); ?>
2 голосов
/ 23 февраля 2010

Несмотря на то, что в большинстве случаев правильным решением будет реорганизация вашего пользовательского интерфейса для устранения необходимости двойной разбивки на страницы, следующее решение является рабочим:

Во-первых, в вашем контроллере вы переопределяете функцию paginate () в Cake.для поиска ключа paginator:

    /**
     * Handles automatic pagination of model records.
     *
     * @param mixed $object Model to paginate (e.g: model instance, or 'Model', or 'Model.InnerModel')
     * @param mixed $scope Conditions to use while paginating
     * @param array $whitelist List of allowed options for paging
     * @return array Model query results
     * @access public
     * @link http://book.cakephp.org/view/165/Controller-Setup
     */
     function paginate($object = null, $scope = array(), $whitelist = array(), $key = null) {
      $results = parent::paginate($object, $scope, $whitelist);
      if ($key) {
       $this->params['paging'][$key] = $this->params['paging'][$object];
       unset($this->params['paging'][$object]);
      }

      return $results;
     }

Затем

   /**
    * undocumented function
    *
    * @param string $key 
    * @return void
    * @access public
    */
     function _pageForPagination($by) {
       $page = 1;
       $samekey = isset($this->params['named']['by']) && $this->params['named']['by'] == $by;
       $pageInUrl = isset($this->params['named']['page']);
       if ($samekey && $pageInUrl) {
         $page = $this->params['named']['page'];
       }

       $this->passedArgs['page'] = $page;
       return $page;
     }

        /**
     * FIXME: Wrapper for Cake's pagination
     * Change pagination criteria on the fly (conditions, grouping, order, limit)
     *
     * @param string $model 
     * @param string $criteria 
     * @return void
     * @author Andrew
     */
     function _paginateBy($key) {
      $this->User->unbindModel(array('hasMany' => array('UserImage')), false);
      $this->paginate['User'] = am($this->User->getCriteria($key), array('page' => $this->_pageForPagination($key)));
      return $this->paginate('User', array(), array(), $key);
     }

Затем используйте его в контроллере следующим образом: $ this-> set ('byJoinDate', $ this -> _ paginateBy ('random'));

В модели: echo $ paginator-> prev ('prev', array ('model' => $ by, 'class' => 'back'), null, array('model' => $ by, 'class' => 'disabled back'));

0 голосов
/ 22 февраля 2010

Является ли хорошей идеей иметь две отдельные нумерации страниц на странице? Похоже, вы пытаетесь разбивать страницы на страницы публичных и непубличных постов - что, конечно, нельзя сделать одновременно? То есть пользователь никогда не будет одновременно находиться на странице 3 общедоступных сообщений и странице 2 непубличных сообщений. Единственный случай, когда это действительно сработает, это через AJAX с пагинацией на странице в соответствии с предложением matiasf.

Не было бы лучшим решением просто показать первые x общедоступных и непубличных постов в текущем представлении и создать новое представление, чтобы показать нумерацию страниц для каждого, к которому ведет ссылка, например "просмотреть все публичные сообщения" и "просмотреть все непубличные сообщения"?

0 голосов
/ 21 февраля 2010

Поскольку помощник по разбиению на страницы полагается на поле $ controller-> pagination, я думаю, что это невозможно. Быстрым хаком было бы преобразовать одну или обе нумерации страниц в Ajax. Помощник по нумерации страниц очень хорошо работает с помощником Ajax.

...