Контекст: я пытаюсь включить блоки Adminhtml во внешний интерфейс сайта, чтобы заменить некоторые блоки учетных записей пользователей. Первое, что я пытаюсь сделать, это просто отобразить блок на правильной странице. Я могу заменить всю страницу, установив тело ответа внутри контроллера, но мне трудно включить блок в XML-файл макета и затем вызвать его в шаблоне.
Шаблон этого блока по умолчанию - adminhtml / default / default / widget / grid.phtml. Поэтому я поместил widget / grid.phtml и widget / grid / folder (необходимый для widget / grid.phtml) внутри темы внешнего интерфейса.
Я использую Community Edition v1.3.2.2
Почему я могу создать adminhtml / sales_order_grid из Mage_Sales_OrderController, используя createBlock:
$this->getResponse()->setBody($this->getLayout()->createBlock('adminhtml/sales_order_grid')->toHtml());
Но не из внешнего интерфейса, используя объявление
<sales_order_history>
<reference name="content">
<block type="adminhtml/sales_order_grid" name="orders_widget"/>
</reference>
</sales_order_history>
в приложении / design / frontend / default / default / layout / sales.xml
Последний выдает ошибку без трассировки стека:
Fatal error: Call to a member function toHtml() on a non-object in app/code/core/Mage/Core/Model/Layout.php on line 526
Эта строка является функцией getOutput (), на которую Алан ссылается ниже. Данные в обратном вызове [0] пустые. Насколько я могу сказать, это ноль. При выводе в журнал он пустой. get_class (callback [0]) также не возвращает ничего различимого.
Насколько я могу судить, блоки не отображаются. В браузере ничего не отображается, кроме сообщения об ошибке. В журнале единственный выход из метода getOutput () в app / code / core / Mage / Core / Model / Layout.php - это тот, где он ломается - без имени блока в обратном вызове [0].
Однако я знаю, что _prepareCollection в блоке sales_order_grid вызывается.
Обновление: оказывается, что я могу получить блок для рендеринга, добавив его в файл макета. Вызов, который выдает ошибку, находится в app / code / core / Mage / Sales / controllers / OrderController.php в публичной функции historyAction (). Вызов $ this-> renderLayout () является причиной проблемы. Очевидно, у меня не может быть и блока сетки, и шаблона истории в одном действии. Хотя я не уверен, почему.
Спасибо за любые советы!