ตรวจสอบว่าลูกค้าใหม่ใน customer_save_after


9

ฉันมีกิจกรรมที่ฉันต้องการดำเนินการเมื่อลูกค้าลงทะเบียนหรือบันทึกรายละเอียดของพวกเขา สำหรับสิ่งนี้ฉันใช้สองเหตุการณ์: customer_register_success และ customer_save_after ปัญหาที่ฉันมีคือฉันลงเอยด้วยการทำงานสองครั้งเพราะ customer_save_after จะถูกเรียกใช้ในการดำเนินการเดียวกันcustomer_register_successเสมอ

ฉันได้พยายามตรวจสอบว่าลูกค้าเป็นของใหม่โดยการตรวจสอบข้อมูลต้นฉบับและเรียกว่าisObjectNewแต่ข้อมูลส่งคืนทั้งที่บอกเป็นนัยถึงวัตถุนั้นจริงแล้วไม่ใช่ของใหม่ ฉันจะตรวจสอบเพื่อดูว่าลูกค้าเพิ่งลงทะเบียนในเหตุการณ์ customer_save_after สั้น ๆ ของการตั้งค่าบางอย่างในรีจิสทรีในcustomer_register_successเหตุการณ์ได้อย่างไร

คำตอบ:


5

ก่อนอื่นคุณสามารถกำหนดผู้สังเกตการณ์ของคุณเป็นซิงเกิลตันสำหรับทั้งสองเหตุการณ์

<global>
    <events>
        <customer_save_after>
            <observers>
                <namespace_module>
                    <type>singleton</type>
                    <class>namespace_module/observer</class>
                    <method>doSomething</method>
                </namespace_module>
            </observers>
        </customer_save_after>
        <customer_register_success>
            <observers>
                <namespace_module>
                    <type>singleton</type>
                    <class>namespace_module/observer</class>
                    <method>doSomething</method>
                </namespace_module>
            </observers>
        </customer_register_success>
    </events>
</global>

ในกรณีนี้วัตถุผู้สังเกตการณ์เดียวกันจะถูกใช้สำหรับทั้งสองเหตุการณ์ ดังนั้นคุณสามารถสร้างการตั้งค่าสถานะในผู้สังเกตการณ์ของคุณและก่อนที่จะทำการกระทำบางอย่างตรวจสอบมัน

class [Namespace]_[Module]_Model_Observer
{
    protected $canDoSomething = false;

    public function doSomething($observer)
    {
        if (!$this->canDoSomething) {

            //here your code

            //now set flag to true to prevent executing your code twice 
            $this->canDoSomething = true;
        }
    }
}

ตอนนี้รหัสของคุณจะถูกดำเนินการเพียงครั้งเดียว


0

วิธีป้องกันที่ง่ายที่สุดคือการใช้ค่ารีจิสตรี วิธีสังเกตของคุณจะมีลักษณะดังนี้

class [Namespace]_[Module]_Model_Observer
{
   public function triggeredObserver($observer)
   {
      if (!empty(Mage::registry('[module]_istriggered')) return $this;

      // here you can perform whatever you want to do with your code

      Mage::register('[module]_istriggered', 1);
   }
}

ครั้งแรกที่มีการเรียกเมธอดนี้ว่ามันจะลงทะเบียนคีย์ซึ่งหมายความว่าในครั้งที่สองที่มันถูกทริกเกอร์มันจะไม่ว่างเปล่าอีกต่อไปและเมธอดจะกลับมาเมื่อเริ่มต้น


ใช่ฉันเคยคิดเกี่ยวกับเรื่องนี้ แต่มันรู้สึกสกปรกมาก :( ฉันประหลาดใจที่ฉันไม่สามารถทราบได้ว่าวัตถุเพิ่งถูกสร้างขึ้นในเหตุการณ์ model_save_after
Matthew Haworth

มีเพียงbeforeเหตุการณ์เดียวเท่านั้นที่มีisObjectNewข้อมูลเท่าที่ฉันทราบเนื่องจากยังไม่ได้บันทึกข้อมูล เท่าที่สกปรกไปฉันคิดว่าจะมีวิธีที่สวยงามมากขึ้น แต่ก็ไม่ใช่แฮ็คอย่างแน่นอน
Sander Mangel

$customer->save(); $this->_dispatchRegisterSuccess($customer);น่าเสียดายที่ที่นี่ลูกค้าถูกบันทึกไว้ก่อนที่เหตุการณ์การลงทะเบียนจะถูกเรียกดังนั้นวิธีการสังเกตการณ์จะไม่ทำงานต่อไป :(
Matthew Haworth

0

อีกวิธีหนึ่งคือการตรวจสอบว่าตัวควบคุมและการกระทำที่ก่อให้เกิดเหตุการณ์

ในผู้สังเกตการณ์คุณจะได้รับชื่อโมดูลตัวควบคุมและการดำเนินการ

$frontName = Mage::app()->getRequest()->getRouteName();
$controllerName = Mage::app()->getRequest()->getControllerName();
$actionName = Mage::app()->getRequest()->getActionName();

$myURI = $frontName . '_'. $controllerName . '_' . $actionName;

และตรวจสอบในภายหลังในวิธีการของคุณที่ส่งเหตุการณ์

ในหุ้นวีโอไอพีติดตั้งเมื่อมีการสร้างผู้ใช้ออกจากพื้นที่ของผู้ใช้ค่าของ $ myURI customer_account_createpostจะเป็น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.