Тому незабаром після того, як я написав це Маттіасу, я продовжив радіо тишу. Я сподіваюся, що ви відчули напруженість, коли ви чекали цієї відповіді пару тижнів.
Що я маю на увазі під "Я роблю це в черзі" - це пряма відповідь на:
Деякі спостерігачі, такі як Enterprise_cms та enterprise_search для події store_delete_after, визначені в області адміністратора, тому вони не будуть виконані. Видалення з представлення магазину не буде оброблятися, як видалення, виконане в бекенде.
Метод черги:
Коли я знаю, що є певні події, які не спрацюють у правильному контексті (в основному для ЕЕ, але можуть застосовуватись і в інших контекстах), я зазвичай висуваю видалення в чергу, щоб воно запускалося в контексті, який йому потрібно .
Іншими словами, створіть таблицю черги (або чергу / тему в RabbitMQ тощо), яка б містила деталі транзакції та гачки подій, які її слід слухати. Це може бути настільки елегантно або настільки просто, як ви хочете. Ось основна
$queue = Mage::getModel('yourcompany/queue_job')
->setJobType('delete')
->setEntityType('core/store')
->setEntityId(12)
->setDispatchEvent('store_delete')
->setDispatchEventDataKey('store')
->save();
А потім працюйте чергою пізніше в CRON, де ви тепер маєте контроль над тим, який магазин "працює" (він же просто запущений, як ніби адміністратор, зберігайте 0):
foreach(Mage::getModel('yourcompany/queue_job')->getCollection() as $job){
if($job->getJobType()=='delete'){
$model = Mage::getModel($this->getEntityType())->load($this->getEntityId());
if ($model->getId() && $model->isCanDelete()) {
$model->delete();
Mage::dispatchEvent($job->getDispatchEvent(), array($job->setDispatchEventDataKey() => $model));
}
}
}
Очевидно, якщо тобі було цікаво, ти завершуєш спробу / ловити та завершуєш транзакцію. Я думаю, ви отримаєте суть.
Це, можливо, єдиний спосіб контролювати контекст, у якому відбувається подія.
Метод подій у тандемі:
Ви можете запустити метод "adminhtml" самостійно вручну - Алан дає досить пристойне пояснення того, що ви зробили, щоб вплинути на це , але по суті це те саме, що це:
#File: app/code/core/Mage/Adminhtml/controllers/CustomerController.php
public function saveAction()
{
//...
$customer->save();
//...
Mage::dispatchEvent('adminhtml_customer_prepare_save', array(
'customer' => $customer,
'request' => $this->getRequest()
));
//..
}
Адміністраторська версія збереження клієнта викликає звичайну модель збереження і після цього відправляє події адміністратора. Ви могли зробити це зворотним шляхом у спостерігача самостійно, якщо цього хочете.