2010-11-11 27 views
10

Je cherche actuellement à essayer de générer des URL/routage personnalisés en utilisant magento, actuellement j'ai défini une route par défaut dans config.xml dans le module local.Gernerate urls personnalisées dans Magento

<frontend> 
<routers> 
     <portfolios> 
      <use>standard</use> 
      <args> 
       <module>Custom_Portfolios</module> 
       <frontName>portfolios</frontName> 
      </args> 
     </portfolios> 
    </routers> 
    <default> 
     <router>portfolios</router> 
    </default> 
</frontend> 

Cela fonctionne actuellement avec le chemin url de/portefeuilles/index/action/chaîne personnalisée qui est la route par défaut magento. Ce que j'essaie de faire est d'avoir /portfolios/custom-string.html J'ai essayé d'utiliser une règle mod_rewrite sans succès, j'ai trouvé quelques références concernant l'utilisation d'un suffixe personnalisé de .html que j'ai ajouté à le même fichier config.xml.

<default><portfolios><seo><portfolios_url_suffix>.html</portfolios_url_suffix></seo></portfolios></default> 

Je l'ai regardé les documents de tempête alan par rapport à l'acheminement et l'a trouvé relevent les chemins de routage par défaut uniquement ou l'information est un peu hors du. Connaissez-vous la meilleure méthode pour contrôler le routage dans magento avec éventuellement un tutoriel facile à suivre et pertinent? Si c'est le cas, partagez: D many

Répondre

8

La manière de procéder est de réécrire l'URL. En fait, le suffixe config que vous avez trouvé est probablement utilisé par Mage_Catalog pour créer ses ensembles de réécritures. J'aborde cette particularité pour la première fois si cet extrait doit être pris avec une pincée de sel ...

// Creating a rewrite 
/* @var $rewrite Mage_Core_Model_Url_Rewrite */ 
$rewrite = Mage::getModel('core/url_rewrite'); 
$rewrite->setStoreId($store_id) 
     ->setIdPath('portfolios/'.$url_key) 
     ->setRequestPath('portfolios/'.$url_key.'.html') 
     ->setTargetPath('portfolios/index/action/id/'.$url_key) 
     ->setIsSystem(true) 
     ->save(); 

Une nouvelle réécriture est nécessaire pour chaque voie possible.

Editer; J'ai ajouté un setIdPath car cela pourrait être nécessaire.

+0

je vais examiner cette question plus, sauriez-vous la meilleure façon de faire référence d'un itinéraire dans le xml sinon je vais obtenir un message d'erreur 404 venir? – Ryan

+0

Désolé, je ne comprends pas la question. – clockworkgeek

+0

quand je frappe les portefeuilles/blah.html il est actuellement transmis à une page d'erreur 404, je présume que c'est parce que le routage n'existe pas et en tant que tel cause un problème, savez-vous où je devrais faire référence à ce code comme méthode dans le fichier xml ou aurais-je seulement besoin d'exécuter ce code une fois? – Ryan

0

La méthode la plus simple (lorsque vous n'avez pas besoin de générer automatiquement plusieurs URL) consiste à utiliser le module Url Rewrites intégré. Aller à admin backend ->Catalogue ->Url Réécrivez la gestion et configurez n'importe quelle réécriture d'URL que vous aimez.

+2

Salut, je crois que cela ne fonctionne réellement que lorsque l'URL est connue sans pré-créer des milliers de règles manuellement. merci pour votre imput si. – Ryan

15

code ci-dessous est non testé, mais devrait fonctionner

Si vous ne souhaitez pas définir de réécrire sur mesure pour chaque élément de protfolio, procédez comme suit:

  1. Écrivez votre classe routeur personnalisé prolongé à partir de Mage_Core_Controller_Varien_Router_Standard et mettre en oeuvre la méthode match:

    public function match(Zend_Controller_Request_Http $request) 
    { 
        $path = explode('/', trim($request->getPathInfo(), '/')); 
        // If path doesn't match your module requirements 
        if (count($path) > 2 && $path[0] != 'portfolios') { 
         return false; 
        } 
        // Define initial values for controller initialization 
        $module = $path[0]; 
        $realModule = 'Custom_Portfolios'; 
        $controller = 'index'; 
        $action = 'action'; 
        $controllerClassName = $this->_validateControllerClassName(
         $realModule, 
         $controller 
        );    
        // If controller was not found 
        if (!$controllerClassName) { 
         return false; 
        }    
        // Instantiate controller class 
        $controllerInstance = Mage::getControllerInstance(
         $controllerClassName, 
         $request, 
         $this->getFront()->getResponse() 
        ); 
        // If action is not found 
        if (!$controllerInstance->hasAction($action)) { 
         return false; // 
        }    
        // Set request data 
        $request->setModuleName($module); 
        $request->setControllerName($controller); 
        $request->setActionName($action); 
        $request->setControllerModule($realModule);    
        // Set your custom request parameter 
        $request->setParam('url_path', $path[1]); 
        // dispatch action 
        $request->setDispatched(true); 
        $controllerInstance->dispatch($action); 
        // Indicate that our route was dispatched 
        return true; 
    } 
    
  2. Définissez votre routeur personnalisé dans config.xml:

    <stores> 
        <default> 
         <web> 
          <routers>        
           <your_custom> 
            <area>frontend</area> 
            <class>Custom_Portfolios_Controller_Router_Custom</class> 
           </your_custom> 
          </routers> 
         </web> 
        </default> 
    </stores> 
    
  3. Profitez de votre routage personnalisé dans Magento :)

+0

J'ai trouvé la solution ci-dessus a travaillé pour mes besoins et en tant que tel n'a pas utilisé celui-ci. Merci d'avoir pris le temps de répondre à cette question. – Ryan

+1

Et n'oubliez pas de définir le nom de l'itinéraire pour la requête - il est utilisé pour le handle de disposition: $ request-> setRouteName ('someRouteName') –