2010-12-08 4 views
0

Je suis en train de créer un itinéraire Zend_Controller_Router_Route_Regex pour traiter les URL sous la forme suivante:Route Zend Regex aider

search?q=chicken/page=2 où le premier motif d'expression régulière serait chicken et deuxième serait 2. Quant à la deuxième partie où page=2, je veux le rendre facultatif s'il s'agit de la première page, c'est page=1. Donc, un autre URL tel que search?q=chicken serait également valide et est équivalent à search?q=chicken/page=1.

Voici ma tentative, mais sans succès, mais pour vous donner une meilleure idée de ce que j'essaie de faire.


     $route = new Zend_Controller_Router_Route_Regex(    
      'search\?q=([a-zA-Z0-9]+)(?:/page=(\d+))', 
      array( 
       'page'=> '1', 
      'module' => 'default', 
      'controller' => 'search', 
      'action' => 'index'), 
      array(1 => 'query', 2 => 'page'), 
      'search?=%s/page=%d'); 
     $router->addRoute('search', $route); 

Le problème ici est que je ne peux pas composer la regex correcte.

Merci d'avance.

EDIT # 1

La regex correcte, comme l'a souligné MA4, est 'search\?q=([a-zA-Z0-9]+)(?:/page=(\d+))?'

Le vrai problème est pointé par Darryl. Voici un peu plus d'informations pour mettre les choses en perspective.

Ma recherche zone de texte et le bouton

<form action="/search" method="get"> 
      <input type="text" name="q" /> 
      <input type="submit" value="Search" /> 
    </form> 

Chaque fois que j'appuie sur le bouton search, je reçois la recherche? Q = demande [texte]. Comment puis-je le forcer à passer par la route de match regex?

Voici ce que je veux faire, mais le code ne fonctionne pas

if($this->getRequest()->getParam('query')){ 
     // redirect success 
    } else { 
     $url = "search?q=" . $this->_getParam('q');    
     $this->_redirect(route('search'), array('code' => 301)); 
    } 

Répondre

0

/search?q=chicken/page=2 est analysable par le pas de routeur Zend cadres. Le routeur ne verra que /search.

Le routeur s'appuie sur les informations de chemin fournies par le serveur et tout ce qui suit? est la chaîne de requête.

Vous devez utiliser un chemin comme celui-ci:

/search/[word]  (default page 1) 
/search/[word]/[page] 

Dans ce cas, votre regex deviendrait beaucoup plus simple.

+0

Merci pour les commentaires, je sais maintenant pourquoi mon bouton de recherche ne fonctionne pas. J'ai édité ma question originale pour plus de détails. – nobody

+0

Ma réponse est toujours la réponse. Ce que vous essayez de faire n'est pas possible avec la chaîne de requête '/ search? Q = chicken/page = 2' résultera en un pathinfo'/search' et un seul paramètre $ _GET de 'q' ayant la valeur' chicken/page = 2' - le routeur Zend Framework utilise le pathinfo UNIQUEMENT. –

0

faire la deuxième partie en optionnel ajoutant un ? après:

search\?q=([a-zA-Z0-9]+)(?:/page=(\d+))? 
+0

Merci pour l'entrée, l'extra '?' Corrige l'expression régulière, mais mon routage ne fonctionne toujours pas pour la raison indiquée par Darryl. – nobody

Questions connexes