我需要修改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)来解决这个问题。它有效,但似乎是一种愚蠢的做事方式。
再一次,我错过了什么?必须有一些我不太了解覆盖块的事情。
答案 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方法应该在您对其进行更改时起作用。