Визначте, чи новий клієнт у 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;

А пізніше перевірте у своєму методі, хто відправляє подію.

У встановленому запасі magento при створенні користувача з області користувача значення $ myURI буде customer_account_createpost.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.