2011-09-20 3 views
0

Je veux créer urls SEO friendly dans mon application Zend Framework mais comment est la syntaxe correcte pour ceci:SEO friendly urls avec le routeur Zend

$newsroute = new Zend_Controller_Router_Route(
    'news/:action/:id_:title', 
    array('controller' => 'news')); 

: id_: le titre ne fonctionne évidemment pas depuis Zend didn Ne sais pas que _ est un séparateur? Dois-je utiliser le routeur regex pour cela ou fonctionne-t-il avec le routeur normal?

Répondre

2

En effet, une route regex ferait l'affaire.

Si pour une raison quelconque vous ne voulez pas utiliser la route regex, il existe une solution simple, via un plugin de contrôleur frontal:

//replace the :id and :title params with a single one, mapping them both 
$newsroute = new Zend_Controller_Router_Route(
     'news/:action/:article', 
     array('controller' => 'news') 
    ); 

// in a front controller plugin, you extract the Id form the article param 
function function dispatchLoopStartup(Zend_Controller_Request_Abstract $request) { 

    if($request->getParam('article', false)){ 

     $slug = $request->getParam('article'); 
     $parts = array(); 
     preg_match('/^(\d+)/', $slug, $parts); 

     // add the extracted id to the request as if there where an :id param 
     $request->setParam('id', $parts[0]); 
    } 
} 

Bien sûr, vous pouvez également extraire le titre de la même façon si vous besoin de ça.

Ne pas oublier de construire votre « article » quand vous voulez param pour générer urls:

$this->url(array('article' => $id.'_'.$title)); 
2

Pour éviter de traiter avec les liens contiennent des caractères spéciaux, vous pouvez utiliser ce plugin pour Zend Framework.

https://github.com/btlagutoli/CharConvert

$filter2 = new Zag_Filter_CharConvert(array(
       'onlyAlnum' => true, 
       'replaceWhiteSpace' => '-' 
      )); 
echo $filter2->filter('éééé ááááá ? 90 :');//eeee-aaaaa-90 

cela peut vous aider à composer avec des chaînes dans d'autres langues

+0

lien à droite: https://github.com/agutoli/CharConvert – JellyBelly