0

以下布局文件包含 2 个块,它们引用 product_viewed.phtml 和 product_compared.phtml 模板。\app\design\frontend\base\default\layout\reports.xml

<layout version="0.1.0">
    <default>
        <!-- Mage_Reports -->
        <reference name="right">
            <block type="reports/product_viewed" before="right.permanent.callout" name="right.reports.product.viewed" template="reports/product_viewed.phtml" />
            <block type="reports/product_compared" before="right.permanent.callout" name="right.reports.product.compared" template="reports/product_compared.phtml" />
        </reference>
    </default>
</layout>

我在每个模板的顶部放了一个日志。如果没有最近比较的产品,product_compared.phtml 模板甚至不会被处理。IE。没有日志。

(要使最近比较的模板出现(product_compared.phtml),您需要比较一个产品,然后从“比较产品”模板中单击“全部清除”)

所以我假设最近比较的模板正在以编程方式被删除?这发生在哪里?

另外,如果我更改了块的名称,它仍然没有被处理。因此,如果块的名称不用于获取对它的引用,那么它是如何被引用以便可以删除的呢?

4

1 回答 1

2

所以我假设最近比较的模板正在以编程方式被删除?这发生在哪里?

这是一个合理的假设,但在 Magento 中并不是这样完成的Magento 使用块对象渲染模板。块对象通常包含您正在寻找的那种逻辑。

在您的情况下,该块是一个reports/product_viewed块。这意味着用于实例化呈现该块的对象的类是 Mage_Reports_Block_Product_Viewed

Commerce Bug 的别名查找选项卡

块通过它们的_toHtml方法渲染。因此,如果我们看一下Mage_Reports_Block_Product_Viewed块的_toHtml方法,我们将看到以下内容

#File: app/code/core/Mage/Reports/Block/Product/Viewed.php
protected function _toHtml()
{
    if (!$this->getCount()) {
        return '';
    }
    $this->setRecentlyViewedProducts($this->getItemsCollection());
    return parent::_toHtml();
}

因此,如果此块的getCount方法返回not true,该_toHtml方法将返回空字符串。块永远不会调用该parent::_toHtml()方法,而正是这个方法呈现了块的模板。

您可以跟踪getCount此类和父Mage_Reports_Block_Product_Abstract类中的代码,以确定发生这种情况的确切原因。但一般来说,getCount如果没有要显示的项目,则返回 0,因此该块呈现为空。reports/product_compared在(or Mage_Reports_Block_Product_Compared) 块中发生了类似的事情。

于 2013-07-23T04:45:52.287 回答