我正在开发我的第二个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()
);
}
我可能做错了什么?我恐怕再犯了一些愚蠢的错误,但我真的看不到它。
最后还有两个问题:
$CustomerData
。提前感谢您的帮助。
答案 0 :(得分:3)
Magneto上的大多数课程都来自Varien_Object
。 Varien_Object
(及其后代)为自己声明PHP的构造函数(__construct
),并提供_construct
回调,您可以将其用于任何您喜欢的内容。这意味着如果你覆盖本机PHP构造函数(__construct
),你需要记住做一些事情:
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的精彩文章,可能会有所帮助。
提出其他问题:
答案 1 :(得分:2)
虽然Jim的答案是正确的,但我正在添加第二部分,因为我发现了其他错误:符号链接。正如我在为框架开发插件时通常所做的那样,我使用符号链接来避免一遍又一遍地复制文件。但是,Magento使用函数RealPath()
,它将符号链接解析为其完整路径。因此,要加载的模板文件驻留在Magento安装目录之外的路径中,并且出于安全原因无法加载。这很有道理,可惜它不是很明显。
要解决此问题,我在开发PC上配置了允许符号链接,现在模板已加载并正确呈现。
我认为Magento可以在Admin界面中使用日志查看器。如果没有一个模块已经完成,也许我应该自己创建一个。
感谢大家的帮助。