Как правильно отключить (модель) переписать

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

Пока узел действительно пустой, magento будет думать, что перезаписи не было, и «использовать префикс класса для формирования имени класса», если узел никогда не был их. В Mage_Core_Model_Config::getGroupedClassName.

Тем не менее, я думаю, что вы должны использовать это <sth/>вместо того, <sth></sth>чтобы прекратить форматирование, изменив тег на не пустой ('\ n' в глазах magento), что приведет к ошибке класса not found.

Я не верю, что есть опция «отключить» для помощников, блоков или моделей. Вы также можете использовать Обозреватель (который вернет конфигурацию обратно так, как она должна быть в точности), но проблема, с которой я сталкиваюсь, заключается в том, что вы затем принудительно заставляете любой модуль, который хочет добавить это переписывание, после вашего модуля либо использовать наблюдателя, либо знать, чтобы отключить ваш наблюдатель через 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 выигрывает.

Джеймс Анелай - TheExtensionLab
источник
3

Я бы сказал, что если вы сделаете собственный модуль для противодействия этому, убедитесь, что он зависит от перезаписываемого модуля.

Чтобы предотвратить непредвиденное поведение, я бы, вероятно, переопределил переписывание «надлежащим» образом

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

Недавно столкнулся с проблемой, когда Magento не обнаружил 1 пустой тег внутри другого тега, nullвместо объекта, выдавшего предупреждение. Не смертельно, но в режиме разработчика и для регистрации довольно раздражает.

Но никакие веские доказательства здесь, чтобы доказать ваш путь, не вызовут ошибок :)

Сандер Мангель
источник