Як правильно відключити (Модель) перезапис


10

Існує стороннє розширення, яке переписує певний базовий клас Magento. Не має значення, чи це блок, помічник чи модель, але в цьому випадку це модель. Зараз я стикаюся, що це перезапис поганий, і я хотів би його відключити, не змінюючи розширення сторонніх розробників. Отже, я пишу власні розширення, які залежать від сторонніх розширень. Який найкращий спосіб відключити перезапис третьої сторони? Безпечним, про який я можу придумати, є визначення користувацького переписування, яке використовується замість перезапису сторонніх сторін:

<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, клас безпосередньо поширюється на клас Mage і тому вимикає перезапис третьої сторони:

class Custom_Extension_Model_Sth extends Mage_Core_Model_Sth
{

}

Це працює, але не дуже добре. Думаючи про спостерігачів, відключити їх можна лише через config.xml, встановивши їх на disabled. Чи можливо щось подібне з переписувачами? Я намагався використовувати наступне, і це працює:

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

Але чи безпечно це робити? Чи працює він у всіх версіях? Я ніколи не бачив цього в дикій природі, тому прошу.

Відповіді:


1

Поки вузол справді порожній, магенто буде думати, що перезаписати не було, і "використовувати префікс класу для формування назви класу", якби вузол ніколи не був їхнім. В Mage_Core_Model_Config::getGroupedClassName.

Однак я думаю, що вам слід скористатися, <sth/>а не <sth></sth>зупиняти форматування, змінюючи тег, щоб він не був порожнім ('\ n' в очах магенто), що призведе до помилки класу, не знайденого.

Я не вірю, що для помічників, блоків чи моделей існує опція "відключити". Ви також можете скористатися спостережником (який поверне конфігурацію, як це саме має бути), але проблема, яку я бачу з цим, полягає в тому, що ви змушуєте будь-який модуль, який хоче додати це перезапис після вашого модуля, або використовувати спостережника все або знати, щоб відключити свого спостерігача через XML.

Щось на зразок:

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

Тож для мене шлях XML виграє.


3

Я б сказав, якщо ви зробите спеціальний модуль для протидії цьому, переконайтеся, що він має залежність від модуля, який він перезаписує.

Щоб запобігти несподіваній поведінці, я б, мабуть, переробив переписання "належним чином"

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

Нещодавно зіткнувся з проблемою, коли Magento 1 порожній тег всередині іншого тегу не виявив, повернувся nullзамість об'єкта, який кинув попередження. Не фатально, але в режимі розробника і для ведення журналів дуже дратує.

Але жодних вагомих доказів, які підтверджують ваш шлях, не призведе до помилок :)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.