События Magento Observer - порядок действий

9

Я пытаюсь внедрить функциональность в catalog_model_product_duplicateсобытие. Частью этого модуля будет обеспечение того, чтобы складской статус дублированного продукта также дублировался; в настоящее время это не так.

Я вижу, что CatalogInventoryнаблюдает за этим событием и устанавливает некоторую стандартную биржевую информацию. Могу ли я быть уверен, что основные события разрешены до моих местных жителей? Есть ли здесь порядок операций, на который я могу положиться?

philwinkle
источник

Ответы:

11

Порядок отправки событий зависит от порядка загрузки модулей. Поскольку вам нужно быть уверенным, что CatalogInventoryнаблюдатели модуля сработают раньше, чем ваши, вам нужно просто настроить модуль так, чтобы он зависел от Mage_CatalogInventoryмодуля. Вы можете сделать это, добавив узел с зависимостями к коду в вашем app/etc/modules/My_Module.xmlфайле:

<config>
    <modules>
        <My_Module>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_CatalogInventory />
            </depends>
        </My_Module>
    </modules>
</config>

dependsУзел в приведенном выше XML является ключевой частью конфигурации здесь, так как она заставляет основной модуль Magento для загрузки , прежде чем ваши делает.

davidalger
источник
7

Порядок, в котором отправляются события, не может быть легко гарантирован. Они зависят от порядка загрузки модулей. Как правило, все основные наблюдатели событий будут вызываться до сообщества и местных наблюдателей.

Существует метод, который заставляет magento-наблюдателей запускать после пользовательского «фальсификацию» зависимости основного модуля от локального или локального. Посмотрите на ответ Ли здесь: Создайте собственный наблюдатель, стреляющий перед существующим наблюдателем Magento .

/app/etc/modules/Groupname_Page.xml

<config>
    <modules>
        <Groupname_Page>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <!-- Your dependencies go here -->
            </depends>
        </Groupname_Page>
        <Enterprise_PageCache>
            <depends>
                <Groupname_Page />
            </depends>
        </Enterprise_PageCache>
    </modules>
</config>

Мне лично не нравится такой подход, поскольку я не знаю, какие последствия может вызвать эта зависимость.

Для вашего случая использования, вам кажется, что вы должны выполнить какое-то обнаружение данных / состояния, чтобы узнать, были ли они запущены или нет. Проверка данных / состояния в модели предпочтительнее, чем попытка форсировать порядок событий.

beeplogic
источник
В моем случае, однако, мне нечего делать, если товар на складе еще не существует. Есть какие-нибудь мысли о более позднем событии, которое я мог бы понюхать, чтобы увидеть, было ли это результатом дублирующего метода?
Philwinkle
5

Общий ответ

Наблюдатели выполняются сначала по области , а затем по порядку загрузки модуля.

Это означает, что все зарегистрированные наблюдатели <global>выполняются раньше всех наблюдателей, зарегистрированных в <frontend>или <adminhtml>.

Внутри области наблюдатели выполняются в порядке их появления в объединенном XML-дереве конфигурации, что технически означает порядок загрузки модулей.

Порядок загрузки модуля определяется следующим образом:

  1. Граф зависимостей строится из <depends>определений в app/etc/modules/*.xml. Если X зависит от Y, Y загружается до X.

  2. После упорядочения по зависимостям основные модули имеют приоритет над сообществом и локальными модулями.

  3. Все остальное загружается в алфавитном порядке. Обратите внимание, что app/etc/modulesдля сравнения используется имя файла в , а не фактическое имя модуля.

Таким образом, у вас есть две возможности повлиять на порядок загрузки модуля:

  1. зависит от другого модуля, чтобы ваши наблюдатели выполнялись после него (или заставьте другой модуль зависеть от вашего, чтобы они выполнялись раньше)
  2. Переименуйте файл определения модуля. Вам не нужно переименовывать сам модуль, потому что имя файла не имеет значения ни для чего, кроме порядка загрузки.

(«3. добавить ваш модуль в основной пул кода» не считается)

Смотрите также:

Фабиан Шменглер
источник
1

Просто предложение, наблюдайте catalog_model_product_duplicateи catalog_model_product_save_afterс синглтон-наблюдателем. В catalog_model_product_duplicateнаборе данных инвентаризации в качестве данных наблюдений, а также в catalog_model_product_save_afterиспользовании , что данные для заполнения инвентаря для дублированного продукта.

Петар Джамбазов
источник
Итак, вы предлагаете сохранить свойство для объекта, который был передан мне в событии, а затем протестировать его на catalog_model_product_save_after..., которое может работать. Единственным подводным камнем будет сохранение собственности без звонка save()... есть мысли?
Philwinkle
Вы будете сохранять модель инвентаря, а не продукт, так что вы не должны зацикливаться.
Петар Джамбазов