【问题标题】:Magento - can't save changed customer GroupId with observer for newsletter_subscriber_save_before eventMagento - 无法使用 newsletter_subscriber_save_before 事件的观察者保存更改的客户 GroupId
【发布时间】:2013-05-02 21:31:17
【问题描述】:

我为newsletter_subscriber_save_before event; 建立了一个观察者,当客户订阅/取消订阅新闻通讯时,它会被触发。 我需要相应地更改此客户 groupID。看来我可以更改 GroupId,但我无法保存它。如果我在我的代码中调用$customer->save() - 方法,我会陷入无限循环;如果我尝试挂钩newsletter_subscriber_save_after 事件,也会发生同样的情况。

有人可以帮助我吗?将不胜感激!

这是我在 Observer.php 中的代码:

public function newsletter_subscriber_change($observer) {
    try {

        // get status of subscriber
        $subscriber = $observer->getEvent()->getSubscriber();

        $status = $subscriber->getStatus();
        $email = $subscriber->getEmail();

        $customer = Mage::getSingleton('customer/customer');
        $customer->setWebsiteId(Mage::app()->getWebsite()->getId());

        $customer->loadByEmail($email);

    // here i change the groupId
        $customer->setData( 'group_id', 9 );
    // if i check the group here, the change applied ...
        $customer_group = $customer->getGroupId();

        // i tried saving with following, but run into loop
        $customer->save(); 

    } catch (Exception $e) {
        Mage::log("newsletter_subscriber_change observer failed: " . $e->getMessage());
    }
}

【问题讨论】:

  • 尝试做$customer->setIsSubscribed(true)->save(); - 啊,那行不通,别介意,sry

标签: magento events observers


【解决方案1】:

因为 Mage_Newsletter 还捕获 customer_save_after 事件以保存订阅数据,所以您会出现无限循环。 您可以通过如下原始查询更新组 ID:

public function newsletter_subscriber_change($observer) {
    try {

        // get status of subscriber
        $subscriber = $observer->getEvent()->getSubscriber();

        $status = $subscriber->getStatus();
        $email = $subscriber->getEmail();

        $customer = Mage::getSingleton('customer/customer');
        $customer->setWebsiteId(Mage::app()->getWebsite()->getId());

        $customer->loadByEmail($email);

        $adapter = Mage::getSingleton('core/resource');

        /* @var $conn Varien_Db_Adapter_Interface */
        $conn = $adapter->getConnection('core_write');

        $update = 'UPDATE ' . $customer->getResource()->getTable('customer/customer_enity')
                . ' SET group_id = ? WHERE entity_id = ?';

        $conn->query($update, array(9, $customer->getId()));

    } catch (Exception $e) {
        Mage::log("newsletter_subscriber_change observer failed: " . $e->getMessage());
    }
}

【讨论】:

  • 感谢 ndlinh,您的解决方案对我有用。但是,据我了解:我进行了更多实验,如果我通过模板/新闻通讯/subscribe.phtml 在前端订阅新闻通讯(有登录的客户),则不会触发 customer_save_after 事件。仅当我在 template/customer/form/newsletter.phtml 订阅时事通讯时才会触发它。所以我不明白为什么我在第一种情况下得到这个循环,或者为什么我不能直接(没有原始查询)访问和修改客户组 ID。
  • 正如我上面所说,您捕获newsletter_subscriber_save_before 事件以更改客户组。 Mage_Newsletter 模块还捕获customer_save_after 以保存订阅者。在您的newsletter_subscriber_change 方法中,您调用$customer->save(); ,它将触发customer_save_after 事件,然后Mage_Newsletter 处理此事件并保存订阅者,Mage_Newsletter 将触发newsletter_subscriber_save_before ,然后您的模块捕获此事件,然后调用$customer->save(); ,它将再次触发customer_save_after,然后进入无限循环。
  • 感谢您的解释,现在我明白了。我想错了。
猜你喜欢
  • 1970-01-01
  • 2012-09-08
  • 1970-01-01
  • 1970-01-01
  • 2016-09-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-02
  • 2017-03-08
相关资源
最近更新 更多