2013-04-01 67 views
7

Tôi chỉ cần thêm một phương thức vào lớp Mage_Core_Model_Abstract.Ghi đè/Mở rộng lớp Tóm tắt Magento?

Cho rằng, trong config.php của tôi, tôi có

<models> 
    <mymodule> 
     <class>Mynamespace_Mymodule_Model</class> 
    </mymodule> 
    <core> 
     <rewrite> 
      <mage_core_model_abstract>Mynamespace_Mymodule_Model_Abstract</mage_core_model_abstract> 
     </rewrite> 
    </core> 
</models> 

Nó không thực sự làm việc ..

Tôi biết rằng có một cách để "trọng" bằng cách sao chép tất cả các cấu trúc thư mục bao gồm cả tệp lớp học vào mô-đun của tôi, nhưng tôi muốn biết liệu có cách nào làm cho nó trở nên lạ mắt hơn, trong mô-đun của tôi - một cái gì đó tương tự như trên ..

+0

Thường xuyên (không phải lúc nào), khi có nhu cầu ghi đè lên một siêu lớp, có cách tốt hơn. Bạn đang cố gắng làm gì? – benmarks

+0

Cách nào tốt hơn? Hãy chia sẻ! Trong trường hợp cụ thể này, giả sử tôi cần phải tạo một phương thức mới để cung cấp cho tất cả trẻ em và mặt khác để thêm một số logic bổ sung vào một cái hiện có .. – Michael

+1

Tiềm năng cho cách "tốt hơn" phụ thuộc vào cần và liệu nó có thể được cung cấp bởi kiến ​​trúc sự kiện hay không; những gì bạn muốn làm * cụ thể * trong một phương pháp "mới" sẽ xác định điều này. Nếu có nhu cầu thay đổi một cách thống nhất một phương thức được định nghĩa trong một abstract, cách tốt nhất * là * ghi đè đường dẫn thay vì lặp lại logic lặp đi lặp lại cho các lớp con (IMO, DRY> sở hữu định nghĩa cốt lõi). – benmarks

Trả lời

13

Bạn chỉ có thể ghi lại các lớp mà bạn khởi tạo trực tiếp, từ config.xml.

Các giá trị khác nhau trong config.xml được sử dụng khi tạo đối tượng thông qua nhà máy (ví dụ: Mage::getModel($class), Mage::getSingleton($class), Mage::helper($class), v.v ...). Giá trị của đối số $class được sử dụng để dịch catalog/product thành Mage_Catalog_Model_Product.

Điều này có nghĩa là không thể viết lại các lớp (trong ý nghĩa Magento) được sử dụng làm lớp siêu lớp, bao gồm các lớp trừu tượng (theo định nghĩa).

Nếu bạn muốn xác định lại bất kỳ lớp nào được sử dụng làm siêu lớp, thì bạn sẽ cần đặt một tệp ở đúng vị trí tiếp tục thêm đường dẫn bao gồm. Trong trường hợp này, bạn cần tạo một tệp trong app/code/local/Mage/Core/Model/Abstract.php.

+0

Vâng, ngay cả khi tôi không thực sự thích nó, có vẻ là giải pháp duy nhất .. Cảm ơn! – Michael

+0

Tại sao chỉ tạo một bản sao không hoạt động đối với tôi? Tôi có cùng một đường dẫn, 'core/Mage/Eav/Model/Entity/Attribute/Abstract.php' ->' local/Mage/Eav/Model/Entity/Attribute/Abstract.php', nhưng nó không tải cục bộ , chỉ là cốt lõi. Có một bước không được đề cập? –