覆盖核心/ Review / Block / Product / View.php中的getReviewsCollection()不能按预期工作

时间:2014-12-23 22:05:47

标签: magento

我需要修改getReviewsCollection()功能以包含相关产品。

app/code/local/Mage/Review/Block/Product中的View.php副本与已编辑的getReviewsCollection()函数一起使用,效果与预期一致。所有相关产品的评论都显示在产品评论页面上(在“review / product_view_list”块中)。

因为它似乎按照我想要的方式工作,所以我尝试创建一个扩展而不是local/Mage。我把它放在app/code/local/Example/Review中。我在etc/modules中放了一个Example_Review.xml文件。我在app/code/local/Example/Review/etc中放了一个config.xml。

config.xml看起来像这样:

<?xml version="1.0" ?>
<config>
  <modules>
    <Example_Review>
      <version>0.1.0</version>
    </Example_Review>
  </modules>
  <global>
    <blocks>
      <review>
        <rewrite>
          <product_view>Example_Review_Block_Product_View</product_view>
        </rewrite>
      </review>
    </blocks>
  </global>
</config>

View.php看起来像这样:

class Example_Review_Block_Product_View extends Mage_Review_Block_Product_View
  {
  ...
  }

它不再像local/Mage案例那样有效。看起来旧的原始getReviewsCollection()函数正在“review / product_list”块中使用。我在app/design/frontend/default/theme/template/review/product/view/list.phtml中插入以下内容确认了我的怀疑:

  

echo $ this-&gt; getReviewsCollection() - &gt; getSelect();

由与原始getReviewsCollection()匹配的mysql查询 - 而不是Example_Review_Block_Product_View中新编辑的查询。此外,把

  

echo $ this-&gt; getReviewsCollection() - &gt; getSelect();

app/design/frontend/default/theme/template/catalog/product/view.phtml中的

行给出了一个与新编辑的getReviewsCollection()匹配的不同mysql查询。

总而言之,问题是Magento在“review / Product_View”块中使用了已修改的getReviewCollection(),但同时使用了“review / Product_View_List”中的原始getReviewCollection()块。为什么?为什么把它放在local/Mage中可以避免这个问题?

我通过在app/code/local/Mage/Review/Block/Product/View中放入List.php的副本并添加了已编辑的getReviewsCollection()函数的精确副本(同时还将重写添加到config.xml)来解决这个问题。它有效,但似乎是一种愚蠢的做事方式。

再一次,我错过了什么?必须有一些我不太了解覆盖块的事情。

1 个答案:

答案 0 :(得分:2)

我觉得回答有点迟,让我继续。

这是发生的,如果你责备某人,它应该去建筑。

  

如果你看看:app / code / core / Mage / Review / Block / Product / View / List.php

*请注意课程延伸的父课程。

class Mage_Review_Block_Product_View_List extends Mage_Review_Block_Product_View
{ 
    protected $_forceHasOptions = false;

    public function getProductId()
    {
        return Mage::registry('product')->getId();
    }

    protected function _prepareLayout()
    {
        parent::_prepareLayout();

        if ($toolbar = $this->getLayout()->getBlock('product_review_list.toolbar')) {
            $toolbar->setCollection($this->getReviewsCollection());
            $this->setChild('toolbar', $toolbar);
        }

        return $this;
    }

    protected function _beforeToHtml()
    {
        $this->getReviewsCollection()
            ->load()
            ->addRateVotes();
        return parent::_beforeToHtml();
    }

    public function getReviewUrl($id)
    {
        return Mage::getUrl('review/product/view', array('id' => $id));
    }
}

您是否注意到这部分代码:

$toolbar->setCollection($this->getReviewsCollection());

他们从Mage_Review_Block_Product_View扩展?

这就是为什么即使你覆盖Mage_Review_Block_Product_View,仍然会使用Mage核心View.php类的getReviewsCollection方法而不是你的。

解决方案:您还需要覆盖List.php类。

  

config.xml中

    <blocks>
        <review>
            <rewrite>
                <product_view>Namespace_Extension_Block_Product_View</product_view>
                <product_view_list>Namespace_Extension_Block_Product_View_List</product_view_list>
            </rewrite>
        </review>
    </blocks>
  

Namespace_Extension_Block_Product_View_List.php

class Namespace_Extension_Block_Product_View_List extends Namespace_Extension_Block_Product_View
{

    protected $_forceHasOptions = false;

    public function getProductId()
    {
        return Mage::registry('product')->getId();
    }

    protected function _prepareLayout()
    {
        parent::_prepareLayout();

        if ($toolbar = $this->getLayout()->getBlock('product_review_list.toolbar')) {
            $toolbar->setCollection($this->getReviewsCollection());
            $this->setChild('toolbar', $toolbar);
        }

        return $this;
    }

    protected function _beforeToHtml()
    {
        $this->getReviewsCollection()
            ->load()
            ->addRateVotes();
        return parent::_beforeToHtml();
    }

    public function getReviewUrl($id)
    {
        return Mage::getUrl('review/product/view', array('id' => $id));
    }
} 

现在,修改后的View.php及其getReviewsCollection方法应该在您对其进行更改时起作用。