2010-04-22 70 views
0

我想擴展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 ::方法。

覆蓋這些功能的最佳方法是什麼?

回答

3

您的文章是有點不清楚,但我認爲你正在運行到僅能夠覆蓋是在繼承的底部類的Magento的限制鏈。

下面是Magento的覆蓋系統的工作原理。我將使用模型作爲示例,但它也適用於助手和塊。

當Magento需要實例化一個可重寫的類時,它不使用new關鍵字。

$foo = new FooBar(); 

改爲在全局Mage對象上調用靜態工廠方法。

$foo = Mage::getModel('foo/bar'); 

getModel做什麼是轉字符串「富/酒吧」爲實際的類名。它基於一系列規則來做到這一點,其中之一是檢查所有模塊配置是否有任何覆蓋。一旦類名被確定,一個對象就被實例化了。

這樣做的效果很好,但這意味着你可能只有重寫一個類的實例化。沒有辦法覆蓋父類的方法,因爲這些方法是通過普通的PHP機制繼承的。

澄清:那麼,讓我們說你有延伸酒吧

class Bar 
{ 
    public function example() 
    { 
    } 
} 

class Foo extends Bar 
{ 
    public function example() 
    { 
     return parent::example(); 
    } 
} 

類Foo和重寫class Bar喜歡的東西

//magento configured ot use Baz in place of Bar 
class Baz 
{ 
} 

當有人實例化一個Foo對象,並調用示例方法,parent將解析爲類Bar,即使您已覆蓋cla在Magento配置中的ss酒吧。

+0

謝謝艾倫,我明白你必須重寫在鏈的底部的子類,所以我想這意味着,而不是擴展Mage_Catalog_Block_Product_View我會擴展Mage_Review_Block_Product_View_List它似乎很奇怪,因爲它是在評論。是否有一種簡單的方法來查看應該擴展的類是什麼類? 當你說「但它意味着你可能只能覆蓋類的實例化」,你只是指最後一個調用該類的類。順便說一句,我從你的文章中學到了我的Magento開發的大部分內容 – 2010-04-22 14:12:21

+0

更新了我正在駕駛的內容,這可能會也可能不會解決你之後的問題。很高興你喜歡這些有用的文章! – 2010-04-22 14:53:34

+0

ahh是啊,那就是我認爲你的意思,所以我想唯一的選擇是擴展Foo,即使它沒有意義 – 2010-04-22 17:15:25

1

你確定你已經正確覆蓋了類嗎? (我的意思是把你的模塊的config.xml中<重寫>標籤,讓Magento的知道你要重寫這個類) 如果是,請更清晰言傳要擴展什麼,你認爲什麼是不工作

+0

是的一切都設置正確,因爲我知道它擊中我的課,我已經調試它,並看到它的工作。它只是在另一個類的後面運行並調用parent :: _ prepareLayout(),這當然會調用Mage_Catalog_Block_Product_View而不是我的類。 – 2010-04-22 11:56:44

+0

是的,這很正常,因爲該類具有Mage_Catalog_Block_Product_View,因爲它是父級。我認爲我現在明白你在說什麼,但我不認爲你可以做任何事情,因爲類擴展機制很簡單(你說類X擴展了Mage_Catalog_Block_Product_View,不是這樣的:class X extends Mage :: getBlock( 'catalog/product_review') - 所以你可以重寫)。唯一的解決方案是重寫調用它的父類,並修改它的_prepareLayout太 – matei 2010-04-22 12:06:47

+0

是的,我擴展了這一點,但不知道該怎麼做,我想把我的_prepareLayout中的所有東西都放在那個中?因爲我不能調用MyClass :: _ prepareLayout(),因爲它不是靜態函數,也不是我的類層次結構中的其他類。我不得不認爲人們已經以某種方式擴展了這個類的擴展,但我想他們可能不得不修改它們。 – 2010-04-22 12:21:28

1

有三個選項的位置:

  1. 覆蓋所有子類爲好,使他們正確地從你的類下降(或者至少打電話給你以某種方式類)。

  2. 將父類放到app/code/local/文件夾中,以便Magento找到它而不是默認的文件夾。所以你要創建目錄app/code/local/Mage/Catalog/Block/Product/並將View.php複製到它。這對於升級來說是一個問題,但是,因爲你必須合併Varien對班級所做的任何改變。

  3. 放棄重寫並將其更改爲模板。這可能是所有的最佳選擇,因爲您不必擔心_prepareLayout方法的更改。

希望幫助, 喬

+0

1.是的,這似乎有點像我想要做的簡單事情,所以我覺得必須有更好的方法。 2.我可能只是在這樣做後永遠這樣做。 3。我只是不確定如何在模板中進行更改,因爲我試圖只更改產品頁面的元標題和說明,對於描述我必須獲取產品名稱。 – 2010-04-22 12:24:15