上記のコードはある程度機能するため、もう少し理解と説明が必要です。過去10時間ほどこれを使ってツールを使った後、私が思いついたのは次のとおりです。
ファイル:config.xml
<?xml version="1.0"?>
<config>
<modules>
<AJW_Bestselling>
<version>1.6.0.0.1</version>
</AJW_Bestselling>
</modules>
<frontend>
<routers>
<bestselling>
<use>standard</use>
<args>
<module>AJW_Bestselling</module>
<frontName>bestsellers</frontName>
</args>
</bestselling>
</routers>
<layout>
<updates>
<bestselling>
<file>bestselling.xml</file>
</bestselling>
</updates>
</layout>
</frontend>
<global>
<events>
<controller_front_init_routers>
<observers>
<bestselling>
<class>AJW_Bestselling_Controller_Router</class>
<method>initControllerRouters</method>
</bestselling>
</observers>
</controller_front_init_routers>
</events>
<models>
<bestselling>
<class>AJW_Bestselling_Model</class>
</bestselling>
</models>
<blocks>
<bestselling>
<class>AJW_Bestselling_Block</class>
</bestselling>
</blocks>
<helpers>
<bestselling>
<class>AJW_Bestselling_Helper</class>
</bestselling>
</helpers>
</global>
ファイル:Controller/Router.php
<?php
class AJW_Bestselling_Controller_Router extends Mage_Core_Controller_Varien_Router_Abstract
{
private static $_module = 'bestsellers';
private static $_realModule = 'AJW_Bestselling';
private static $_controller = 'index';
private static $_controllerClass = 'AJW_Bestselling_Controller_Index';
private static $_action = 'view';
public function initControllerRouters($observer)
{
$front = $observer->getEvent()->getFront();
$front->addRouter('bestselling', $this);
}
public function match(Zend_Controller_Request_Http $request)
{
$this->_request = $request;
$identifier = trim($request->getPathInfo(), '/');
//If Magento Is Not Installed Reroute To Installer
if (!Mage::isInstalled()) {
Mage::app()->getFrontController()->getResponse()
->setRedirect(Mage::getUrl('install'))
->sendResponse();
exit;
}
//If we dont match our router then let another router take over
if(!substr($identifier,0,strlen('bestsellers')) == 'bestsellers'){
return false;
}
//If we do match the our router then lets add some data and dispatch our
controller
else{
$route_params = str_replace ( "bestsellers/" , "" , $identifier );
$rewrite = Mage::getModel('core/url_rewrite');
$rewrite->setStoreId(1);
$rewrite->loadByRequestPath($route_params);
$category_route = $rewrite->getIdPath();
//Check to see if the route exists before we do anything else
if(!$category_route != ""){
return false;
}//Otherwise send the parameters to the request
else{
$id = str_replace ( "category/" , "" , $category_route );
$this->_request->setParam('id',$id);
}
}
$this->_setRequestRoute();
return true;
}
protected function _setRequestRoute()
{
$this->_request->setModuleName(self::$_module)
->setControllerName(self::$_controller)
->setActionName(self::$_action)
->setControllerModule(self::$_realModule);
return true;
}
}
ファイル:controllers/IndexController.php
class AJW_Bestselling_IndexController extends Mage_Core_Controller_Front_Action{
public function indexAction(){
echo "This is the index controller";
die();
}
public function viewAction(){
$this->loadLayout();
$this->renderLayout();
}
}
mysite.com/bestsellers/ にアクセスすると、ルーターがインデックス コントローラーをロードします。ただし、bestsellers/some/category/url.html にアクセスすると、viewAction が起動され、コントローラが使用するためにカテゴリ ID が送信されます。
この背後にある概念は、.com の後の URL の最初の部分に基づいて、各カテゴリにコンテンツを表示する機能です。いくつかのアイデアは、ベストセラー、最も推奨される、トップレビュー、カテゴリの質問など..特定のカテゴリとの多対一 (または多) の関係。
また、AJW_Bestselling_Controller_Router のパラメーターを条件付きで設定することにより、この同じモジュールを複数のモジュールのルーターとして使用できる可能性があることに注意してください。