Можно ли страницу и сортировать две разные модели на том же представлении в CakePhp?
-
25-09-2019 - |
Вопрос
Я хочу сделать что-то очень прямо вперед и просто. Я хочу иметь два разных набора страниц на одной странице. Два разных набора зависят от разных моделей. Для обсуждения Ради, мы скажем, что они 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, поэтому вы можете пройти модельные данные, контрольные флаги и т. Д.