2015-05-20 34 views
10

Mam dwa problemy z przyjaznymi dla użytkownika adresami URL.Zend Framework - konfigurowanie przyjaznych dla użytkownika adresów URL za pomocą tras i wyrażeń regularnych

Mam router skonfigurować w następujący sposób:

  • Rzeczywisty URL http://www.example.com/course/view-batch/course_id/19
  • chcę bardziej przyjazny URL http://www.example.com/java-training/19

mam konfigurację następujących trasach w 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+" 

To działa perf ectly dobrze.

Teraz mam nową stronę - który zawiera opinie użytkowników na Java

  • Rzeczywisty URL jest http://www.example.com/course/view-reviews/course_id/19
  • chcę bardziej przyjazny URL http://www.example.com/java-reviews/19

I docenić ich nie jest możliwe, ponieważ jeden trasa jest już skonfigurowana, aby pasować do tego formatu.

Tak więc zastanawiałem się, czy można użyć wyrażenia regularnego i sprawdzić, czy tytuł zawiera "recenzje", a następnie użyć tej trasy.

Próbowałem tego podejścia, ale to nie działa. Zamiast tego otwiera stronę view-wsadowy:

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" 

Najbliżej mam to do pracy jest

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" 

Teraz gdybym wpisać adres URL http://www.example.com/reviews/19, akcja view-opinie jest wywoływana. Czy to możliwe - aby sprawdzić, czy tytuł zawiera słowo "recenzje" - czy należy przywołać tę trasę?


Wracając do mojego wcześniejszego trasie pracującego dla 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+" 

numer 19 jest id Oczywiście, które muszę w akcji wyciągnąć dane z bazy danych.

Ale kiedy strona jest wyświetlana, nie chcę, aby liczba 19 była widoczna.

Chcę tylko URL być http://www.example.com/java-training

Czy to możliwe?

Odpowiedz

0

na pytanie 1. Myślę, że możesz rozwiązać ten problem po prostu zmieniając trasę. Nie musisz: tytuł jako część trasy, zamiast tego może być zakodowany w twoim przypadku. Poleciłbym następującą konfigurację.

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+" 

Na pytanie 2. Jak to opisujesz, po prostu nie.

+0

Hey Jeremy - twarde kodowanie nie jest opcją, ponieważ "java-reviews" jest dla jednego kursu java - będzie 10 innych stron dla innych kursów, takich jak "php-reviews" - "python-reviews" itd. - więc to dlaczego szukałem regex, który po prostu szuka opinii słów w adresie URL - Dzięki – Gublooo

+0

Twoja opcja jest nadal twardym kodowaniem - ale po prostu mocno zakodowałeś koniec. 'route = /: title-reviews /: course_id' i' route = /: title-training /: course_id'. –

0

Dotyczy: Q1. Nie testowałem tego, ale mam nadzieję, że wskazuje ono kierunek, w którym chcesz iść.

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" 

Dotyczy: Q2. Myślę, że musisz przekazać użytkownika do innego (bez parametrów) adresu URL lub obsługiwać go za pośrednictwem javascript. Zobacz Modify the URL without reloading the page.

1

1) Można używać Route_Regex aby osiągnąć to, co chcesz

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) W odniesieniu do drugiego punktu nie mogę zobaczyć, jak to może być możliwe, jak jest.

Jedno można zrobić, choć jest użycie nazwy kursu, jeśli masz, aby wyświetlić adres url takich jak:

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

Byłoby bardzo łatwe przy użyciu tras i wymieniono powyżej.