2013-05-08 97 views
0

我建立了一個觀察員爲newsletter_subscriber_save_before event;當客戶訂閱/取消訂閱新聞通訊時,它會被解僱。 我需要相應地更改此客戶組ID。看來我可以更改GroupId,但我無法設法保存它。如果我在我的代碼中調用$customer->save() - 方法,我會遇到無限循環;如果我試圖鉤入newsletter_subscriber_save_after事件,也會發生同樣的情況。Magento - 無法保存更改的客戶GroupId觀察員爲newsletter_subscriber_save_before事件

任何人都可以幫到我嗎?將不勝感激!

這裏是我的代碼在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()); 
    } 
} 
+0

嘗試做'$客戶 - > setIsSubscribed(真) - >保存();' - 啊這是行不通的沒關係,SRY – butterbrot 2013-05-08 16:32:57

回答

0

你有無限的循環,因爲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()); 
    } 
} 
+0

謝謝ndlinh,你的解決方案適用於我。但是,爲了我的理解:我多做了一些嘗試,如果我通過template/newsletter/subscribe.phtml在前端訂閱新聞稿(通過登錄的客戶),則不會觸發customer_save_after事件。只有當我在模板/客戶/表格/ newsletter.phtml中訂閱時事通訊時纔會被解僱。所以我不明白爲什麼我在第一種情況下得到這個循環,或者爲什麼我不能直接(沒有原始查詢)訪問和修改客戶組ID。 – 2013-05-09 15:12:38

+0

正如我上面所說的,您捕獲'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',然後進入無限循環。 – ndlinh 2013-05-10 03:55:29

+0

感謝您的解釋,現在我明白了。我想的是錯誤的方式。 – 2013-05-10 08:51:05