2015-05-20 12 views
10

Ho due problemi con gli URL user-friendly.Zend Framework - impostazione di URL user-friendly con route ed espressioni regolari

Ho un router configurato come segue:

  • L'URL reale è http://www.example.com/course/view-batch/course_id/19
  • voglio un URL amichevole http://www.example.com/java-training/19

Ho installato il seguente itinerario in application.ini:

resources.router.routes.viewbatchcourse.route = "/:title/:course_id/" 
resources.router.routes.viewbatchcourse.defaults.controller = course 
resources.router.routes.viewbatchcourse.defaults.action = view-batch 
resources.router.routes.viewbatchcourse.reqs.course_id = "\d+" 

Questo funziona perf molto bene.

ora ho una nuova pagina - che contiene commenti su Java

  • L'URL reale è http://www.example.com/course/view-reviews/course_id/19
  • Voglio un URL amichevole http://www.example.com/java-reviews/19

mi rendo conto suo non è possibile perché uno percorso è già configurato per abbinare quel formato.

Quindi stavo pensando se è possibile utilizzare regex e controllare se il titolo contiene "recensioni", quindi utilizzare questo percorso.

Ho provato questo approccio, ma non funziona. Invece, si apre la pagina di visualizzazione-batch:

resources.router.routes.viewreviews.type = "Zend_Controller_Router_Route_Regex" 
resources.router.routes.viewreviews.route = "/:title/:course_id" 
resources.router.routes.viewreviews.defaults.controller = "course" 
resources.router.routes.viewreviews.defaults.action = "view-reviews" 
resources.router.routes.viewreviews.reqs.course_id = "\d+" 
resources.router.routes.viewreviews.reqs.title = "\breviews\b" 

Il più vicino che ho ottenuto questo al lavoro è

resources.router.routes.viewreviews.route = "/:title/:course_id" 
resources.router.routes.viewreviews.defaults.controller = "course" 
resources.router.routes.viewreviews.defaults.action = "view-reviews" 
resources.router.routes.viewreviews.reqs.course_id = "\d+" 
resources.router.routes.viewreviews.reqs.title = "reviews" 

Ora se entro l'URL http://www.example.com/reviews/19, allora l'azione vista-recensioni viene chiamato. E 'possibile - per verificare se il titolo contiene la parola "recensioni" - allora questa rotta dovrebbe essere invocata?


Tornando alla mia precedente percorso di lavoro per http://www.example.com/java-training/19:

resources.router.routes.viewbatchcourse.route = "/:title/:course_id/" 
resources.router.routes.viewbatchcourse.defaults.controller = course 
resources.router.routes.viewbatchcourse.defaults.action = view-batch 
resources.router.routes.viewbatchcourse.reqs.course_id = "\d+" 

Il numero 19 è l'ID corso, che ho bisogno nell'atto di tirare i dettagli dal database.

Ma quando viene visualizzata la pagina, non voglio che il numero 19 sia visibile.

Voglio solo l'URL per essere http://www.example.com/java-training

è possibile?

risposta

0

per la domanda 1. Penso che sia possibile risolvere questo problema semplicemente alterando il percorso. Non è necessario avere: titolo come parte del percorso, invece può essere codificato nel tuo caso. Consiglierei la seguente configurazione.

resources.router.routes.viewbatchcourse.route = "/java-training/:course_id/" 
resources.router.routes.viewbatchcourse.defaults.controller = course 
resources.router.routes.viewbatchcourse.defaults.action = view-batch 
resources.router.routes.viewbatchcourse.defaults.title = java-training 
resources.router.routes.viewbatchcourse.reqs.course_id = "\d+" 

resources.router.routes.viewreviews.route = "/java-reviews/:course_id/" 
resources.router.routes.viewreviews.defaults.controller = course 
resources.router.routes.viewreviews.defaults.action = view-reviews 
resources.router.routes.viewreviews.defaults.title = java-reviews 
resources.router.routes.viewreviews.reqs.course_id = "\d+" 

Per la domanda 2. Come la descrivi, semplicemente no.

+0

Hey Jeremy - hard coding non è un'opzione perché "java-reviews" è per un corso java - ci saranno altre 10 pagine per altri corsi come "php-reviews" - "python-reviews" ecc. perché stavo cercando una regex che cerca le recensioni di parole nell'URL - Grazie – Gublooo

+0

L'opzione è ancora difficile da codificare - ma basta codificare il codice alla fine. 'route = /: title-reviews /: course_id' e' route = /: title-training /: course_id'. –

0

Re: Q1. Non ho provato questo, ma spero che ti stia indicando la direzione in cui vuoi andare.

resources.router.routes.viewreviews.type = "Zend_Controller_Router_Route_Regex" 
resources.router.routes.viewreviews.route = "(.+)-reviews/(\d+)" 
resources.router.routes.viewreviews.defaults.controller = "course" 
resources.router.routes.viewreviews.defaults.action = "view-reviews" 
resources.router.routes.viewreviews.map.1 = "title" 
resources.router.routes.viewreviews.map.2 = "course_id" 

Re: Q2. Penso che avresti bisogno di inoltrare l'utente ad un altro URL (senza parametri) o gestirlo tramite javascript. Vedi Modify the URL without reloading the page.

1

1) È possibile utilizzare Route_Regex per ottenere ciò che si vuole

protected function _initRoutes() 
{ 
    $router = Zend_Controller_Front::getInstance()->getRouter(); 

    $route = new Zend_Controller_Router_Route_Regex(
     '([a-zA-Z]+)-reviews/(\d+)', 
     array(
      'module' => 'default', 
      'controller' => 'course', 
      'action'  => 'view-reviews' 
     ), 
     array(
      1 => 'language', 
      2 => 'course_id', 
     ) 
    ); 
    $router->addRoute('review', $route); 

    $route = new Zend_Controller_Router_Route_Regex(
     '([a-zA-Z]+)-training/(\d+)', 
     array(
      'module' => 'default', 
      'controller' => 'course', 
      'action'  => 'view-batch' 
     ), 
     array(
      1 => 'language', 
      2 => 'course_id', 
     ) 
    ); 
    $router->addRoute('training', $route);   
} 

2) Per il secondo punto non riesco a vedere come possa essere possibile, come è.

Una cosa che si potrebbe fare anche se è quello di utilizzare il nome del corso, se ne avete uno, per visualizzare un URL del tipo:

www.xyz.com/java-training/my-awesome-course-19 
www.xyz.com/java-training/19/my-awesome-course 

Sarebbe abbastanza facile utilizzando i percorsi i citati sopra.

Problemi correlati