我已经阅读了各种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被加载和解析的位置以查看那里发生了什么。
感谢。
答案 0 :(得分:31)
调试布局更新XML问题的步骤:
您的XML文件(local.xml
或module.xml
)是否已加载到系统中
您在布局文件中使用的句柄标记是否与为您的请求生成的句柄匹配?
调试步骤1的最快方法是,在显示错误的开发人员模式下,故意向Layout Update 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。
接下来是你检查你的布局句柄。你要确保你使用正确的。您可以通过在loadLayout
和renderLayout
请求之后调用以下来查看用于特定请求的布局句柄
//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(商业调试扩展)的部分原因是为了快速提供这些信息,并一目了然地帮助调试问题。
根据您在下面的评论,问题似乎是您正在使用的布局句柄。系统生成的句柄是
module_module_test
但是,您在layout.xml中定义的句柄是
company_module_index_index
这是“完整操作名称”句柄。典型的语法是
frontname_controllername_actionname
将手柄更改为module_module_test
,您应该设置。
答案 1 :(得分:1)
关心,亚历山德罗
答案 2 :(得分:0)
我看不到你所有的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被破坏,结束标记与开始标记不匹配。
答案 3 :(得分:0)
在magento 2.3.2中,您必须输入此代码以获取布局句柄
echo $this->getRequest()->getFullActionName();
所以控制器执行这样的功能
public function execute()
{
echo $this->getRequest()->getFullActionName();exit;
}
并检查屏幕上打印的值是否与布局句柄名称相同