Події спостерігача Magento - порядок операцій


9

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

Я бачу, що CatalogInventoryспостерігає за цією подією та встановлює деяку стандартну інформацію про акції. Чи можна мені гарантувати, що основні події вирішаться перед моїми місцевими жителями? Чи є тут порядок операцій, на який я можу покластися?

Відповіді:


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 для завантаження , перш ніж ваші робить.


7

Порядок розсилки подій не може бути легко гарантований. Вони залежать від порядку завантаження модулів. Зазвичай всі спостерігачі основних подій будуть викликані перед спостерігачами спільноти та місцевим кодом.

Існує метод змусити спостерігачів магенто вистрілити за замовленням, "підробляючи" залежність основного модуля від локального або спільного. Подивіться на відповідь Лі тут: Складіть спеціальний вогонь спостерігача перед існуючим спостерігачем 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>

Мені особисто не подобається такий підхід, оскільки я не знаю, які наслідки викликає така залежність.

У вашому випадку використання звучить, що вам слід зробити якесь виявлення даних / стану, щоб знати, було вистрілено чи ні. Перевірка даних / стану на моделі була б кращою, ніж спроба насильницького порядку події.


У моєму випадку, однак, мені нічого робити, якщо товарний товар ще не існує. Будь-які думки щодо пізнішої події, яку я міг би нюхати, щоб побачити, чи це результат дублюючого методу?
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

Ви будете економити модель інвентарю, а не товар, тому ви не повинні потрапляти в цикл.
Петро Джамбазов
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.