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 이벤트에서 생성 된 경우 내가 찾을 수 없음을 놀라게하고있다.
마태 복음 워스를

데이터가 아직 저장되지 않은 한 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;

나중에 이벤트를 발송하는 방법을 확인하십시오.

stock magento 설치에서 사용자 영역에서 사용자를 작성할 때 $ myURI의 값은 customer_account_createpost입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.