【发布时间】:2011-02-12 13:16:34
【问题描述】:
上下文:我正在尝试在网站的前端包含 Adminhtml 块以替换一些用户帐户块。我要做的第一件事就是在正确的页面上显示块。我可以通过在控制器内设置响应的正文来替换整个页面,但是我很难在布局 xml 文件中包含该块,然后在模板中调用它。
此块的默认模板是 adminhtml/default/default/widget/grid.phtml。所以我在前端主题中放置了 widget/grid.phtml 和 widget/grid/ 文件夹(widget/grid.phtml 需要)。
我正在使用社区版 v1.3.2.2
为什么我可以使用 createBlock 从 Mage_Sales_OrderController 创建一个 adminhtml/sales_order_grid:
$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>
在 app/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
那一行是 Alan 在下面提到的函数 getOutput()。 callback[0] 中的数据为空白。据我所知,它是空的。当输出到日志时,它是空白的。 get_class(callback[0]) 也不会返回任何可辨别的内容。
据我所知,没有渲染任何块。除了错误消息外,浏览器中没有显示任何内容。在日志中,app/code/core/Mage/Core/Model/Layout.php 中的 getOutput() 方法的唯一输出是它中断的输出 - 在回调 [0] 中没有块名称。
但是,我知道正在调用 sales_order_grid 块上的 _prepareCollection。
更新:事实证明,我可以通过将块添加到布局文件来渲染它。引发错误的调用位于公共函数 historyAction() 中的 app/code/core/Mage/Sales/controllers/OrderController.php 中。对 $this->renderLayout() 的调用是导致问题的原因。显然,我不能在同一个动作中同时呈现网格块和历史模板。不过我不知道为什么。
感谢您的指导!
【问题讨论】:
-
您可能应该使用 adminhtml/sales_order_grid 扩展的块之一。 adminhtml 块应该在管理而不是前端使用/呈现。