4

app/code/core/Customer/etc/config.xml在 Magento 保存地址之前和之后注册观察者:

<events>
    <customer_address_save_before>
        <observers>
            <customer_address_before_save_viv_observer>
                <class>customer/observer</class>
                <method>beforeAddressSave</method>
            </customer_address_before_save_viv_observer>
        </observers>
    </customer_address_save_before>
    <customer_address_save_after>
        <observers>
            <customer_addres_after_save_viv_observer>
                <class>customer/observer</class>
                <method>afterAddressSave</method>
            </customer_addres_after_save_viv_observer>
        </observers>
    </customer_address_save_after>
</events>

…但我找不到任何证据表明 Magento 实际上在任何地方发送这些事件:

$ grep -RF 'dispatchEvent(' . | grep -F customer_addres
./app/code/core/Mage/Customer/Model/Address/Abstract.php:        Mage::dispatchEvent('customer_address_format', array('type' => $formatType, 'address' => $this));

据我了解Mage::dispatchEvent(…),这是 Magento 触发事件的唯一方法。这些事件真的发生了吗?(我希望如此,因为我真的可以使用一些在地址保存时间触发的事件。)

4

1 回答 1

13

是的,它分派但有些事件很难找到分派的位置,因为 magento 会动态执行此操作。保存时几乎所有核心​​模型都会发生这种情况。Magento 像这样调度这些事件:

Mage::dispatchEvent($this->_eventPrefix.'_save_before', $this->_getEventData());
Mage::dispatchEvent($this->_eventPrefix.'_save_after', $this->_getEventData());

因此 grep 将无法找到此事件的调度位置。

例如,模型“Mage_Customer_Model_Address”扩展了类“Mage_Customer_Model_Address_Abstract”,该类$_eventPrefix = 'customer_address'在 Mage_Core_Model_Abstract 的 _beforeSave() 和 _afterSave() 方法中设置了事件被调度。

于 2012-12-28T23:27:20.160 回答