2012-07-25 49 views
0

我正在开发我的第二个Magento模块,它应该检索一些数据并渲染包含它的块。这样的块将被其他页面使用。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是在应用程序/设计/前端/碱/默认/模板/ 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() 
    ); 
} 

什么可能我是做错了什么?恐怕我又犯了一个愚蠢的错误,但我真的看不到它。

最后两个问题:

  • 如何传递到模板我在控制器检索数据?具体而言,变量$CustomerData
  • 模块渲染完成后,如何从页面内渲染其内容?该块应该返回一个带有一些东西的东西,我想在客户仪表板内部呈现它,就在已经存在的信息的下面。

在此先感谢您的帮助。

+0

@Jim感谢您的编辑,我没有发现破损的格式。我不应该在4AM发布问题... :) – Diego 2012-07-25 11:11:09

回答

3

Magneto上的大多数课程源自Varien_ObjectVarien_Object(和它的后代)为自己声称PHP的构造函数(__construct),并提供一个_construct回调函数,您可以随意使用它。这意味着,如果你重写PHP本身的构造函数(__construct),你需要记住几件事情要做:

  1. 接受相同数量的参数作为基础类,并...
  2. 呼叫父构造函数(parent::__construct)与您的构造函数提供的参数。

或者,也可以使用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编写)来加载块并将其放入父块中。
+0

感谢您的答案。下划线可能会令人困惑......这让我想起了旧规则“下着座,确实是一个朋友”。我会马上试试。 – Diego 2012-07-25 09:55:56

+0

感谢您的其他答案。我已经在尝试了解如何编写布局文件,到目前为止,我发现的所有示例都显得太复杂了,无法满足我的需求。毕竟,这只是一个小块! :O – Diego 2012-07-25 09:56:56

+0

我做了你所建议的改变,我改变了方法到'public function _construct()',但是块仍然没有渲染。你还有什么建议检查?谢谢。 – Diego 2012-07-25 11:16:35

2

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

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

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

感谢大家的帮助。

+0

+1 - 良好的捕获,允许Symlinks设置是一个真正的陷阱。你碰到这个问题很多id你使用modman在你的项目中包含模块 – 2012-07-26 00:31:16

+0

实际上,管理界面中的日志查看器会很方便。 – 2012-07-26 00:33:04

+0

@Jimohalloran可能是小意见,但我想你的意思是“很多,如果”。这不是迂腐,而是“ID”非常常见(用户ID,客户ID),我最初试图了解“很多ID”是什么。具有讽刺意味的是,“lot”也是与商业世界相关的一个词。 :D – Diego 2012-07-26 09:00:54