我有一个自定义模块,它有几个块。如果我将这些块彼此包含在CMS页面中,它们将按预期工作。如果我通过布局XML文件包含它们,它们都会显示XML中调用的最后一个源代码。下面是一个最小测试用例(对我来说就是表现出这种行为),以及预期和实际结果。
代码
/app/etc/modules/Test_Tester.xml
<?xml version="1.0"?>
<config>
<modules>
<Test_Tester>
<active>true</active>
<codePool>local</codePool>
</Test_Tester>
</modules>
</config>
/app/code/local/Test/Tester/etc/config.xml
<?xml version="1.0"?>
<config>
<modules>
<Test_Tester>
<version>0.1.0</version>
</Test_Tester>
</modules>
<global>
<blocks>
<test_tester>
<class>Test_Tester_Block</class>
</test_tester>
</blocks>
</global>
</config>
/app/code/local/Test/Tester/Block/One.php
<?php
class Test_Tester_Block_One extends Mage_Catalog_Block_Product_List_Upsell
{
protected function _prepareData()
{
echo 'One.php';
//...MORE code here, it's not really relevant though
}
}
/app/code/local/Test/Tester/Block/Two.php
<?php
class Test_Tester_Block_Two extends Mage_Catalog_Block_Product_List_Upsell
{
protected function _prepareData()
{
echo 'Two.php';
//...MORE code here, it's not really relevant though
}
}
/app/design/frontend/INTERFACE/TEMPLATE/layout/page.xml(在
..
<block type="core/text_list" name="testa" as="testa" />
<block type="core/text_list" name="testb" as="testb" />
..
/app/design/frontend/INTERFACE/TEMPLATE/layout/cms.xml(在
<reference name="testa">
<block type="test_tester/one" template="tester/one.phtml"/>
</reference>
<reference name="testb">
<block type="test_tester/two" template="tester/two.phtml"/>
</reference>
/app/design/frontend/INTERFACE/TEMPLATE/template/page/home_template.phtml
<?php echo $this->getChildHtml('testa'); ?>
<?php echo $this->getChildHtml('testb'); ?>
/app/design/frontend/INTERFACE/TEMPLATE/tester/one.phtml
one.phtml
/app/design/frontend/INTERFACE/TEMPLATE/tester/two.phtml
two.phtml
预期
这应该打印出来(在主页上,包含了块):
One.php
one.phtml
Two.php
two.phtml
实际输出
如果我在主页CMS页面中包含这些块,如下所示:
{{block type="test_tester/one" template="tester/one.phtml"}}
{{block type="test_tester/two" template="tester/two.phtml"}}
...我得到了预期的输出。但是,使用代码示例中的上述布局,我得到:
Two.php
two.phtml
Two.php
two.phtml
我想我已经疯了 - 我看不出我正在捣乱。
答案 0 :(得分:1)
尝试在主页CMS页面中提供您的块名称。我收到的类似错误已经通过这种方式解决了。我看到你正在尝试将块包装在文本列表中,但是从我看到的内容你从未真正识别CMS页面中的块。尝试一下这个效果:
{{block type="test_tester/one" template="tester/one.phtml" name="testa"}}
{{block type="test_tester/two" template="tester/two.phtml" name="testb"}}
如果您无法远离父块作为容器,则可能需要重新考虑部分布局。如果不是这样做的话,请告诉我,我们会尝试别的。希望有所帮助。
谢谢, 乔