Magento-can';t在事件发生前,将更改的客户组ID与新闻稿的观察者保存\u订户保存\u

Magento-can';t在事件发生前,将更改的客户组ID与新闻稿的观察者保存\u订户保存\u,magento,events,observers,Magento,Events,Observers,我为时事通讯\u订户\u事件前保存\u创建了一个观察者当客户订阅/取消订阅时事通讯时,会触发此操作。 我需要相应地更改此客户组ID。似乎我可以更改GroupId,但我无法保存它。如果我在代码中调用$customer->save()-方法,我会遇到一个无限循环;如果我在事件之后尝试连接到时事通讯\u订户\u保存\u,也会发生同样的情况 有人能帮我吗?非常感谢 下面是我在Observer.php中的代码: public function newsletter_subscriber_change($o

我为
时事通讯\u订户\u事件前保存\u创建了一个观察者当客户订阅/取消订阅时事通讯时,会触发此操作。
我需要相应地更改此客户组ID。似乎我可以更改GroupId,但我无法保存它。如果我在代码中调用
$customer->save()
-方法,我会遇到一个无限循环;如果我在
事件之后尝试连接到
时事通讯\u订户\u保存\u,也会发生同样的情况

有人能帮我吗?非常感谢

下面是我在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());
    }
}

您得到了无限循环,因为Mage_新闻稿还捕获了
customer_save_,在事件之后保存订阅数据。
您可以通过以下原始查询更新组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());
    }
}

尝试执行
$customer->setIsSubscribed(true)->save()-啊,那不行,没关系,srythanks ndlinh,你的解决方案适合我。但是,据我所知:我做了更多的尝试,如果我通过template/newsletter/subscribe.phtml在前端订阅新闻稿(与登录的客户一起),则不会触发事件后的客户保存。只有当我在template/customer/form/newsletter.phtml中订阅时事通讯时,它才会被解雇。因此,我不明白为什么我在第一种情况下得到这个循环,或者为什么我不能直接(没有原始查询)访问和修改客户组id。正如我上面所说的,您可以在事件之前捕获
时事通讯\u订户\u保存\u来更改客户组。Mage_时事通讯模块还可以在
之后捕获客户以保存订户。在您的
时事通讯\u订户\u change
方法中,您可以调用
$customer->save()
,它将在事件发生后触发
customer\u save\u,然后Mage\u Newsletter处理此事件并保存订户,Mage\u Newsletter将在事件发生前触发
Newsletter\u subscriber\u save\u,然后您的模块捕获此事件,然后调用
$customer->save()
,它将在
之后再次启动
customer\u save\u,然后它将进入无限循环。谢谢您的解释,现在我知道了。我想得不对。