我想擴展Mage_Catalog_Block_Product_View我已經在我的本地版本中設置了它,並且一切工作正常,但我沒有得到我想要的結果。然後,我看到另一個班級也擴展了這個班級。這似乎重置了我班的任何設置。我知道我的班級工作正常並正在執行。它只是有另一個類是我正在擴展的同一個類的子類,並調用parent ::方法爲我重寫的同一個方法,該類在我的類之後執行,當它執行時,它正在運行原始方法,我重寫,與我無關你如何覆蓋由父類::方法調用另一個類的類
這是函數
class Mage_Review_Block_Product_View extends Mage_Catalog_Block_Product_View
protected function _prepareLayout()
{
$this->getLayout()->createBlock('catalog/breadcrumbs');
$headBlock = $this->getLayout()->getBlock('head');
if ($headBlock) {
$title = $this->getProduct()->getMetaTitle();
if ($title) {
$headBlock->setTitle($title);
}
$keyword = $this->getProduct()->getMetaKeyword();
$currentCategory = Mage::registry('current_category');
if ($keyword) {
$headBlock->setKeywords($keyword);
} elseif($currentCategory) {
$headBlock->setKeywords($this->getProduct()->getName());
}
$description = $this->getProduct()->getMetaDescription();
if ($description) {
$headBlock->setDescription(($description));
} else {
$headBlock->setDescription($this->getProduct()->getDescription());
}
}
return parent::_prepareLayout();
}
我想有以下修改它只是有點,記住我知道有一個標題前綴和後綴,但我只需要它的產品頁面,我也需要添加文字的描述。
class MyCompany_Catalog_Block_Product_View extends Mage_Catalog_Block_Product_View
protected function _prepareLayout()
{
$storeId = Mage::app()->getStore()->getId();
$this->getLayout()->createBlock('catalog/breadcrumbs');
$headBlock = $this->getLayout()->getBlock('head');
if ($headBlock) {
$title = $this->getProduct()->getMetaTitle();
if ($title) {
if($storeId == 2){
$title = "Pool Supplies Fast - " .$title;
$headBlock->setTitle($title);
}
$headBlock->setTitle($title);
}else{
$path = Mage::helper('catalog')->getBreadcrumbPath();
foreach ($path as $name => $breadcrumb) {
$title[] = $breadcrumb['label'];
}
$newTitle = "Pool Supplies Fast - " . join($this->getTitleSeparator(), array_reverse($title));
$headBlock->setTitle($newTitle);
}
$keyword = $this->getProduct()->getMetaKeyword();
$currentCategory = Mage::registry('current_category');
if ($keyword) {
$headBlock->setKeywords($keyword);
} elseif($currentCategory) {
$headBlock->setKeywords($this->getProduct()->getName());
}
$description = $this->getProduct()->getMetaDescription();
if ($description) {
if($storeId == 2){
$description = "Pool Supplies Fast - ". $this->getProduct()->getName() . " - " . $description;
$headBlock->setDescription(($description));
}else{
$headBlock->setDescription(($description));
}
} else {
if($storeId == 2){
$description = "Pool Supplies Fast: ". $this->getProduct()->getName() . " - " . $this->getProduct()->getDescription();
$headBlock->setDescription(($description));
}else{
$headBlock->setDescription($this->getProduct()->getDescription());
}
}
}
return Mage_Catalog_Block_Product_Abstract::_prepareLayout();
}
這executs很好,但後來我發現下面的類Mage_Review_Block_Product_View_List擴展延伸Mage_Review_Block_Product_View和延伸Mage_Catalog_Block_Product_View爲好。這個類中,他們稱之爲_prepareLayout以及和調用父類與父母:: _ prepareLayout()
class Mage_Review_Block_Product_View_List extends Mage_Review_Block_Product_View
protected function _prepareLayout()
{
parent::_prepareLayout();
if ($toolbar = $this->getLayout()->getBlock('product_review_list.toolbar')) {
$toolbar->setCollection($this->getReviewsCollection());
$this->setChild('toolbar', $toolbar);
}
return $this;
}
所以,很顯然這只是叫我延伸的同一類和運行我overiding的功能,但它不去我的課,因爲它不在我的類層次結構中,並且因爲它在我的課程後被調用,所以父類中的所有東西都會覆蓋我所設置的內容。
我不確定擴展這種類型和方法的最佳方式,必須有一個很好的方法來做到這一點,我試圖覆蓋這些準備方法時遇到問題派生自抽象類,似乎有這麼多的類覆蓋它們並調用parent ::方法。
覆蓋這些功能的最佳方法是什麼?
謝謝艾倫,我明白你必須重寫在鏈的底部的子類,所以我想這意味着,而不是擴展Mage_Catalog_Block_Product_View我會擴展Mage_Review_Block_Product_View_List它似乎很奇怪,因爲它是在評論。是否有一種簡單的方法來查看應該擴展的類是什麼類? 當你說「但它意味着你可能只能覆蓋類的實例化」,你只是指最後一個調用該類的類。順便說一句,我從你的文章中學到了我的Magento開發的大部分內容 – 2010-04-22 14:12:21
更新了我正在駕駛的內容,這可能會也可能不會解決你之後的問題。很高興你喜歡這些有用的文章! – 2010-04-22 14:53:34
ahh是啊,那就是我認爲你的意思,所以我想唯一的選擇是擴展Foo,即使它沒有意義 – 2010-04-22 17:15:25