我终于达到了我的第二个Magento模块的“渲染”阶段,但我又被卡住了。该模块现在几乎完成,它有一个Controller和两个块,其中一个由第一个调用(一个是仪表板块,它使用第二个块来填充子节)。
我现在需要做的是将此新信息中心添加到客户帐户信息中心。有人告诉我使用布局文件,我在Magento设计指南上读过它们。然后我创建了布局文件并在其中添加了我的块的声明。但是,不会修改仪表板,也不会显示我的数据。如果我手动调用扩展方法(即myserver / customerstats / index),我会收到我想在客户帐户页面上显示的HTML代码段。
起初我以为我的布局文件没有加载,但我现在已经证明它已正确处理(至少是其中的一部分)。这是布局文件:
<layout version="0.1.0">
<customer_account_index translate="label">
<label>My Custom Dashboard</label>
<reference name="customer_account_dashboard">
<!-- The action is processed correctly, the template is overridden -->
<action method="setTemplate"><template>customerstats/customer/account/dashboard.phtml</template></action>
<block type="customerstats/index" name="customerstats_dashboard" as="customerstats.dashboard" template="customerstats/customerstatsdashboard.phtml" />
</reference>
</customer_account_index>
</layout>
我将setTemplate操作添加到布局文件中,因为其中一个要求是新仪表板垂直分为两部分。这意味着我必须修改原始 customer / account / dashboard.phtml 并更改页面结构,添加两个将根据需要设置样式的部分。我不确定这是正确的做法,但我无法弄清楚如何在页面的特定部分添加我的附加内容,而不会触及.phtml文件。
我修改了新的 dashboard.phtml ,以确保它已加载,并且当我启用操作时,我可以看到显示我的更改的“客户帐户”页面。但是,我的扩展应该呈现的块不会出现在页面上,并且基于我的简单“陷阱”(一个简单的“die()”来证明代码被执行),扩展方法不会甚至似乎被称为。
这是我试图从块调用的控制器,删除了不相关的部分。
class MyCompany_CustomerStats_IndexController extends Mage_Core_Controller_Front_Action {
// The loaded block is setting its own template in the _construct() phase
$Block = &$this->getLayout()->createBlock('customerstats/customerstatsdashboard');
// Some data is loaded elsewhere and passed to the Block
$this->getResponse()->setBody(
$Block->toHtml()
);
}
如果我手动调用它,我会正确激活控制器(myserver / customerstats / index)它返回完全呈现的HTML,但是,正如开头所提到的,当布局文件发挥作用时它似乎不会运行。
总结一下,这是我的问题:
- 我是否在关于覆盖客户账户仪表板的正确轨道上?
- 我是否必须在扩展的布局中指定模板属性?我实现的所有块都通过代码加载他们的模板(有一个选择使用哪个模块的逻辑),我也看不到在xml文件中指示模板的用途。
- 一旦我将一个块添加到XML文件,我是否必须更改dashboard.phtml文件以将其呈现在某个位置?我问,因为我看到了原始仪表板模板,它包含对getChildHtml('alias name of a block')
的各种调用。这让我认为块不必仅在布局文件中“暴露”,而是在.phtml文件中手动调用。然而,这是一种推测,因为我对机制没有清楚的认识。 注意:我还尝试在新的dashboard.phtml中调用getChildHtml('customerstats.dashboard)
,但没有任何变化。
提前感谢所有答案。
更新1 - 2012/07/28
这是未呈现的块的代码。
class MyCompany_CustomerStats_Block_UserStatsDashboard extends Mage_Core_Block_Template {
const _TEMPLATE = 'customerStats/userstatsdashboard.phtml';
public function _construct() {
$this->setTemplate(self::_TEMPLATE);
}
}
另外,我对Controller本身做了一个实验。我改变如下:
class MyCompany_CustomerStats_IndexController extends Mage_Core_Controller_Front_Action {
die('Controller called successfully.');
}
以下是结果: - 如果我从浏览器调用“myserver / customerstats / index”,我会收到消息“Controller called successfully。”。 - 如果我加载了我修改过的仪表板页面,我可以看到新的布局(这意味着我的仪表板已加载),但不是消息。对我而言,这意味着控制器甚至没有被召唤。
Config.xml
的内容<?xml version="1.0"?>
<config>
<modules>
<MyCompany_CustomerStats>
<version>0.1.0</version>
</MyCompany_CustomerStats>
</modules>
<global>
<helpers>
<CustomerStats>
<class>MyCompany_CustomerStats_Helper</class>
</CustomerStats>
</helpers>
<models>
<CustomerStats>
<class>MyCompany_CustomerStats_Model</class>
</CustomerStats>
</models>
<blocks>
<CustomerStats>
<class>MyCompany_CustomerStats_Block</class>
</CustomerStats>
</blocks>
</global>
<frontend>
<routers>
<CustomerStats>
<use>standard</use>
<args>
<module>MyCompany_CustomerStats</module>
<frontName>userstats</frontName>
</args>
</CustomerStats>
</routers>
<layout>
<updates>
<CustomerStats>
<file>customerstats.xml</file>
</CustomerStats>
</updates>
</layout>
</frontend>
</config>
更新2 - 2012/07/28
我承认,从MVC的角度来看,我做了一个实验,对我来说完全没有意义。我将布局和指定的块类型更改为 customerstats / userstatsdashboard 。然后,我按如下方式修改了Block类MyCompany_CustomerStats_Block_UserStatsDashboard
:
public function _construct() {
echo "Block rendered.";
}
令人惊讶的是,现在新的布局出现了一些东西,正是我所期待的!但这意味着控制器根本没有被调用,这反过来意味着没有可用于块的数据。
这真让我困惑,我从来没有见过一个MVC模型,其中Views管理自己......那么扩展控制器的目的是什么呢?
答案 0 :(得分:3)
您的块类组是CustomerStats
,但您没有在布局中使用它。阻止类组只是global/blocks
和下的唯一文本节点,不需要&#34;匹配&#34;任何文件夹结构(FYI)。此字符串的重要性在于它匹配对createBlock()
的任何调用的第一部分(斜杠之前),这意味着您的布局XML应指定例如type="CustomerStats/whatever"
在上面的示例中,根据您的MyCompany_CustomerStats_Block_Whatever
类前缀,生成的类名称为MyCompany_CustomerStats_Block
。
答案 1 :(得分:1)
不考虑例外,有两种类型的块。一个core/text_list
和所有其他类型。引用core/text_list
时,例如content
块,会自动呈现所有添加的块。
当引用不同于core/text_list
的内容时,在您的情况customer/account_dashboard
中,您需要自己从模板中获取内容。这可以通过getChildHtml()
电话完成,就像您已经建议的那样。
虽然我无法使用您目前提供的代码验证这一点,但可能是错误的是,您的模块中找不到您自己的customerstats/index
块类型,或者它未扩展{{1} }。或者您将不存在的类组传递给createBlock工厂方法。
所以在你的模块中应该有类似的东西:
Mage_Core_Block_Template
但我认为你可能会有 <blocks>
<customerstats>
<class><your_namespace>_Customerstats_Block</class>
</customerstats>
</blocks>
而不是customerdata
。
由于您从控制器调用的块类型为customerstats
,因此可以使用。虽然XML中使用customerdata/customerstatsdashboard
的那个。如果是这种情况,您可能需要尝试将XML调整为:
customerstats
此外,在使用模板时,您的块应该是这样的。因此总是扩展Mage_Core_Block_Template。否则<block type="customerdata/index" name="customerstats_dashboard" as="customerstats.dashboard" template="customerdata/customerstatsdashboard.phtml" />
将无法使用。 getChildHtml
希望这可以帮助您完成任务,否则请在尝试后提供反馈。