#cakephp #pagination
#cakephp #разбивка на страницы
Вопрос:
Я вручную устанавливаю значения разбивки на страницы CakePHP в моем контроллере Usergals следующим образом, чтобы разбить связанную модель (TreasuresUsergal) на страницы в представлении Usergal. Вот упрощенный фрагмент из UsergalController:
public function view($id = null) {
$this->loadModel('TreasuresUsergal');
$options['joins'] = array(
array('table' => 'treasures',
'alias' => 'Treasure2',
'type' => 'LEFT',
'conditions' => array(
'Treasure2.id = TreasuresUsergal.treasure_id',
)
)
);
$options['conditions']=array('TreasuresUsergal.usergal_id'=>$id);
$options['fields']=array('Treasure2.*','TreasuresUsergal.ord','TreasuresUsergal.comments');
$options['order']=array('TreasuresUsergal.ord'=>'asc');
$options['limit']=$limit;
$this->Paginator->settings = $options;
$treasures=$this->Paginator->paginate('TreasuresUsergal');
$this->set('treasures',$treasures);
}
Итак, в приведенном выше примере $id — это значение, переданное функции просмотра из URL. Здесь есть живой пример этого:
http://collections.centerofthewest.org/usergals/view/20
Как вы можете видеть, он отлично работает для одной страницы. Однако сегодня я протестировал разбиение на страницы в представлении и обнаружил, что кнопка «далее» не работает. Счетчик, сортировка и номера страниц загружаются правильно, но каждый раз, когда передается фактический именованный параметр «страница: n» (когда n больше 1), я получаю Не найденную страницу со следующей ошибкой:
Not Found
Error: The requested address '/usergals/view/20/page:2?url=/usergals/view/20' was not found on this server.
Должно быть, я упускаю что-то простое — я немного поэкспериментировал с маршрутами, но не смог разобраться. Или, возможно, мне не хватает некоторых параметров разбиения на страницы? Или он считает, что его пределы ограничены, когда его нет?
ОБНОВЛЕНИЕ / ОБХОДНОЙ ПУТЬ
После некоторой возни я разработал это обходное решение. Не так хорошо, как хотелось бы, Но вот основная идея (можно добавить обработку ошибок и т. Д.)
Сначала я добавил проверку в beforeFilter, чтобы проверить, установлен ли параметр страницы. Если это так, я изменяю его на параметр ‘p’ и перенаправляю.
Я сделал это здесь, потому что в противном случае у меня были проблемы с исключением Not Found (см. Примечания внизу). Итак, в beforeFilter:
if (isset($this->params['named']['page'])){
$newurl=$this->params['named'];
$pg=$newurl['page'];
unset($newurl['page']);
$newurl['p']=$pg;
$this->redirect(array('action' => 'view/'.$this->params['pass'][0]) $newurl);
}
Затем в функции «просмотр» того же контроллера я добавил это вместе с другими параметрами разбиения на страницы:
if (isset($this->params['named']['p'])) $options['page']=$this->params['named']['p'];
При этом стандартное поведение разбиения на страницы, похоже, отлично работает в представлении. Предыдущий, следующий и т.д.
Если у кого-нибудь есть лучшее предложение, я хотел бы его услышать. Мне не нравится идея необходимости перенаправления, но пока это работает.
Стоит отметить, что добавление этого кода (даже просто для эксперимента) — привело к тому, что все мои подсчеты нумерации страниц перестали работать. Запрос в debug был правильным, но отображаемые значения были неверными:
try {
$this->Paginator->paginate();
} catch (NotFoundException $e) {
}
Комментарии:
1. Откуда берется этот лимит в $? Также я не уверен, что это хороший способ: ‘Treasure2. *’ вы пытались написать каждое Treasure2. инструкция для всех полей, я знаю, что это займет много времени, но просто чтобы убедиться, что этот символ (*) не мешает вашему запросу.
2. Спасибо за комментарий. Я должен был упомянуть, что я жестко установил ограничение в 100 долларов — я просто планирую, что когда-нибудь это будет переменной, поэтому я сделал это таким образом. Смотрите Мое обновление для решения проблемы, которую я разрабатывал.