изменить CakePhp1.3 paginator URL назначения? - PullRequest
0 голосов
/ 19 ноября 2010

Я новичок в cakephp ... и у меня есть страница с URL-адресом:

http://localhost/books/filteredByAuthor/John-Doe

, поэтому контроллер - «книги», действие - «FilteredByAuthor» и «Джон-Доу»´ это параметр ... но URL выглядит уродливо, поэтому я добавил маршрут следующим образом:

Router::connect('/author/:name', array( 'controller' => 'books','action' => 'filteredByAuthor'), array('pass'=>array('name'),'name'=>".*"));

и теперь моя ссылка:

http://localhost/author/John-Doe

проблема в том, чтопредставление имеет paginator, и когда я изменяю страницу (нажав на кнопку «Далее» или «Предыдущая») .. paginator не будет учитывать мою маршрутизацию ... и изменит URL на этот

http://localhost/books/filteredByAuthor/John-Doe/page:2

код на мой взгляд просто:

<?php echo $this->Paginator->prev('<< ' . __('previous', true), array(), null, array('class'=>'disabled'));?>

документация ничего не говорит о том, как этого избежать, и я потратил часы на чтение исходного кода и API paginators, и, в конце концов, я просто хочу, чтобы мои ссылкибыть примерно таким: (с указанием сортировки и направления в URL)

http://localhost/author/John-Doe/1/name/asc

Можно ли это сделать и как?

1 Ответ

1 голос
/ 15 декабря 2010

не хочу отвечать на мой собственный вопрос ... но это может сэкономить время другому разработчику =) (это все о получении хорошей кармы)

я обнаружил, что вы можете передать массив "options" в paginator, и внутри этого массива вы можете указать url (массив: controller, action и параметров), который paginator будет использовать для создания ссылок. поэтому вы должны написать все возможные маршруты в файле rout.php. В основном есть 3 варианта:

  • когда "страница" не определена

Например:

http://localhost/author/John-Doe

paginator будет считать, что это первая страница. Соответствующий маршрут будет:

Router::connect('/author/:name', array( 'controller' => 'books','action' => 'filteredByAuthor'),array('pass'=>array('name'),'name'=>'[a-zA-Z\-]+'));
  • когда "страница" определена

Например:

http://localhost/author/John-Doe/3   (page 3)

Маршрут будет:

Router::connect('/author/:name/:page', array( 'controller' => 'books','action' => 'filteredByAuthor'),array('pass'=>array('name','page'),'name'=>'[a-zA-Z\-]+','page'=>'[0-9]+'));
  • наконец, когда страница и сортировка определены в URL (щелкнув по ссылкам sort , созданным paginator).

Например:

http://localhost/author/John-Doe/3/title/desc   (John Doe's books ordered desc by title)

Маршрут:

Router::connect('/author/:name/:page/:sort/:direction', array( 'controller' => 'books','action' => 'filteredByAuthor'),
            array('pass'=>array('name','page','sort','direction'),
            'name'=>"[a-zA-Z\-]+",
            'page'=>'[0-9]*',
            'sort'=>'[a-zA-Z\.]+',
            'direction'=>'[a-z]+',
            ));

в представлении вы должны сбросить URL, созданный paginator, потому что вы будете указывать свой собственный массив URL на контроллере:

Контроллер:

function filteredByAuthor($name = null,$page = null , $sort = null , $direction = null){
$option_url = array('controller'=>'books','action'=>'filteredByAuthor','name'=>$name);
if($sort){
    $this->passedArgs['sort'] = $sort;
    $options_url['sort'] = $sort;
}
if($direction){
    $this->passedArgs['direction'] = $direction;
    $options_url['direction'] = $direction;
}

Отправьте переменную $options_url в представление с помощью set () ... так что в представлении вам нужно сделать это:

Вид:

unset($this->Paginator->options['url']);
echo $this->Paginator->prev(__('« Précédente', true), array('url'=>$options_url), null, array('class'=>'disabled'));
echo $this->Paginator->numbers(array('separator'=>'','url'=>$options_url));
echo $this->Paginator->next(__('Suivante »', true), array('url'=>$options_url), null, array('class' => 'disabled'));

Теперь в ссылках сортировки вам нужно сбросить переменные 'sort' и 'direction'. Мы уже использовали их для создания ссылок на paginator, но если мы не удалим их, то функция sort () будет использовать их ... и мы не сможем отсортировать =)

$options_sort = $options_url;
unset($options_sort['direction']);
unset($options_sort['sort']);
echo $this->Paginator->sort('Produit <span>&nbsp;</span>', 'title',array('escape'=>false,'url'=>$options_sort)); 

надеюсь, это поможет =)

...