【问题标题】:Magento layout - content is not being rendered/displayedMagento 布局 - 内容没有被渲染/显示
【发布时间】:2011-10-26 06:36:53
【问题描述】:

我已经阅读了各种 Magento 教程以及一本关于布局的 Magento 书籍,但我遇到了以下问题。

我创建了一个自定义模块,位于 app/code/local/Company/Module/ 中。我在 Company/Module/Block/Ablock.php 中创建了一个区块 Company_Module_Block_Ablock。我在 Company/Module/etc/config.xml 中定义了<config> ... <frontend><layout><updates><module><file>module.xml

config.xml也有

<global>
   <blocks>
      <module>
         <class>Company_Module_Block</class>
      </module>
   </blocks>
</global>

在这个 module.xml 里面我有:

<layout>
    <company_module_index_index>
        <reference name="content">
            <block type="module/ablock" name="myablock" template="module/ablock.phtml" />
        </reference>
    </company_module_index_index>
</layout>

我创建了一个 Company/Module/controllers/IndexController.php 并在那里定义了一个 indexAction

$this->loadLayout();
$this->renderLayout();

但无论我尝试什么,我都无法显示我的 ablock.phtml。 ablock.phtml 位于 app/design/frontend/company/default/template/module/ablock.phtml 中。该主题已启用,并且通常在该站点上运行。

我什至尝试更改 module.xml 内部布局,因此它甚至不使用模板,甚至没有显示任何内容。像这样——

<reference name="content">
<block type="core/text">
    <action method="setText">
        <text>Testing</text>
    </action>
</block>
</reference>

顺便说一句,自定义主题可以正常工作,其他页面的内容显示在正确的位置。

我在 .htaccess 中有 SetEnv MAGE IS DEVELOPER MODE 1,它应该有助于显示警告和内容。但是我的 systems.log 和 exceptions.log 中没有错误。 (是的,日志记录已打开)

有人对如何解决此问题有任何建议,或者可以发现配置或代码中的错误吗?

我的下一个选择似乎是破解核心模块代码并记录我的 module.xml 被加载和解析的位置,以查看那里发生了什么。

谢谢。

