尽管 SO 上存在大量“我的观察者没有被触发”的问题,但这一问题尚未被涵盖。
我设置了一个working观察者来捕获事件 checkout_submit_all_after。问题是,这仅在我通过前端购买商品时有效,而在我通过对 shopppingCartOrder 的 SOAP 调用触发事件时无效。订单本身是成功的,我也可以从 Mage.php 的dispatchEvent 记录该事件。
编辑:为了更清楚地说明这一点:事件正在生成,我可以通过 Mage.php 记录它。问题在于,仅当使用 SOAP 生成事件时,观察者才捕获它。
正如您从下面的 config.xml 中看到的,我使用的是全局范围,因此观察者应该在所有情况下处理它(如果我的理解是正确的)。当我调用 SOAP 时,我还需要做些什么才能让我的观察者触发吗?另外,我尝试了各种其他事件,但仍然没有触发。
配置.xml:
<config>
<modules>
<Company_Obsrv>
<version>0.0.1</version>
</Company_Obsrv>
</modules>
<global>
<models>
<!--
Unique identifier in the model's node.
By convention, we put the module's name in lowercase.
-->
<company_obsrv>
<!--path-->
<class>Company_Obsrv_Model</class>
</company_obsrv>
</models>
<events>
<checkout_submit_all_after>
<observers>
<company_obsrv>
<class>company_obsrv/observer</class>
<method>observeTest</method>
<type>singleton</type>
</company_obsrv>
</observers>
</checkout_submit_all_after>
</events>
</global>
</config>
观察者.php:
class Company_Obsrv_Model_Observer
{
public function observeTest(Varien_Event_Observer $observer)
{
Mage::log('CALLED!', null, 'newlog.log', true);
}
}
就像我说的,观察者在我不使用 SOAP 时工作,所以这不可能是我的函数代码或命名问题。请帮忙!
咕噜!那是该死的缓存。我确定我把它关掉了。
如果通过 SOAP 下订单时未触发此特定事件,有两种解决方案:
聆听更广义的事件,例如
sales_order_place_after
。如果您不希望从管理区域触发此事件,您可以将事件配置从全局节点移出并移至前端节点。创建自定义 SOAP 端点并自行触发独特的事件:
Mage::dispatchEvent('soap_order_place_after', array('order'=>$order));