0

我正在开发我的第二个 Magento 模块,它应该检索一些数据并呈现一个包含它的块。这样的块将被其他页面使用。

目前,我几乎已经完成了整个模块,但是由于某种原因,当我调用控制器方法时,该块没有呈现。我放了一些调试信息,我可以看到块的__construct()方法被正确调用了,但是模板似乎没有被加载并且返回的页面是空白的。

这是块的代码,我从另一个模块复制并修改:

class Company_CustomerData_Block_CustomerSummary extends Mage_Core_Block_Template {
    const _TEMPLATE = 'customerdata/customersummary.phtml';

    public function __construct() {
    // This method is called correctly
        parent::_construct();
        $this->setTemplate(self::_TEMPLATE);
    }
}

customersummary.phtml文件位于app/design/frontend/base/default/template/customerdata中,这应该是正确的位置(或者,至少,我认为是这样)。其内容如下:

It works!

只是一些纯文本。没有标签,没有代码,什么都没有。我不介意它是静态文本,一旦完成,它将填充数据。

如果需要,这里是控制器的代码(我删除了检索数据的部分,因为它们没有任何区别):

public function dashboardAction() {
    // Customer Data to render in the block
    $CustomerData = array(); // Data is retrieved elsewhere

    $this->getResponse()->setBody(
        $this->getLayout()->createBlock('customerdata/customersummary')
        ->toHtml()
    );
}

我可能做错了什么?恐怕我又犯了一些愚蠢的错误,但我真的看不出来。

最后还有两个问题:

  • 如何将我在 Controller 中检索的数据传递给模板?具体来说,变量$CustomerData.
  • 块呈现后,如何从页面中呈现其内容?该块应该返回一个包含一些东西的内容,我想在客户仪表板中呈现它,就在已经存在的信息下方。

在此先感谢您的帮助。

4

2 回答 2

3

Magneto 上的大多数类都派生自Varien_Object. Varien_Object(以及它的后代)__construct为自己声明 PHP 的构造函数 (),并提供一个_construct回调,您可以将其用于任何您喜欢的事情。这意味着如果您覆盖原生 PHP 构造函数 ( __construct),您需要记住做一些事情:

  1. 接受与基类相同数量的参数,并且...
  2. parent::__construct使用为您的构造函数提供的参数调用父构造函数 ( )。

或者,或者,使用 Varien_Object 提供的 _construct 回调,你就完成了。parent::_construct如果您使用 Magento 回调,则无需记住调用。

因此,要修复上面的代码片段,您可以更改...

public function __construct() {

... 到 ...

public function _construct() {

这将使您切换到使用 Magento 回调。或者你可以改变...

parent::_construct();

.. 到 ...

parent::__construct();

...调用父类的构造函数。记住添加父类提供的参数。

Alan Storm 最近写了一篇关于Magento 的块生命周期和回调方法的精彩文章,这可能会有所帮助。

对于您的其他问题:

  • 将信息从控制器传递到块通常是通过 Magento 的注册表完成的。
  • 将模板呈现为页面的一部分需要您创建布局说明(以 XML 编写),这些说明会加载您的块并将其放置在父块中。
于 2012-07-25T05:10:25.587 回答
2

尽管吉姆的回答是正确的,但我要添加第二部分,因为我发现还有什么问题:符号链接。正如我在为框架开发插件时通常所做的那样,我使用符号链接来避免一遍又一遍地复制文件。但是,Magento 使用 function RealPath(),它将符号链接解析为其完整路径。因此,要加载的模板文件位于 Magento 安装目录之外的路径中,出于安全原因无法加载。这完全有道理,可惜它不是很明显。

为了解决这个问题,我在我的开发 PC 上的配置中启用了允许符号链接,现在模板已正确加载和呈现。

我认为 Magento 可以在管理界面中使用日志查看器。如果还没有一个模块可以做到这一点,也许我应该自己创建一个。

谢谢大家的帮助。

于 2012-07-25T14:35:47.787 回答