Можно ли разбить на страницы и отсортировать две разные модели в одном представлении в CakePHP? - PullRequest
4 голосов
/ 17 ноября 2010

Я хочу сделать что-то очень прямолинейное и простое. Я хочу иметь два разных набора разбитых на страницы данных на одной странице. Два разных набора зависят от разных моделей. Ради обсуждения скажем, что это Image и Item.

Я могу настроить два пейджера для двух моделей и получить правильный набор объектов. Я могу получить правильные ссылки на пейджер. Но когда дело доходит до фактического перехода по ссылкам на параметры, оба пейджера считывают параметры и предполагают, что они применяются к ним.

Это выглядит примерно так:

   $this->paginate = array (
        'Item'=>array(
            'conditions'=>array('user_id'=>$id),
            'limit' => 6, 
            'order' => array(
                'Item.votes'=>'desc', 
                'Item.created'=>'desc'
            ),
            'contain'=>array(
                'User', 
                'ItemImage' => array (
                    'order'=>'ItemImage__imageVotes desc'
                )
            )
        ),
        'Image'=>array(
            'limit'=>6,
            'contain'=>array(
                'User',
                'ItemImage'=>array('Item'),
            ),
            'order'=>array(
                'Image.votes'=>'desc',
                'Image.views'=>'desc'
            ),
            'conditions'=>array(
                'Image.isItemImage'=>1,
                'Image.user_id'=>$id
            )
        )
    );
    $this->set('items', $this->paginate('Item'));   
    $this->set('images', $this->paginate('Image'));

Это в контроллере. В представлении у меня есть ссылки сортировки, которые выглядят так:

<div class="control"><?php echo $this->Paginator->sort('Newest', 'Image.created', array('model'=>'Image')); ?></div>

Однако, это дает ссылку, которая выглядит следующим образом:

http://localhost/profile/37/page:1/sort:Image.created/direction:asc

Там нет ничего, чтобы сказать пагинатору, какую модель я собираюсь отсортировать. Поэтому, когда я нажимаю на ссылку, она пытается отсортировать обе модели по Image.created. В результате возникает ошибка, поскольку Item невозможно отсортировать по Image.created. Я что-то не так делаю? Или это что-то, что не поддерживается пагинатором CakePHP?

Ответы [ 2 ]

2 голосов
/ 17 ноября 2010

Вам потребуется переопределить метод paginate для модели контроллера на этой странице.

Я сделал что-то похожее, может быть, этот фрагмент поможет:

function paginate($conditions, $fields, $order, $limit, $page = 1, $recursive = null, $extra = array())
{
    $pageParams = compact('conditions', 'fields', 'order', 'limit', 'page', 'recursive', 'group');
    $this->contain('ModuleType', 'NodeDescriptor');
    $pageItems = $this->find('all',$pageParams);
    $pagesOut = array();
    foreach($pageItems as $pageItem)
    {
        $status = $pageItem['SiteAdmin']['status_id'];
        $moduleInfo = null;
        $nodeTitle = $pageItem['NodeDescriptor']['title'];
        $published = $pageItem['NodeDescriptor']['published'];
        $pageitemID = $pageItem['SiteAdmin']['id'];
        $moduleId =  $pageItem['SiteAdmin']['module_id'];
        $contName =  $pageItem['ModuleType']['controller'];
        if($moduleId)
        {
            $thisModel = ClassRegistry::getObject($moduleType);
            $thisModel->contain();
            $moduleInfo = $thisModel->read(null,$moduleId);
            $moduleInfo = $moduleInfo[$moduleType];
        }
        $pagesOut[] = array(
            'status'=>$status,
            'node'=>$nodeTitle,
            'published'=>$published,
            'info'=>$moduleInfo,
            'module_id'=>$moduleId,
            'contName'=>$contName,
            'pageitem_id'=>$pageitemID);
    }
    return $pagesOut;
}

Делая это таким образом, вы получаете контроль над параметрами, передаваемыми для разбивки на страницы, поэтому вы можете передавать специфические данные модели, флаги управления и т. Д.

1 голос
/ 18 ноября 2010

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

Единственным другим вариантом будет изменение параметров, чтобы вы передавали параметры для обеих сеток в каждую сетку при сортировке или переходе по страницам. Код, размещенный Лео выше, является хорошим началом. Вы можете добавить ключ модели из массива paginate к каждому именованному параметру и убедиться, что все параметры URL переданы функции paginate, и вы должны двигаться в правильном направлении.

...