Определите, является ли клиент новым в 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;
        }
    }
}

Теперь ваш код будет выполнен только один раз.

oleksii.svarychevskyi
источник
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данные, так как данные еще не сохранены. Что касается грязного, я думаю, что были бы более изящные способы, но это, конечно, не хак
Сандер Мангель
$customer->save(); $this->_dispatchRegisterSuccess($customer);к сожалению, здесь клиент сохраняется до того, как будет инициировано событие регистрации, поэтому метод наблюдателя все равно не сработает :(
Мэтью Хаворт,
0

Другой подход заключается в проверке того, какой контроллер и какое действие вызвало событие.

В обозревателе вы можете получить модуль, контроллер и название действия.

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

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

А потом проверьте в своем методе, кто отправляет событие.

При стандартной установке magento при создании пользователя из пользовательской области значение $ myURI будет customer_account_createpost.

Isaias
источник