Пользовательский модуль Magento, фатальная ошибка: вызов функции-члена setFormAction ()

Когда я нажал мой модуль на этом URLHttp: //localhost/xxx/index.php/TradeEnquiry Я получаю эту ошибку

Fatal error: Call to a member function setFormAction() on a non-object in C:\wamp\www\stockdisplays\app\code\local\Stock\Tradeenquiry\controllers\IndexController.php on line 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, а не / tradeenquiry, как я указал в своем макете XML, его почти как если бы он использовал более старую версию?

 CoolGravatar02 авг. 2009 г., 20:44
Вы когда-нибудь находили решение для этого? У меня точно такая же проблема, как и у вас.
 CoolGravatar02 авг. 2009 г., 21:03
Кстати, я попытался установить модуль Алана и передал переменные GET, но ничего не появилось.
 Dan02 авг. 2009 г., 23:33
Да, для меня это оказалось незначительной ошибкой в одном из XML-файлов. Я прошел через все с Beyond Compare и сделал все интервалы и капитализации такими же, как у контактного модуля, и все заработало.

Ответы на вопрос(1)

что есть в Magento, существует множество причин, по которым это может происходить.

Во-первых, я не буду использовать заглавную букву "V". когда называете свои блоки. Хотя я неthink это может вызвать проблему (поскольку имена являются ссылками на URI (core / textlist и т. д.) и шаблон filepath (/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;
    }
}

и начните добавлять операторы отладки, чтобы увидеть, можете ли вы выяснить, почему система не возвращает ссылку на ваш блок. Не забудьте удалить / не отметить свои операторы отладки, так как это основной системный код.

 Dan09 июл. 2009 г., 14:01
Я отладил getBlock, и мой блок не установлен, поэтому он возвращает false. Как это может быть? Его набор в макете XML, есть ли где-то еще мне нужно посмотреть?
 09 июл. 2009 г., 21:52
Если _blocks пуст, это потому, что вы еще не вызвали метод loadLayout контроллера. Если _blocks не пустой, но не имеет «tradeenquiryView», то это означает окончательный «макет страницы». в нем нет вашего блока tradeenquiryView. Можете ли вы взять модуль наstackoverflow.com/questions/1087733/…  и опубликовать результаты showLayout = page и showLayout = handles?
 Dan09 июл. 2009 г., 13:06
Еще раз спасибо за еще один из ваших исчерпывающих ответов. Ваши баллы о $ this- & gt; loadLayout (); и заглавная V, я уверен, действительны, но как модуль Magento Contacts делает это? Я буду отлаживать, как вы говорите, а затем посмотреть, что я получаю

Ваш ответ на вопрос