【问题讨论】:

    标签: xml layout magento configuration


    【解决方案1】:
    • 您是否禁用或更新了 Magento 缓存?
    • 您的模块启用了吗?它是否列在系统、配置、高级、高级中?
    • 您的 Block 扩展了哪个类?

    问候,亚历山德罗

    【讨论】:

    • 缓存被禁用。该模块已启用。它扩展了 Mage_Checkout_Block_Onepage_Abstract 。但我认为问题出在 layout.xml 中,或者只是在某些配置设置中。因为即使是简单的内置“核心/文本”块类型也不起作用。
    【解决方案2】:

    如果没有看到您的所有 config.xml,我无法判断,您可能缺少这样的部分:

    <frontend>
        <routers>
            <company_module>
                <args>
                    <frontName>module</frontName>
                    <module>Company_Module</module>
                </args>
                <use>standard</use>
            </company_module>
        </routers>
    </frontend>
    

    然后,要访问indexAction 或您的indexController,您需要地址www.example.com/module。这意味着在加载布局时会使用布局句柄 company_module_index_index。顺便说一句,发布的布局 XML 已损坏,结束标记与开始标记不匹配。

    【讨论】:

    • 布局句柄不是module_index_index,而不是company_module_index_index吗?
    • @尼克。这是个好问题。 frontNamemodule,但 XML 节点称为 company_module。该节点在构建布局句柄时使用。只需查看管理页面;所有 URL 都以 admin 开头,但布局句柄以 adminhtml 开头,因为它与路由器匹配。
    • 对不起,我应该提到这一点。是的,路由器部分在那里。查看 www.example.com/module 显示了我的基本站点,中间没有内容。您可以看到我在上面定义的 IndexController.php。这是一个错字。已编辑问题。谢谢
    • 为了澄清错字是在布局中的 XML 的结束块中。实际的 XML 没有错字。
    • @Nick +1 是的,这就是问题所在。
    【解决方案3】:

    调试布局更新 XML 问题的步骤:

    1. 您的 XML 文件(local.xmlmodule.xml)是否正在加载到系统中

    2. 您在布局文件中使用的句柄标记是否与为您的请求生成的句柄匹配?

    调试第 1 步的最快方法是,在显示错误的开发人员模式下,故意向布局更新 XML 文件引入格式不正确的错误。

    <layout <!-- notice missing closing taglayout -->
        <company_module_index_index>
            <reference name="content">
                <block type="module/ablock" name="myablock" template="module/ablock.phtml" />
            </reference>
        </company_module_index_index>
    </layout>
    

    如果开发者模式已打开并且您已清除缓存,则加载任何包含上述内容的页面都会导致错误。这让您知道 Magento 正在尝试加载您的 XML 文件。如果页面加载没有问题,这意味着您的 XML 文件位于错误的位置,或者您在 config.xml 中错误配置了您的 XML。

    接下来是检查布局句柄。您需要确保您使用的是正确的。您可以通过在您的loadLayoutrenderLayout 请求之后调用以下 来查看用于特定请求的布局句柄

    //from a controller action
    $this->loadLayout();
    $this->renderLayout();
    var_dump(Mage::getSingleton('core/layout')->getUpdate()->getHandles());
    exit("bailing early at ".__LINE__." in ".__FILE__);
    

    我发现上述项目通常可以解决 90% 的布局问题。一定要经历几次这个过程,因为很容易错过一个步骤,并在不正确的情况下假设某些事情是好的。冒着我通常的风险,我创建Commerce Bug(商业调试扩展)的部分原因是为了快速提供这些信息,一目了然,以帮助解决调试问题。

    根据您下面的 cmets,问题似乎是您正在使用的布局句柄。系统生成的句柄是

    module_module_test
    

    但是,您在 layout.xml 中定义的句柄是

    company_module_index_index
    

    这是“完整的动作名称”句柄。典型的语法是

    frontname_controllername_actionname
    

    将句柄更改为module_module_test,您应该已经设置好了。

    【讨论】:

    • 感谢 Alan,它实际上是关于布局的书,我已打开作为参考。使用格式错误的布局 XML 会导致预期的解析错误,因此显然加载它是正确的。尝试 var_dump 给了我这个array(5) { [0]=&gt; string(7) "default" [1]=&gt; string(13) "STORE_default" [2]=&gt; string(25) "THEME_frontend_company_default" [3]=&gt; string(22) "module_module_test" [4]=&gt; string(19) "customer_logged_out" } 我有一个 ModuleController.php,它定义了一个 testAction()。如果我在 testAction 中执行回显“测试”,文本会显示在页面上,尽管不在网站的默认模板中。
    • 最后一条评论太长,无法添加 - 我已尝试安装您的 LayoutViewer 和 ConfigViewer,但它似乎不适用于 Magento 1.6。
    • 接受并 +1 谢谢!我可以发誓我一开始就尝试过。但也许其他的东西当时不起作用。为什么我可以将它称为模块而不必说 company_module,它是否从 config.xml - 前端/路由器/模块部分获取模块?
    • 句柄名称取自 config.xmlrouters/[foo]/* 部分。我不记得它是使用 frontName 标记中的值,还是使用标记本身的名称 ("[foo]")
    • 谢谢艾伦。我跑了一个测试,你是对的,它是从 config.xml 中的模块名称中获取的
    【解决方案4】:

    在 magento 2.3.2 中,您必须输入此代码才能获取布局句柄

    echo $this->getRequest()->getFullActionName();
    

    所以控制器像这样执行函数

        public function execute()
        {
    
            echo $this->getRequest()->getFullActionName();exit;
        }
    

    并检查屏幕上打印的值是否与布局句柄名称相同

    【讨论】:

      猜你喜欢
      • 2022-08-05
      • 1970-01-01
      • 1970-01-01
      • 2020-12-18
      • 1970-01-01
      • 2013-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多