Xác định xem khách hàng có mới trong customer_save_after không


9

Tôi có các sự kiện mà tôi muốn thực hiện khi khách hàng đăng ký hoặc lưu thông tin chi tiết của họ. Đối với điều này, tôi đang sử dụng hai sự kiện: customer_register_success và customer_save_after. Vấn đề tôi gặp phải là cuối cùng tôi chạy nhiệm vụ hai lần vì customer_save_after luôn được gọi trong cùng một thực thi như customer_register_success.

Tôi đã cố gắng phát hiện xem khách hàng có phải là người mới hay không bằng cách kiểm tra dữ liệu gốc và được gọi isObjectNew, nhưng cả hai đều trả về dữ liệu ngụ ý đối tượng trên thực tế không phải là mới. Làm cách nào tôi có thể kiểm tra xem liệu khách hàng có đang đăng ký trong sự kiện của khách hàng hay không sau khi thiết lập một cái gì đó trong sổ đăng ký trong customer_register_successsự kiện không?

Câu trả lời:


5

Trước hết, bạn có thể định nghĩa người quan sát của mình là người độc thân cho cả hai sự kiện

<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>

Trong trường hợp này, cùng một đối tượng quan sát viên sẽ được sử dụng cho cả hai sự kiện. Vì vậy, bạn có thể tạo cờ trong trình quan sát của mình và trước khi thực hiện một số hành động hãy kiểm tra nó.

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;
        }
    }
}

Bây giờ mã của bạn sẽ được thực hiện chỉ một lần.


0

Cách dễ nhất để ngăn chặn điều này là sử dụng giá trị đăng ký. Phương pháp quan sát viên của bạn sẽ trông giống như sau

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);
   }
}

Lần đầu tiên phương thức được gọi là nó đăng ký một khóa, có nghĩa là lần thứ hai nó được kích hoạt, nó không còn trống nữa và phương thức sẽ trở lại khi bắt đầu


Vâng tôi đã nghĩ về điều này, nhưng nó cảm thấy khá bẩn :(. Tôi ngạc nhiên rằng tôi không thể tìm ra nếu một vật thể vừa được tạo ra trong một sự kiện model_save_after
Matthew Haworth

chỉ một beforesự kiện có isObjectNewdữ liệu theo như tôi biết là dữ liệu chưa được lưu. Theo như bẩn, tôi đoán sẽ có nhiều cách thanh lịch hơn nhưng chắc chắn đó không phải là một vụ hack
Sander Mangel

$customer->save(); $this->_dispatchRegisterSuccess($customer);Thật không may ở đây, khách hàng được lưu trước khi sự kiện đăng ký được kích hoạt, vì vậy phương thức quan sát viên sẽ không hoạt động :(
Matthew Haworth

0

Một cách tiếp cận khác là kiểm tra bộ điều khiển và hành động nào đã kích hoạt sự kiện.

Trong trình quan sát, bạn có thể nhận được mô-đun, bộ điều khiển và tên hành động.

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

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

Và sau đó kiểm tra phương pháp của bạn, người đang gửi sự kiện.

Trong bản cài đặt magento stock, khi tạo người dùng từ khu vực người dùng, giá trị của $ myURI sẽ là customer_account_createpost.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.