1

ブログ モジュールのカスタム ルートの作成に問題があります (これは、Magento をよりよく学習するために行っています)。

これまでに行ったこと: 必要なスラッグも含むカスタム テーブルを作成しました。私の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>

そのため、クラスを作成し、CMS コントローラーからメソッドNamespace_Blog_Controller_Routerをコピーしました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が収集standardしてadminルーティングします(これらはフロントエンドおよび管理者ルーティングのデフォルトです)。これらのルーターが追加されると、mageto firesイベントが発生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 に答える