Magento - can't save changed customer GroupId with observer for newsletter_subscriber_save_before event

StackOverflow https://stackoverflow.com/questions/16444288

  •  14-04-2022
  •  | 
  •  

I built an observer for the newsletter_subscriber_save_before event; this gets fired when a customer subscribes/unsubscribes for newsletters. I need to change this customers groupID accordingly. It seems i can change the GroupId, but i can't manage to save it. If i call in my code the $customer->save() - method, i run into an infinite loop; same occurs if i try to hook into the newsletter_subscriber_save_after event.

Anyone can help me? Would be much appreciated!

Here's my code in 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());
    }
}
有帮助吗?

解决方案

You got infinite loop because Mage_Newsletter also capture customer_save_after event to save subscribe data. You can update group id by raw query like bellow:

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());
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top