Magento如何在扩展覆盖根布局节点时从控制器触发404重定向

Dom*_*Dom 7 layout magento

我已经为Magento编写了一个扩展,它将在某些情况下从控制器启动404重定向.控制器中导致404重定向的代码是:

$this->getResponse()->setHeader('HTTP/1.1','404 Not Found');
$this->getResponse()->setHeader('Status','404 File not found');
$pageId = Mage::getStoreConfig('web/default/cms_no_route');
if (!Mage::helper('cms/page')->renderPage($this, $pageId)) {
    $this->_forward('defaultNoRoute');
}
Run Code Online (Sandbox Code Playgroud)

可通过URL www.mysite.com/mymodule/index/action?name=value访问此代码,并根据"值"触发重定向.

但是,因为我的模块包含覆盖根节点的布局更新:

<layout version="0.1.0">
    <mynamespace_mymodule_index_action>
        <block type="mymodule/list" name="root" template="mynamespace/mymodule/list.phtml" output="toHtml" />
    </mynamespace_mymodule_index_action>
</layout>
Run Code Online (Sandbox Code Playgroud)

404重定向显示一个空白(白色)页面,其中包含以下HTML:

<head>
</head>
<body>
    <div id="outerdivshade">    
        <div id="outerdivpadding">
            <div class="wrapper">
                <div class="page">
                    <div class="main-container col2-left-layout">
                        <div class="main">
                            <div class="col-main"></div>
                            <div class="col-left sidebar"></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</body>
Run Code Online (Sandbox Code Playgroud)

我猜测通过更新根节点,我留下了一个布局结构,重定向代码不能用来创建完整的404页面.

通过删除if语句并只留下代码:

$this->_forward('defaultNoRoute');
Run Code Online (Sandbox Code Playgroud)

一切正常,但我不明白这样做的利弊.

有趣的是,上面的代码在Magento 1.6上正常工作,但在1.7上没有.

我很欣赏任何关于包含工作404重定向的正确方法的评论,但仍然允许我在布局中使用我自己的根节点.

谢谢

smi*_*gle 22

对于显示404页面,您可以调用norouteAction的的Mage_Core_Controller_Varien_Action类.

$this->norouteAction();
return;
Run Code Online (Sandbox Code Playgroud)

可以在后端编辑404页面.该页面有标题404 Not Found 1.您还可以在其中添加自定义布局更新XML.