【问题标题】:Magento Custom Module, Fatal error: Call to a member function setFormAction()Magento 自定义模块,致命错误:调用成员函数 setFormAction()
【发布时间】:2010-11-09 01:40:50
【问题描述】:

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

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

第 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,所以它几乎就像使用旧版本一样?

【问题讨论】:

  • 您找到解决方案了吗?我遇到了和你一样的问题。
  • 顺便说一句,我尝试安装 Alan 的模块并将 GET 变量传入,但没有出现。
  • 是的,对我来说,这是其中一个 xml 文件中的一个小错误。我使用 Beyond Compare 将它们全部通过,并使所有间距和大写与联系模块相同,并且它起作用了。

标签: php xml layout magento controller


【解决方案1】:

就像 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;
    }
}

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

【讨论】:

  • 再次感谢您的另一个全面回答。您对 $this->loadLayout(); 的看法和大写的 V,我确定是有效的,但 Magento 联系人模块就是这样做的吗?我会像你说的那样调试,然后看看我得到了什么
  • 我调试了 getBlock 并且我的块没有设置,所以它返回一个 false。怎么会这样?它在布局 xml 中设置,还有其他地方我需要看吗?
  • 如果 _blocks 为空,那是因为你还没有调用控制器的 loadLayout 方法。如果 _blocks 不为空但缺少“tradeenquiryView”,那么这意味着最终的“页面布局”中没有您的 tradeenquiryView 块。你可以在stackoverflow.com/questions/1087733/… 获取模块并发布 showLayout=page 和 showLayout=handles 的结果吗?
猜你喜欢
  • 1970-01-01
  • 2015-08-07
  • 2012-09-05
  • 1970-01-01
  • 1970-01-01
  • 2011-12-07
  • 1970-01-01
  • 2011-08-22
  • 2017-06-22
相关资源
最近更新 更多