20
Для добавления еще одной проверки при редактировании адреса покупателя в magento я вынужден был переопределять абстрактный класс в magento. Вот этот класс Mage/Customer/Model/Address/Abstract.php
Первым делом я написал по стандарту вот так в файле моего модуля config.xml
<global>
<models>…
<customer>
<rewrite>
<address_abstract>Namespace_Modelname_Model_Customer_Address_Abstract</address_abstract>
</rewrite>
</customer>
</models>
…
Но такой код никак не хотел работать, класс не переопределялся. Позже я выяснил, что так и де работает в magento.
Абстрактные классы нужно переопределять только скопировав нужный класс со всей иерархией из ядра в папку local.
Вот отсюда app/code/core/Mage/Customer/Model/Address/Abstract.php
вот сюда app/code/local/Mage/Customer/Model/Address/Abstract.php
До версии 1.6.2 включительно работает, проверял. Если не работает, то стоит первым делом почистить кеш.
Спасибо за внимание. На вопросы отвечу в комментариях
Обращаю внимание читателей, что после такого переопределения вы сразу теряете возможность обновлять Magento (а также возможно нарушение совместимости со сторонними модулями, которые ждут стандартного поведения от стандартных классов системы).
Возможность обновления теряется не полностью, но да, согласен, вероятность того что в будущих версиях magento этот класс будет изменен очень велика. Но по крайней мере при обновлении вашей версии magento программист будет видеть, что ему нужно будет изменить после обновления. Проблемы со сторонними модулями могут возникнуть и в случае криво написанного модуля другой “фирмы” так что это не аргумент, тем более что, если правильно вызывать модели и вообще придерживаться стиля magento программирования, то никаких нарушений с совместимостью модулей быть не должно в данном случае. Кстати Дмитрий, может вы знаете как можно переопределить абстрактный класс в magento ???
Никак.
Вообще, любое переопределение стандартного класса — это зло, это минус модулю (другой модуль захочет переопределить тот же класс — и всё, система перестаёт работать).
Обычно надо стремиться, искать возможности, менять стандартную функциональность через обработку системных событий.
Да вы правы насчет переопределения одного и того же класса разными модулями. Но и системных событий бывает не хватает. Я эту проблему в своем модуле решил по другому. После вашего первого комментария, решил все таки пойти другим путем. В методе, который получает данные об успешности или ошибочности проверки адреса от абстрактного класса я добавил свой функционал (тот класс уже не абстрактный и его можно переопределить как обычно), но опять же события на этот метод я не нашел, возможно в следующих версиях magento его добавят.
Magento не имеет всех необходимых событий, поэтому без rewrite иногда никак.