Я использую cakephp 2.3.1, и у меня проблема с компонентом Paginator.
Моя цель – такие страницы, как:
example.com/abruzzo example.com/abruzzo/2 example.com/abruzzo/3
Я создал следующий маршрут:
Router::connect('/:regione/:page', array('controller'=>'regions','action'=>'home'), array('page' =>'[0-9]+')); Router::connect('/:regione', array('controller' => 'regions', 'action' => 'home'));
(так как вы видите, что первая работа по маршруту обрабатывает параметр страницы )
Теперь, чтобы правильно обрабатывать параметр страницы, я добавил следующую строку в параметр BeforeFilter RegionsController .
public function beforeFilter() { $this->request->params['named']['page'] = (isset($this->request->params['page'])) ? $this->request->params['page'] : 1; }
потому что я прочитал компонент Componentet Paginator, он будет выглядеть как ad ['named'] ['page'] вместо ['page'].
ПЕРВЫЙ ВОПРОС:
Это верно? мне действительно нужен этот взлом в beforeFilter ()?
Затем мне нужно показать номера страницы, используя:
<?php echo $this->Paginator->numbers(); ?>
Проблема здесь в том, что URL-адрес, созданный по ссылке, неверен .. они указывают на:
example.com/regions/home/page:2 example.com/regions/home/page:3 etc...
Мне не нужны такие URL-адреса, мне нужно:
example.com/abruzzo example.com/abruzzo/2 example.com/abruzzo/3
ВТОРОЙ ВОПРОС:
Как заставить URL-адрес, который я хочу, вместо файла controller / action / page: N?
Благодаря!
Это, вероятно, дубликат .
Но, отвечая на ваш первый вопрос: это зависит. Если вы уверены, что ваш URL не получит больше параметров, ваша маршрутизация может быть больше похожа на
Router::connect('/:regione/*', array('controller'=>'regions','action'=>'home'));
и в «домашнем» действии
public function home($pageOption=null) { if (is_numeric($option)) { $this->passedArgs['page'] = $pageOption; } $items = $this->paginate('Home'); ... }
Я думаю, что опция beforeFilter лучше, так как она многократно используется и позволяет вам лучше настроить ваши параметры.
Теперь статья, которая помогла другим подобным вопросам (и ваш второй вопрос), возобновилась до этого
В представлении home.ctp (или что вам угодно)
$prev_link = str_replace('page:', '', $this->Paginator->prev('« Prev')); $prev_link = preg_replace('/\/1"/', '"', $prev_link); $next_link = str_replace('page:', '', $this->Paginatornext('Next »')); echo $prev_link; echo $next_link;
Итак, вместо обычного
echo $this->Paginator->prev('< Prev'); echo $this->Paginator->numbers(); echo $this->Paginator->next('Next >');
вам придется вручную заменить часть страницы «page:», а затем повторить ее.
Конечно, вы всегда можете изменить PaginationHelper, но я бы не рекомендовал этого, потому что для каждого обновления торта вам нужно проверить, был ли PaginationHelper изменен, а затем повторно настроить его.
Прочитайте статью, опубликованную по другому вопросу, в случае, если вам не ясно, что-то надействует.
Я думаю, это то, что вы ищете