1

我在为我的博客模块创建自定义路由时遇到了一些麻烦(我正在这样做以更好地学习 Magento)。

到目前为止我所做的:创建了一个自定义表,其中还包含所需的 slug。在我的 config.xml 中添加了以下内容

<default>
    <web> <!-- what does this represent??? -->
        <routers>
            <namespace_blog_list>
                <area>frontend</area>
                <class>Namespace_Blog_Controller_Router</class>
            </namespace_blog_list>
        </routers>
    </web>
</default>

所以,我创建了Namespace_Blog_Controller_Router类,并从 CMS 控制器复制了match()方法,但不太确定如何修改它。

这是我到目前为止所拥有的:

// $identifier is 'blog/view/my-slug-name';
$parts = explode('/', $identifier);
    if ($parts[0] == 'blog') {
        $post = Mage::getModel('namespace_blog/post');
        $routeInformation = $post->checkIdentifier($identifier);

        $request->setModuleName('namespace_blog')
            ->setControllerName($routeInformation['controller'])
            ->setActionName($routeInformation['action']);

        if (isset($routeInformation['params']) && count($routeInformation['params'])) {
            foreach ($routeInformation['params'] as $key => $param) {
                $request->setParam($key, $param);
            }
        }

        $request->setAlias(
            Mage_Core_Model_Url_Rewrite::REWRITE_REQUEST_PATH_ALIAS,
            $identifier
        );
        return true;
    }

PS:$post->checkIdentifier 返回以下数组:

array(
    'controller' => 'index',
    'action' => 'index',
    'params' => array(
        'id' => 3
    )
)

问题是它进入了一个无限循环,我发现了以下报告:

a:5:{i:0;s:52:"Front controller reached 100 router match iterations";i:1;s:337:"#0 /var/www/app/code/core/Mage/Core/Controller/Varien/Front.php(183): Mage::throwException('Front controlle...')
#1 /var/www/app/code/core/Mage/Core/Model/App.php(354): Mage_Core_Controller_Varien_Front->dispatch()
#2 /var/www/app/Mage.php(683): Mage_Core_Model_App->run(Array)
#3 /var/www/index.php(87): Mage::run('', 'store')
#4 {main}";s:3:"url";s:21:"/index.php/blog/index";s:11:"script_name";s:10:"/index.php";s:4:"skin";s:7:"default";}`

有任何想法吗?这是最好的方法,还是有其他推荐的解决方案?

谢谢,

4

1 回答 1

2

CMS 页面路由是在 controller_front_init_routers 事件的帮助下添加的。

首先你需要为你的模块定义标准的前端路由

<config>
    <frontend>
        <routers>
            <mymodule>
                <use>standard</use>
                <args>
                    <module>My_Module</module>
                    <frontName>mymodule</frontName>
                </args>
            </mymodule>
        </routers>
    </frontend>
</config>

这允许您以http://example.com/mymodule/controller/action/的形式发送请求

看完这个Mage_Core_Controller_Varien_Front::init()。在此方法中,magento 收集standardadmin路由(这些是前端和管理路由的默认设置)。当这些路由器添加 mageto 触发事件controller_front_init_routers并使用此全局事件时,您可以注册自己的路由:

<config>
    <global>
        <events>
            <controller_front_init_routers>
                <observers>
                    <mymodule>
                        <class>My_Module_Controller_Router</class>
                        <method>initControllerRouters</method>
                    </mymodule>
                </observers>
            </controller_front_init_routers>
        </events>
    </global>
</config>

在路线中,您应该检查标识符是否符合您的需求并致电您的控制器

class My_Module_Controller_Router extends Mage_Core_Controller_Varien_Router_Abstract
{

    /**
     * Inject new route into the list of routes
     *
     * @param Varien_Event_Observer $observer
     */
    public function initControllerRouters($observer)
    {
        $front = $observer->getEvent()->getFront();

        $route = new My_Module_Controller_Router();
        $front->addRouter('myroute', $route);
    }

    /**
     * Compare current path with the route rules
     *
     * @param Zend_Controller_Request_Http $request
     * @return boolean
     */
    public function match(Zend_Controller_Request_Http $request)
    {

        if (!Mage::app()->isInstalled()) {
            Mage::app()->getFrontController()->getResponse()
                    ->setRedirect(Mage::getUrl('install'))
                    ->sendResponse();
            return FALSE;
        }

        $route = 'myroute';

        $identifier = $request->getPathInfo();

        if (substr(str_replace("/", "", $identifier), 0, strlen($route)) == $route) {
            if (str_replace("/", "", $identifier) == $route) {
                $request->setModuleName('mymodule')
                        ->setControllerName('index')
                        ->setActionName('index');
                return TRUE;
            }

            $suffix = Mage::helper('catalog/product')->getProductUrlSuffix();
            $identifier = substr_replace($request->getPathInfo(), '', 0, strlen("/" . $route . "/"));
            $identifier = str_replace($suffix, '', $identifier);

            // here we make some check to make sure we have requested page
            $mymodule = Mage::getModel('mymodule/mymodule');
            $module_id = $mymodule->checkIdentifier($identifier, Mage::app()->getStore()->getId());
            if (!$module_id) {
                return FALSE;
            }

            // send request to the module's controller
            $request->setModuleName('mymodule')
                    ->setControllerName('index')
                    ->setActionName('view')
                    ->setParam('id', $module_id);

            return TRUE;
        } else {
            return FALSE;
        }
    }

}

就这样。

<default>
    <web>
        <default>
            <cms_home_page>home</cms_home_page>
            <cms_no_route>no-route</cms_no_route>
            <cms_no_cookies>enable-cookies</cms_no_cookies>
            <front>cms</front>
            <no_route>cms/index/noRoute</no_route>
            <show_cms_breadcrumbs>1</show_cms_breadcrumbs>
        </default>
    </web>
</default>

这是 cms 模块的默认部分。您可以在系统 - 配置 - Web - 默认页面下的管理员中找到这些设置

于 2013-01-14T16:42:03.250 回答