挂钩和数据库更新后保存 Magento 地址

Magento address save after hook & database update

我对 magento hook "customer_address_save_after" & "address_save_after" 有疑问。我想从此挂钩向 API 发出请求,它从 Magento 数据库获取用户。不幸的是,此时数据库中是旧数据 - 尚未更新。

Magento 中是否有任何钩子允许我在数据库更新后发出请求?或者有什么方法可以将此挂钩中的数据保存到数据库中?类似于 $customer->save() ?

public function afterAddressSave($observer)
{
    $customerAddress = $observer->getCustomerAddress();
    $customer = $customerAddress->getCustomer();

    if ($customer->getDefaultBillingAddress() && $customer->getDefaultBillingAddress()->getCountryId()) {
        Mage::helper('iwsettings')->setStoreId($customer, $customer->getDefaultBillingAddress()->getCountryId());
    }
    $this->updateTypo3UserData($customer);
}

我相信你有点困惑,customer_address_save_after 事件在数据提交到数据库后触发,但是如果你抛出异常或die() 在您的观察者中,因为这会导致数据库 "roll back the save"

customer_address_save_after

  • $observer->getCustomerAddress()这是正在提交的地址
  • Mage::getModel('customer/address')->load($id) 在观察者中,通过传递 $observer->getCustomerAddress()->getEntityId() 的 id 我们可以看到与上面完全相同的数据

但是,如果您使用 customer_address_save_before

  • $observer->getCustomerAddress()这是正在提交的地址
  • $observer->getCustomerAddress()->getEntityId() 如果是新的,将是空白的,如果是编辑的,将具有地址 ID

这确实会给您带来一个问题,如果地址是新地址,您还不知道实体 ID(直到保存之后)。但是,由于 Observer 是作为单例加载的,您可以在观察者上设置一个标志,并在稍后保存后获取地址 ID(它会在那里)。只要您的观察者没有抛出异常或死亡,它就会保存到数据库中!

因此,对于您的查询,您可以使用 customer_address_save_after(如果您想要客户值,也可以使用 customer_save_after)。只需确保没有任何异常抛出,即将您的代码包装在 try{}catch{} 中,如果它引发异常则静默失败。