Когда я ударил свой модуль по этому 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>
по<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>
по<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, так что почти так же, как если бы он использовал более старую версию?
Как и все 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; } }
и начните бросать в операторы отладки, чтобы узнать, можете ли вы понять, почему система не возвращает ссылку на ваш блок. Не забудьте удалить / не проверить свои отладочные операторы, так как это основной системный код.