2

このURLhttp://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が何らかの形でキャッシュされているということですか?レイアウトxmlで述べたように/tradeenquiryではなく/TradeEnquiryでモジュールをヒットする必要があるため、古いバージョンを使用しているかのようになりますか?

4

1 に答える 1

8

すべてのMagentoと同様に、これが発生する可能性のある理由は多数あります。

まず、ブロックに名前を付けるときに大文字の「V」を使用することは避けます。これで問題が発生することはないと思いますが(名前はURI(コア/テキストリストなど)とテンプレートファイルパス(/path/to/template.phtml)への参照であるため)、事実上の命名規則があります。誰かがどこか(つまりVarian)が決定する可能性のある小文字/アンダースコア名のレイアウトシステムは、強制された規則です。

第二に、あなたは電話しましたか

$this->loadLayout();

フォームアクションを設定しようとする行の前のコントローラーアクションで?これを行うまで、レイアウトオブジェクトはインスタンス化されないか、ブロックオブジェクトへの参照がありません。つまり、

$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 に答える