Magento - Block未呈现

时间:2012-07-25 02:12:04

标签: magento block

我正在开发我的第二个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!

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

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

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
  • 块渲染后,如何在页面中呈现其内容?该块应返回包含其中一些内容的块,我想将其呈现在Customer Dashboard中,就在已经存在的信息下方。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

Magneto上的大多数课程都来自Varien_ObjectVarien_Object(及其后代)为自己声明PHP的构造函数(__construct),并提供_construct回调,您可以将其用于任何您喜欢的内容。这意味着如果你覆盖本机PHP构造函数(__construct),你需要记住做一些事情:

  1. 接受与基类相同数量的参数,并且......
  2. 使用构造函数所提供的参数调用父构造函数(parent::__construct)。
  3. 或者,或者,使用Varien_Object提供的_construct回调,你就完成了。如果您正在使用Magento回调,则无需记住调用parent::_construct

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

    public function __construct() {
    

    ...到......

    public function _construct() {
    

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

    parent::_construct();
    

    ..到......

    parent::__construct();
    

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

    Alan Storm最近撰写了一篇关于Magento's Block Lifecycle and call back methods的精彩文章,可能会有所帮助。

    提出其他问题:

    • 通常通过Magento的注册表将信息从控制器传递到块。
    • 将模板呈现为页面的一部分需要您创建布局指令(用XML编写),用于加载块并将其放在父块中。

答案 1 :(得分:2)

虽然Jim的答案是正确的,但我正在添加第二部分,因为我发现了其他错误:符号链接。正如我在为框架开发插件时通常所做的那样,我使用符号链接来避免一遍又一遍地复制文件。但是,Magento使用函数RealPath(),它将符号链接解析为其完整路径。因此,要加载的模板文件驻留在Magento安装目录之外的路径中,并且出于安全原因无法加载。这很有道理,可惜它不是很明显。

要解决此问题,我在开发PC上配置了允许符号链接,现在模板已加载并正确呈现。

我认为Magento可以在Admin界面中使用日志查看器。如果没有一个模块已经完成,也许我应该自己创建一个。

感谢大家的帮助。