Jak prawidłowo wyłączyć przepisywanie (modelowe)

10

Istnieje rozszerzenie innej firmy, które przepisuje określoną klasę podstawową Magento. Nie powinno mieć znaczenia, czy jest to blok, pomocnik czy model, ale w tym przypadku jest to model. Teraz napotykam, że to przepisywanie jest złe i chciałbym je wyłączyć bez zmiany rozszerzenia strony trzeciej. Dlatego piszę niestandardowe rozszerzenie, które zależy od rozszerzenia strony trzeciej. Jaki jest najlepszy sposób na wyłączenie przepisywania strony trzeciej? Bezpiecznym, o którym mogę myśleć, jest zdefiniowanie niestandardowego przepisywania, które jest używane zamiast przepisywania przez inną firmę:

<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, klasa bezpośrednio wywodzi się z klasy Mag i dlatego wyłącza przepisywanie przez inne firmy:

class Custom_Extension_Model_Sth extends Mage_Core_Model_Sth
{

}

To działa, ale nie wydaje się zbyt dobre. Myśląc o obserwatorach, można je wyłączyć tylko poprzez config.xml poprzez ustawienie ich na disabled. Czy coś takiego jest możliwe przy przepisywaniu? Próbowałem użyć następujących i działa:

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

Ale czy to bezpieczne? Czy to działa we wszystkich wersjach? Nigdy nie widziałem tego na wolności, dlatego pytam.

Szymon
źródło

Odpowiedzi:

1

Dopóki węzeł jest naprawdę pusty, magento pomyśli, że nie było przepisywania i „użyj prefiksu klasy, aby utworzyć nazwę klasy”, jeśli węzeł nigdy nie był ich. W Mage_Core_Model_Config::getGroupedClassName.

Sądzę jednak, że powinieneś <sth/>raczej używać zamiast <sth></sth>przestać formatować zmieniając tag tak, aby nie był pusty ('\ n' w oczach magento), co spowoduje błąd, w którym nie znaleziono klasy.

Nie wierzę, że istnieje opcja „wyłącz” dla pomocników, bloków lub modeli. Możesz także użyć Observera (który przywróci konfigurację dokładnie tak, jak powinna być dokładnie), ale problem, który z tym widzę, polega na tym, że zmuszasz dowolny moduł, który chce dodać to przepisanie po swoim module, do użycia obserwatora allso lub wiedzieć, aby wyłączyć swojego obserwatora przez XML.

Coś jak:

    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);
        }
    }

Więc dla mnie wygrywa sposób XML.

James Anelay - TheExtensionLab
źródło
3

Powiedziałbym, że jeśli stworzysz moduł niestandardowy, aby temu przeciwdziałać, upewnij się, że ma on zależność od nadpisywanego modułu.

Aby zapobiec nieoczekiwanemu zachowaniu, prawdopodobnie redefiniuję przepisanie w „właściwy” sposób

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

Ostatnio natknąłem się na problem polegający na tym, że 1 pusty tag wewnątrz innego tagu nie został wykryty przez Magento, zwrócony nullzamiast obiektu, który rzucił ostrzeżenie. Nie fatalne, ale w trybie programisty i do logowania dość irytujące.

Ale brak tutaj twardych dowodów na to, że Twoja droga spowodowałaby błędy :)

Sander Mangel
źródło