Где я ошибаюсь, используя шаблон наблюдателя Magento?

Я прочитал много документации о создании пользовательских модулей для Magento.

Для моей первой попытки я создал структуру модуля, используя Модуль Creator, и это код, который я добавил в /app/code/local/Test/MyModule/etc/config.xml:

<?xml version="1.0"?>
<config>
    <modules>
        <Test_MyModule>
            <version>0.1.0</version>
        </Test_MyModule>
    </modules>
    <!-- frontend, admin, adminhtml -->
    <global>
        <!-- models, resources, blocks, helpers -->
        <events>
          <sales_order_place_before> <!-- event i need to catch -->
            <observers>
              <trigger_mymodule_placeorder> 
                <type>model</type>
                <class>test/mymodule/model_observer</class>
                <method>sendOrder</method>
              </trigger_mymodule_placeorder>
            </observers>
          </sales_order_place_before>
        </events>
    </global>
</config> 

Мой /app/etc/modules/Test_MyModule.xml файл:

<?xml version="1.0"?>
<config>
    <modules>
        <Test_MyModule>
            <active>true</active>
            <codePool>local</codePool>
        </Test_MyModule>
    </modules>
</config> 

А это мой /app/code/local/Test/MyModule/Model/Observer.php:

<?php
class Test_MyModule_Model_Observer
{
    public function sendOrder()
    {
        // do something.
    }
}

.. но функция Test_MyModule_Model_Observer::sendOrder() никогда не запускается (я попытался поместить в нее фиктивный регистратор базы данных, чтобы увидеть, когда и когда функция выполняется).

Я знаю, что сам модуль загружается правильно, потому что в config.xml модуля он объявляет новую ссылку в главном меню, и ссылка отображается правильно (после очистки кеша magento), поэтому я предполагаю, что проблема заключается в соглашении об именах функций, которое я где-то пропал.. но где?


person Strae    schedule 26.01.2012    source источник


Ответы (1)


У вас есть две проблемы, которые, как я вижу, связаны между собой. Вы указываете класс для использования с использованием синтаксиса, который принимает Mage::getModel, но вы а.) немного ошибаетесь в синтаксисе, б.) по-видимому, фактически не объявляете, где находятся ваши модели (если только вы не убрали его для того, чтобы быть более кратким).

Вам нужно добавить свои модели в глобальный узел.

<models>
   <testmodule>
       <class>Test_MyModule_Model</class>
   </testmodule>
<models>

Часть testmodule может быть чем угодно, если она уникальна для вашего модуля. Затем значение класса, используемое в части наблюдателя, станет...

<class>testmodule/observer</class>
person Peter O'Callaghan    schedule 26.01.2012
comment
Более того, я бы предложил общедоступной функции sendOrder() принимать аргумент $observer, поэтому это будет общедоступная функция sendOrder($observer) - person Jevgeni Smirnov; 26.01.2012
comment
Строго не обязательно, но вы правы, это, безусловно, добавит ясности. - person Peter O'Callaghan; 26.01.2012
comment
работал как шарм! @JevgeniSmirnov да, вы правы, в реальной функции я возьму аргумент наблюдателя, чтобы сделать то, что должна делать функция; функция, которую я разместил, была просто примером;) - person Strae; 26.01.2012