2010-11-11 8 views
10

Attualmente sto cercando di generare URL/routing personalizzati usando Magento, attualmente ho impostato una route predefinita in config.xml all'interno del modulo locale.Gernerate url personalizzati all'interno di Magento

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

Questa Attualmente collabora con il sentiero URL del/portafogli/index/action/custom-string che è il percorso di default di Magento. Quello che sto cercando di ottenere è /portfolios/custom-string.html Ho tentato di usare una regola mod_rewrite senza successo, ho trovato alcuni riferimenti in relazione all'utilizzo di un suffisso personalizzato di .html che ho aggiunto a lo stesso file config.xml.

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

Ho guardato la documentazione Alan tempesta in relazione al percorso e l'ho trovato relevent solo ai percorsi di default di routing o l'informazione è un po 'fuori-datato.

Conoscete il metodo migliore per controllare il routing all'interno di Magento con un tutorial forse facile da seguire e pertinente? se così si prega di condividere: D molti

risposta

8

Il modo per farlo è con una riscrittura di URL. In effetti, la configurazione del suffisso trovata è probabilmente utilizzata da Mage_Catalog per creare i suoi set di riscritture. Mi sto avvicinando questa particolare caratteristica per la prima volta in modo da questo frammento dovrebbe essere preso con un pizzico di sale ...

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

una nuova riscrittura è necessaria per ogni possibile percorso.

Modifica; Ho aggiunto un setIdPath perché potrebbe essere necessario.

+0

farò indagare ulteriormente, vuoi conoscere il modo migliore per fare riferimento da un percorso all'interno dell'XML, altrimenti otterrò un messaggio di errore 404? – Ryan

+0

Mi dispiace, non capisco la domanda. – clockworkgeek

+0

quando raggiungo i portfolios/blah.html attualmente viene inoltrato a una pagina di errore 404, presumo che questo non sia il routing esistente e come tale causa un problema, sapete dove avrei bisogno di fare riferimento a questo codice come metodo all'interno del file xml o avrei solo bisogno di eseguire questo codice una volta? – Ryan

0

Il metodo più semplice (quando non è necessario generare automaticamente molti URL) consiste nell'utilizzare il modulo Url Rewrites incorporato. Vai al backend di amministrazione ->Catalogo ->Url Gestione riscrittura e impostare qualsiasi riscrittura di URL che ti piace.

+2

Ciao, credo che funzionerà solo quando l'url è noto senza pre-creare manualmente migliaia di regole. grazie per il tuo imput. – Ryan

15

codice qui sotto non è testato, ma dovrebbe funzionare

Se non si desidera definire personalizzati riscrivere per ogni elemento protfolio, basta seguire questi passaggi:

  1. Scrivi la classe di router personalizzato esteso da Mage_Core_Controller_Varien_Router_Standard e attuare match metodo:

    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. Definire il router personalizzata in 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. Godetevi il vostro percorso personalizzato in Magento :)

+0

Ho trovato la soluzione di cui sopra ha funzionato per le mie esigenze e come tale non ha usato questo. Grazie per il tempo dedicato a rispondere a questa domanda. – Ryan

+1

E non dimenticare di impostare il nome del percorso per la richiesta: viene utilizzato per l'handle del layout: $ request-> setRouteName ('someRouteName') –

Problemi correlati