В настоящее время у меня есть модуль Magento с наблюдателем, который прослушивает следующие события:
Наблюдатель вызывает метод в модели, который упаковывает важные детали о заказе и экспортирует их по выбору клиента (JSON, CSV, XML) в удаленную систему.
У меня есть один клиент, которому требуется некоторая мутация данных, прежде чем они будут экспортированы.
То, что я хотел бы сделать, это расширить этот модуль с помощью пользовательского локального модуля, а не создавать «специальную» версию для поддержки навсегда. Я могу достаточно легко расширить модель, чтобы переопределить метод, который бы справился с этим, но я не совсем уверен, как сделать так, чтобы он вызывался.
Как я могу переопределить класс, вызываемый наблюдателем?
Это даже правильный подход к моей проблеме? Например, было бы более уместно иметь какую-то модель диспетчеризации, которая ищет настройку конфигурации, чтобы решить, какой класс будет обрабатывать процесс?
Не совсем понятно, хотите ли вы переопределить саму модель наблюдателя или хотите переопределить модель, вызванную наблюдателем.
В Mage_Core_Model_App::dispatchEvent()
, Magento использует Mage::getModel($obs['model'])
захватить модель наблюдателя. Итак, пока ваша конфигурация ссылается на наблюдателя по имени группы (т.е. modulename/modelname
вместо Foo_Modulename_Model_Modelname
), то вы можете использовать стандартные перезаписи Magento для изменения модели наблюдателя в отдельном модуле:
<config>
<global>
<models>
<!-- this is the group name of the module's models -->
<modulename>
<rewrite>
<!-- rewrite the modulename/modelname model to use a different class -->
<modelname>Bar_Modulename_Model_Modelname</modelname>
</rewrite>
</modulename>
</models>
</global>
</config>
Это работает так же, если вы хотите переопределить другую модель. Например, если ваш обозреватель звонит Mage::getModel('mymodule/order_export')
, то вам следует переписать mymodule/order_export
класс так же.
Других решений пока нет …