2010-11-11 16 views
10

Actualmente estoy tratando de generar direcciones urls/routing personalizadas usando magento, actualmente he establecido una ruta predeterminada en config.xml dentro del módulo local.Urnas personalizadas de Gernerate dentro de Magento

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

Esta actualmente trabaja con la ruta URL del/carteras/index/acción/medida cadena que es la ruta por defecto Magento. Lo que estoy tratando de lograr es tener /portfolios/custom-string.html He intentado utilizar una regla mod_rewrite sin éxito, he encontrado algunas referencias en relación con la utilización de un sufijo personalizado de .html que he agregado a el mismo archivo config.xml.

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

He mirado en los documentos Alan tormenta en relación con el enrutamiento y la encontró relevante sólo a las rutas de enrutamiento por defecto o la información es un poco fuera de fecha.

¿Conoces el mejor método para controlar el enrutamiento dentro de magento con posiblemente un tutorial fácil de seguir y de seguir? de ser así, comparta: D many

Respuesta

8

La forma de hacerlo es con una reescritura de URL. De hecho, la configuración de sufijo que encontró probablemente sea utilizada por Mage_Catalog para crear sus conjuntos de reescrituras. Me acerco a esta característica particular, por primera vez, por lo que este fragmento se debe tomar con una pizca de sal ...

// 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(); 

Se necesita una nueva reescritura para cada ruta posible.

Editar; He agregado un setIdPath porque podría ser necesario.

+0

voy a investigar más a fondo, puedes saber la mejor manera de hacer referencia a ella desde una ruta dentro del xml; de lo contrario, ¿aparecerá un mensaje de error 404? – Ryan

+0

Lo siento, no entiendo la pregunta. – clockworkgeek

+0

cuando pulso portfolios/blah.html actualmente se reenvía a una página de error 404, supongo que esto es porque el enrutamiento no existe y, como tal, está causando un problema, ¿sabe de dónde necesitaría hacer referencia a este código como un método dentro del archivo xml o solo tendré que ejecutar este código una vez? – Ryan

0

El método más fácil (cuando no necesita generar automáticamente muchas direcciones URL) es utilizar el módulo de Reescritura de Url incorporado. Vaya a admin back-end ->Catálogo ->Url Reescriba la administración y configure cualquier URL que reescriba.

+2

Hola, creo que esto solo funcionará realmente cuando se conozca la URL sin pre-crear miles de reglas de forma manual. gracias por tu imput sin embargo. – Ryan

15

código de abajo no se ha probado, pero debería funcionar

Si no desea definir personalizada para cada elemento reescribir protfolio, sólo tienes que seguir estos pasos:

  1. guardar la clase personalizada del enrutador extendido desde Mage_Core_Controller_Varien_Router_Standard e implementar match método:

    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. Definir el router costumbre en 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. Disfrute de su enrutamiento personalizado en Magento :)

+0

Encontré que la solución anterior funcionaba para mis necesidades y, como tal, no usé esta. Gracias por tomarse su tiempo para responder esta pregunta. – Ryan

+1

Y no se olvide de establecer el nombre de la ruta para la solicitud: se está utilizando para el manejador de diseño: $ request-> setRouteName ('someRouteName') –

Cuestiones relacionadas