2

当我在这个 url http://localhost/xxx/index.php/TradeEnquiry上点击我的模块时,我收到了这个错误

致命错误:在第 55 行对 C:\wamp\www\stockdisplays\app\code\local\Stock\Tradeenquiry\controllers\IndexController.php 中的非对象调用成员函数 setFormAction()

第 55 行是这样的:

 $this->getLayout()->getBlock('tradeenquiryView')
            ->setFormAction( Mage::getUrl('*/*/post') );

这是我的布局 xml 中的一个片段:

<default>
    <reference name="footer_links">
        <action method="addLink" translate="label title" module="tradeenquiry">
                <label>Trade Enquiry</label>
                <url>tradeenquiry</url>
                <title>Trade Enquiry</title>
                <prepare>true</prepare>
            </action>
    </reference>
</default>

<tradeenquiry_index_index>
    <reference name="root">
        <action method="setTemplate"><template>page/2columns-right.phtml</template></action>
        <action method="setHeaderTitle" translate="title" module="tradeenquiry"><title>Trade Enquiry</title></action>
    </reference>
    <reference name="content">
        <block type="core/template" name="tradeenquiryView" template="tradeenquiry/view.phtml"/>
    </reference>
</tradeenquiry_index_index>

我不明白问题是什么?该块被正确命名为“tradeenquiryView”。我唯一能想到的是布局 xml 以某种方式缓存?因为我必须点击 /TradeEnquiry 上的模块,而不是像我在布局 xml 中所说的 /tradeenquiry,所以它几乎就像使用旧版本一样?

4

1 回答 1

8

就像 Magento 的一切一样,这可能有很多原因发生。

首先,在命名块时,我会避免使用大写字母“V”。虽然我认为这不会导致问题(因为名称是对 URI(核心/文本列表等)和模板文件路径 (/path/to/template.phtml) 的引用),但在某人、某处(即 Varien)可能决定的小写/下划线名称的布局系统是强制约定。

二、你打过电话吗

$this->loadLayout();

在您尝试设置表单操作的行之前的控制器操作中?在您这样做之前,您的 Layout 对象不会被实例化和/或引用您的块对象,这意味着

$this->getLayout()->getBlock('...')

将始终返回 false。

其他调试技巧。尝试以下方法以确保您获得了您认为应该学习的课程。

die(get_class($this->getLayout()->getBlock('root')));                                   
die(get_class($this->getLayout()));         

最后,如果一切都失败了,请转到布局对象的来源

app/code/core/Mage/Core/Model/Layout.php

并看一下 getBlock 方法

public function getBlock($name)
{
    if (isset($this->_blocks[$name])) {
        return $this->_blocks[$name];
    } else {
        return false;
    }
}

并开始抛出调试语句,看看你是否能弄清楚为什么系统没有返回对你的块的引用。不要忘记删除/不签入您的调试语句,因为这是核心系统代码。

于 2009-07-08T19:21:59.363 回答