Magento - 未加载自定义扩展程序提供的阻止

时间:2012-07-28 00:06:22

标签: magento layout module php

我终于达到了我的第二个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管理自己......那么扩展控制器的目的是什么呢?

2 个答案:

答案 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

希望这可以帮助您完成任务,否则请在尝试后提供反馈。