Способы вызова блоков в Magento: XML-файл createBlock vs Layout - PullRequest
2 голосов
/ 26 апреля 2010

Контекст: я пытаюсь включить блоки 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 () является причиной проблемы. Очевидно, у меня не может быть и блока сетки, и шаблона истории в одном действии. Хотя я не уверен, почему.

Спасибо за любые советы!

1 Ответ

2 голосов
/ 27 апреля 2010

Более подробная информация о других настройках, которые вы выполнили для достижения этой цели, может помочь людям решить вашу проблему. Когда я попробовал ваш код «создать блок программно», я получил следующую ошибку.

Warning: include(/path/to/magento1point4.dev/app/design/frontend/base/default/template/widget/grid.phtml) [function.include]: failed to open stream: No such file or directory  in /path/to/magento1point4.dev/app/code/core/Mage/Core/Block/Template.php on line 189

Я добавил простой шаблон phtml в указанное место и после этого смог успешно вставить блок через файл макета

    <reference name="content">
        <block type="adminhtml/sales_order_grid" name="orders_widget"/>
    </reference>

Так что я подозреваю, что что-то, что вы сделали по пути, уже сбивает с толку.

Кроме того, версия Magento может помочь. Строка 526 текущей версии издания сообщества является комментарием.

Все, что я сказал, - это что-то не так в методе getOutput класса Layout. Я бы добавил запись в функцию на вашем dev-сервере, чтобы увидеть, что Magento пытается сделать / создать, когда он вам поручит.

public function getOutput()
{
    $out = '';
    if (!empty($this->_output)) {
        foreach ($this->_output as $callback) {
            Mage:Log('Trying to get the block ' . $callback[0] . ' and call its ' . $callback[1] . 'method');
            $out .= $this->getBlock($callback[0])->$callback[1]();
        }
    }

    return $out;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...