Можно ли страницу и сортировать две разные модели на том же представлении в CakePhp?

StackOverflow https://stackoverflow.com/questions/4202240

Вопрос

Я хочу сделать что-то очень прямо вперед и просто. Я хочу иметь два разных набора страниц на одной странице. Два разных набора зависят от разных моделей. Для обсуждения Ради, мы скажем, что они 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. Отказ Есть ли что-то, что я делаю не так? Или это то, что не поддерживается Paginator CakePhp?

Это было полезно?

Решение

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

Единственный другой вариант будет изменять параметры, поэтому вы передаете параметры для обоих решеток к каждой решетке при сортировке или выйдете через страницы. Код, прикрепленный Leo выше, является хорошим началом. Вы можете добавить клавишу «Модель» из массива Paginate на каждый с именем «Параметр» и убедитесь, что вы передаете все URL-параметры в функцию Paginate, и вы должны направиться в правильном направлении.

Другие советы

Вам необходимо переопределить метод 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;
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top