Вскоре после того, как я написал это Матиасу, я начал молчать по радио. Я надеюсь, что вы чувствовали неизвестность, поскольку вы ждали этот ответ в течение пары недель.
То, что я имею в виду под «я делаю это в очереди», является прямым ответом на:
Некоторые наблюдатели, такие как enterprise_cms и enterprise_search для события store_delete_after, определены в области adminhtml, поэтому они не будут выполнены. Удаление представления магазина не будет обрабатываться как удаление, выполненное в серверной части.
Метод очереди:
Когда я знаю, что есть определенные события, которые не будут запускаться в правильном контексте (в основном для EE, но могут применяться в других контекстах), я обычно выталкиваю удаление в очередь, чтобы оно выполнялось в контексте, который ему необходим ,
Другими словами, создайте таблицу очередей (или очередь / тему в 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()
));
//..
}
Административная версия сохранения клиента вызывает обычное сохранение модели и затем отправляет событие adminhtml. Вы можете сделать обратное в наблюдателе самостоятельно, если пожелаете.