Zend framework 在Magento中调用块的方法:createBlock vs Layout xml文件

Zend framework 在Magento中调用块的方法:createBlock vs Layout xml文件,zend-framework,magento,Zend Framework,Magento,上下文:我试图在站点前端包含Adminhtml块,以替换一些用户帐户块。我要做的第一件事就是在正确的页面上显示块。我可以通过在控制器内设置响应主体来替换整个页面,但是我很难将块包含在布局xml文件中,然后在模板内调用它 此块的默认模板是adminhtml/default/default/widget/grid.phtml。因此,我将widget/grid.phtml和widget/grid/folder(widget/grid.phtml所需)放在前端主题中 我正在使用社区版v1.3.2.2 为

上下文:我试图在站点前端包含Adminhtml块,以替换一些用户帐户块。我要做的第一件事就是在正确的页面上显示块。我可以通过在控制器内设置响应主体来替换整个页面,但是我很难将块包含在布局xml文件中,然后在模板内调用它

此块的默认模板是adminhtml/default/default/widget/grid.phtml。因此,我将widget/grid.phtml和widget/grid/folder(widget/grid.phtml所需)放在前端主题中

我正在使用社区版v1.3.2.2

为什么我可以使用createBlock从Mage\u sales\u OrderController创建adminhtml/sales\u order\u网格:

$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>
这一行是Alan在下面提到的函数getOutput()。回调[0]中的数据为空。据我所知,它是空的。当输出到日志时,它是空的。get_类(回调[0])也不会返回任何可识别的内容

据我所知,没有渲染任何块。除错误消息外,浏览器中未显示任何内容。在日志中,app/code/core/Mage/core/Model/Layout.php中getOutput()方法的唯一输出是它中断的输出-回调[0]中没有块名

但是,我知道正在调用sales\u order\u网格块上的\u prepareCollection

更新:事实证明,我可以通过将块添加到布局文件来获得要渲染的块。引发错误的调用位于公共函数historyAction()中的app/code/core/Mage/Sales/controllers/OrderController.php中。对$this->renderLayout()的调用是导致问题的原因。显然,我不能在同一个动作中同时呈现网格块和历史模板。我不知道为什么


谢谢你的指导

更多关于您为达到这一点所做的其他定制的详细信息可能会帮助人们解决您的问题。当我尝试您的“以编程方式创建块”代码时,我得到了以下错误

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>

谢谢你,艾伦。是的,我忘记了在正确的位置包含模板文件的步骤。我也在这么做。我使用的是community edition v1.3.2.2,您是对的,Magento使用的是getOutput()方法。回调[0]不是对象。我不确定这是为什么-adminhtml/sales\u order\u网格被映射到正确的类。也许这取决于另一个尚未加载的类?是否将sales\u order\u网格块放置在sales\u order\u history元素中?该块的模板是adminhtml/default/default/widget/grid.phtml。目前,在块内没有对setTemplate的调用,这很好。但是,当我将不同的模板分配给_construct()中不是adminhtml/default/default/widget/grid.phtml的块时,我会看到不同的行为。grid.phtml的响应是否与大多数模板不同。可能回调[1]方法应该是getGridHtml(),而不是对模板调用getHtml()?不,这没有多大意义。。。因为“编程方法”在调用createBlock后直接调用toHtml()。呃,1。最好在这里更新您的原始问题,以便用于评论。它流动性更好,不会对其他人隐藏信息2。回调[0]中有什么内容?3.失败之前呈现了哪些块?您可能应该使用adminhtml/sales\u order\u网格扩展的块之一。adminhtml块应该在管理中使用/呈现,而不是在前端。
    <reference name="content">
        <block type="adminhtml/sales_order_grid" name="orders_widget"/>
    </reference>
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;
}