So kurz nachdem ich dies an Matthias getwittert hatte, ging ich in Funkstille. Ich hoffe, Sie haben die Spannung gespürt, als Sie diese Antwort seit ein paar Wochen erwartet haben.
Was ich unter "Ich mache das in einer Warteschlange" verstehe, ist die direkte Antwort auf:
Bestimmte Beobachter wie enterprise_cms und enterprise_search für das Ereignis store_delete_after werden im Bereich adminhtml definiert, damit sie nicht ausgeführt werden. Das Löschen der Geschäftsansicht wird nicht wie ein im Backend ausgeführtes Löschen behandelt.
Warteschlangenmethode:
Wenn ich weiß, dass es bestimmte Ereignisse gibt, die im richtigen Kontext nicht ausgelöst werden (hauptsächlich für EE, aber möglicherweise in anderen Kontexten), schiebe ich die Löschung normalerweise in eine Warteschlange, damit sie im gewünschten Kontext ausgeführt wird .
Mit anderen Worten, erstellen Sie eine Warteschlangentabelle (oder Warteschlange / Thema in RabbitMQ usw.), die Details der Transaktion und der Ereignis-Hooks enthält, die sie abhören soll. Dies kann so elegant oder so simpel sein, wie Sie es möchten. Ist hier ein grundlegendes
$queue = Mage::getModel('yourcompany/queue_job')
->setJobType('delete')
->setEntityType('core/store')
->setEntityId(12)
->setDispatchEvent('store_delete')
->setDispatchEventDataKey('store')
->save();
Und dann bearbeiten Sie die Warteschlange später in einem CRON, in dem Sie nun steuern können, welcher Speicher "ausgeführt wird" (auch bekannt als "Administrator", Speicher 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));
}
}
}
Offensichtlich, wenn Sie Lust bekommen, wickeln Sie in einem Versuch / Fang und wickeln Sie in einer Transaktion. Ich denke, du verstehst das Wesentliche.
Dies ist wahrscheinlich die einzige Möglichkeit, den Kontext zu steuern, in dem das Ereignis ausgelöst wird.
Tandem-Ereignismethode:
Sie können die "adminhtml" -Methode manuell auslösen - Alan gibt eine anständige Erklärung dafür, was Sie tun würden, um das zu beeinflussen , aber im Grunde ist es dasselbe wie das Folgende :
#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()
));
//..
}
Die Administratorversion des Kundenspeichers ruft den regulären Modellspeicher auf und löst anschließend das adminhtml-Ereignis aus. Sie können dies bei einem Beobachter auch umgekehrt tun, wenn Sie dies wünschen.