Làm thế nào để vô hiệu hóa đúng cách viết lại (Model)


10

Có một phần mở rộng của bên thứ ba viết lại một lớp lõi Magento cụ thể. Nó không phải là vấn đề nếu nó là một khối, người trợ giúp hoặc mô hình, nhưng trong trường hợp này nó là một mô hình. Bây giờ tôi gặp phải việc viết lại này là xấu và tôi muốn vô hiệu hóa nó mà không thay đổi phần mở rộng của bên thứ ba. Do đó, tôi viết một tiện ích mở rộng tùy chỉnh phụ thuộc vào tiện ích mở rộng của bên thứ ba. Cách tốt nhất để vô hiệu hóa viết lại bên thứ ba là gì? Cách an toàn tôi có thể nghĩ đến là xác định viết lại tùy chỉnh, được sử dụng thay vì viết lại bên thứ ba:

<global>
    <models>
        <custom_extension>
            <class>Custom_Extension_Model</class>
        </custom_extension>
        <mage_core>
            <rewrite>
                <sth>Custom_Extension_Model_Sth</sth>
            </rewrite>
        </mage_core>
    </models>
</global>

Sth.php, lớp trực tiếp kéo dài từ lớp Mage và do đó vô hiệu hóa việc viết lại của bên thứ ba:

class Custom_Extension_Model_Sth extends Mage_Core_Model_Sth
{

}

Điều này hoạt động, nhưng không cảm thấy quá tốt. Suy nghĩ về các nhà quan sát, có thể vô hiệu hóa chúng chỉ thông qua config.xml bằng cách đặt chúng thành disabled. Là một cái gì đó như thế này có thể với viết lại? Tôi đã thử sử dụng như sau và nó hoạt động:

<global>
    <models>
        <mage_core>
            <rewrite>
                <sth></sth>
            </rewrite>
        </mage_core>
    </models>
</global>

Nhưng nó có an toàn để làm điều đó? Nó hoạt động trong tất cả các phiên bản? Tôi chưa bao giờ thấy điều đó trong tự nhiên, đó là lý do tại sao tôi hỏi.

Câu trả lời:


1

Khi nút này thực sự trống rỗng, magento sẽ nghĩ rằng không có viết lại và 'sử dụng tiền tố lớp để tạo thành tên lớp' nếu nút không bao giờ là của họ. Trong Mage_Core_Model_Config::getGroupedClassName.

Tuy nhiên, tôi nghĩ rằng bạn nên sử dụng <sth/>thay vì <sth></sth>dừng định dạng thay đổi thẻ thành không trống ('\ n' trong mắt magento) sẽ gây ra lỗi không tìm thấy lớp.

Tôi không tin rằng có một tùy chọn 'vô hiệu hóa' cho người trợ giúp, khối hoặc mô hình. Bạn cũng có thể sử dụng một Observer (sẽ đưa cấu hình trở lại chính xác như thế nào) nhưng vấn đề tôi gặp phải là bạn buộc bất kỳ mô-đun nào muốn thêm lại đó sau khi mô-đun của bạn sử dụng một trình quan sát hoặc để biết vô hiệu hóa người quan sát của bạn thông qua XML.

Cái gì đó như:

    public function controllerActionPredispatch(Varien_Event_Observer $event)
    {
        $helper = Mage::helper('webtise_foundationalerts');
        if (! $helper->isAdmin()) {
            $node = Mage::getConfig()->getNode('global/models/core/rewrite');
unset($node->sth);
        }
    }

Vì vậy, đối với tôi cách XML chiến thắng.


3

Tôi sẽ nói nếu bạn tạo một mô-đun tùy chỉnh để chống lại điều này, hãy chắc chắn rằng nó có sự phụ thuộc vào mô-đun đó là ghi đè.

Để ngăn chặn hành vi không mong muốn, tôi có thể xác định lại việc viết lại theo cách 'phù hợp'

<global>
    <models>
        <mage_core>
            <rewrite>
                <sth>Mage_Core_Model_Sth</sth>
            </rewrite>
        </mage_core>
    </models>
</global>

Gần đây đã phát hiện ra một vấn đề trong đó 1 thẻ trống bên trong một thẻ khác không được Magento phát hiện, được trả lại nullthay vì một đối tượng đã đưa ra cảnh báo. Không gây tử vong nhưng trong chế độ nhà phát triển và để đăng nhập khá khó chịu.

Nhưng không có bằng chứng cứng ở đây để chứng minh cách của bạn sẽ gây ra lỗi :)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.