2013-01-08 23 views
2

我想重寫模式:的Magento - > Rerewrite模型

Mage_Sales_Model_Quote_Address 

但是我用的是附加 「Payone」,它已經覆蓋了它:

 <sales> 
      <rewrite> 
       <quote_address>Payone_Core_Model_Sales_Quote_Address</quote_address> 
      </rewrite> 
     </sales> 

我想:

 <core> 
      <rewrite> 
       <sales_quote_address>Mycomp_Mymod_Model_Quote_Address</sales_quote_address> 
      </rewrite> 
     </core> 

但是,這是行不通的。任何提示?

回答

5

除非我的記憶我想不起來了,你會想使自己的模塊上的模塊「依賴」,讓你的重寫是最後和生效。您可以通過添加這樣做如下處理節點內的app/etc/modules/My_Module.xml文件:

<depends> 
    <Their_Module /> 
</depends> 

一旦你這樣做,有你的類擴展他們:

class My_Module_Model_Quote_Address extends Payone_Core_Model_Sales_Quote_Address 

如果你能做到你所需要的使用事件觀察者,然後做那。但是如果你需要重寫,上面會在那裏你需要得到你。

+0

雖然這確實不錯,但我並不完全滿意這個解決方案,因爲它使得更難以禁用模塊。儘管現在可能仍然是最簡單的選擇。 –

+0

+1,因爲它是最好的解決方案......這是一個PHP問題(缺少多重繼承)而不是Magento問題 - 雖然它確實遭受了這個問題。 –

+1

@Lucasmus我同意,由於你提到的原因,觀察者/鉤子/多重繼承會更好,所以不一定是處理這類問題的最好方法。正如丹尼爾所說,這是PHP成爲單一繼承語言的結果。 PHP 5.4將增加對[traits](http://php.net/manual/en/language.oop5.traits.php)的支持,但我懷疑Magento會被重新設計使用它們(並且要求使用PHP 5.4)。所以現在我們仍然堅持使用模塊所建立的語言和平臺的能力。 :) – davidalger

0

你將不得不以某種方式將這些文件合併成一個文件,並使用該文件,因爲Magento的不支持默認情況下,同一文件的多個覆蓋。

Aitoc,Magento的擴展開發,船舶用自己的模塊定製改寫擴展,它似乎處理這個問題,多動,如果它檢測到該自動覆蓋成一片。我還沒有測試過,但也許它可以幫助你。

+3

AITOC模塊的重寫系統是一件我不會碰到十腳的垃圾。它造成比它的價值更多的麻煩。 – davidalger

+0

好的,謝謝:-)那麼我也知道。 –

3

最好的辦法是使用觀察者insted的你重寫的(相信我,你可以做出很多修改,而不重寫。<model>_load_after<model>_save_before<model>_save_after<model>_load_after是非常強大)。

但是,如果你還需要做出重寫你可以添加depends節點到你的模塊(以確保它會Payone後加載)和重寫Payone_Core_Model_Sales_Quote_Address代替Mage_Sales_Model_Quote_Address

有解決這個問題的另一種方式:合併班級中的所有更改並刪除以前的重寫。但是這樣會增加整個系統的混亂並影響模塊化的完整性。

1

嗯......它從大衛·阿爾傑的答案......上面的回答失蹤,是在事件觀察者一個更加完善的架構方法,使用對象組合與目標工作,如果你能避免延長。

讓我解釋爲什麼它不爲你工作:

當系統配置是從所有模塊加載,加載它可以以任意順序.xml文件被消耗。當發出重寫,Magento的配置使得記錄在同一水平作爲配置XML層次結構這將引用類<class> Mage_Sales_Model_Quote_Addess </class>

每當Magento的加載類,它會檢查@那層級的<rewrite> Payone_Sales_Model_Quote_Address </rewrite>節點,如果它存在,則加載它,否則加載類節點(如果它不存在)。

通過放置<depends><Thier_Module></depends>節點,重寫將在配置加載時最後加載,並在此節點級別替換它們的重寫。

......有不理解的問題...

...這會導致你的問題的基礎功能是未來的模塊介紹可以重寫你的模塊,你要去被劃傷你的頭......如果你引入另一個模塊來重寫同一個類,會發生什麼?