问题
I am currently looking at trying to generate custom urls/routing using magento, currently I have set a default route in config.xml within the local module.
<frontend>
<routers>
<portfolios>
<use>standard</use>
<args>
<module>Custom_Portfolios</module>
<frontName>portfolios</frontName>
</args>
</portfolios>
</routers>
<default>
<router>portfolios</router>
</default>
</frontend>
This currently works with the url path of /portfolios/index/action/custom-string which is the magento default route. What I am trying to achieve is to have /portfolios/custom-string.html I have attempted to use a mod_rewrite rule with no success, I have found some references in relation to utilising a custom suffix of .html which I have added to the same config.xml file.
<default><portfolios><seo><portfolios_url_suffix>.html</portfolios_url_suffix></seo></portfolios></default>
I have looked at the alan storm docs in relation to routing and found it relevent to the default routing paths only or the information is a little out-dated.
Do you know the best method to control the routing within magento with possibly an easy to follow and relevent tutorial? if so please share :D many
回答1:
The way to do this is with an URL rewrite. In fact, the suffix config you found is probably used by Mage_Catalog to create it's sets of rewrites. I'm approaching this particular feature for the first time so this snippet should be taken with a pinch of salt...
// 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();
A new rewrite is needed for each possible path.
Edit; I've added a setIdPath
because it might be necessary.
回答2:
Code below is untested, but should work
If you don't want to define custom rewrite for each protfolio item, just follow these steps:
Write your custom router class extended from Mage_Core_Controller_Varien_Router_Standard and implement
match
method: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; }
Define your custom router 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>
Enjoy your custom routing in Magento :)
回答3:
The easiest method (when you do not need to auto-generate many urls) is to use built-in Url Rewrites module. Go to admin backend -> Catalog -> Url Rewrite management and setup any url rewrite you like.
来源:https://stackoverflow.com/questions/4154521/gernerate-custom-urls-within-magento