2010-11-19 7 views
0

Ich bin neu in cakephp ... und ich habe eine Seite mit einer URL folgt aus:CakePhp1.3 Paginator-Ziel-URL ändern?

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

so die Steuerung'books' ist, die Aktion ist'filteredByAuthor' und'John-Doe' a Parameter .. aber die uRL sieht hässlich aus, so dass ich eine Strecke wie diese hinzugefügt haben:

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

und jetzt ist mein Link lautet:

http://localhost/author/John-Doe 

das Problem ist, dass die Ansicht, die einen paginator hat und wenn i ändere das Seite (indem Sie auf die nächste oder vorherige Schaltfläche klicken) .. die paginator wird mein Routing nicht betrachten ... und wird die URL dieses

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

den Code auf meiner Sicht nur ändern:

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

Die Dokumentation sagt nichts über die Vermeidung dieser und ich habe Stunden damit verbracht, den Paginators Quellcode und API zu lesen .. und am Ende möchte ich nur meine Links in etwa so aussehen: (mit der Art und Richtung enthalten auf der URL)

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

Ist das möglich und wie?

Antwort

1

hassen meine eigene Frage zu beantworten ... aber dies könnte einige Zeit in einem anderen developper sparen =) (alles darum, gutes Karma ist)

i herausgefunden, dass Sie eine „Optionen“ Array das passieren können Paginator, und innerhalb dieses Arrays können Sie die URL angeben (ein Array von: Controller, Aktion und Parameter), die der Paginator verwenden wird, um die Links zu erstellen. Sie müssen also alle möglichen Routen in die Datei routes.php schreiben. Grundsätzlich gibt es drei Möglichkeiten:

  • , wenn die „Seite“ nicht
  • definiert

Zum Beispiel:

http://localhost/author/John-Doe 

der paginator davon aus, dass das es ist die erste Seite. Die entsprechende Route wäre:

Router::connect('/author/:name', array('controller' => 'books','action' => 'filteredByAuthor'),array('pass'=>array('name'),'name'=>'[a-zA-Z\-]+')); 
  • , wenn die "Seite" ist
  • definiert

Beispiel für:

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

Der Weg wäre:

Router::connect('/author/:name/:page', array('controller' => 'books','action' => 'filteredByAuthor'),array('pass'=>array('name','page'),'name'=>'[a-zA-Z\-]+','page'=>'[0-9]+')); 
  • schließlich, wenn die Seite und die Sortierung auf der URL definiert ist (indem Sie auf die sort Links klicken, die vom Paginator erstellt wurden).

Zum Beispiel:

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

Die Route ist:

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]+', 
      )); 

auf der Ansicht, die Sie die URL durch das paginator erstellt unscharf zu schalten haben, weil Sie Ihre eigene URL Array angeben werden auf dem Controller:

Controller:

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; 
} 

die Variable $options_url zur Ansicht schicken Satz mit() ... so in der Ansicht Sie dies tun müssen, um:

Ausblick:

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')); 

nun auf die Sortier-Links, die Sie brauchen, um die Variablen 'sort' und 'direction' zu deaktivieren. Früher haben wir sie bereits die Links auf der paginator erstellen, aber wenn wir löschen nicht sie, dann die sort() Funktion verwenden sie ... und wir wont = zu sortieren fähig sein)

$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)); 

hoffe, das hilft =)