Customer_save_after'da müşterinin yeni olup olmadığını belirleme


9

Bir müşteri bilgilerini kaydettirdiğinde veya kaydettiğinde yürütmek istediğim etkinliklerim var. Bunun için iki olay kullanıyorum: customer_register_success ve customer_save_after. Ben yaşıyorum sorun müşteri_save_after her zaman aynı yürütme olarak çağrılır gibi iki kez çalışan sonunda olmasıdır customer_register_success.

Orijinal verileri kontrol ederek ve çağrılarak müşterinin yeni olup olmadığını tespit etmeye çalıştım isObjectNew, ancak her ikisi de nesneyi ima eden geri dönüş verileri aslında yeni değil. Müşterinin, etkinlikteki kayıt defterinde bir şey ayarlamadan önce customer_save_after etkinliğine kaydolup kaydolmadığını nasıl kontrol edebilirim customer_register_success?

Yanıtlar:


5

Her şeyden önce gözlemcinizi her iki olay için singleton olarak tanımlayabilirsiniz

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

Bu durumda, her iki olay için de aynı gözlemci nesne kullanılacaktır. Böylece gözlemcinizde bayrak oluşturabilir ve bazı işlemler yapmadan önce kontrol edebilirsiniz.

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

Şimdi kodunuz yalnızca bir kez yürütülür.


0

Bunu önlemenin en kolay yolu bir kayıt defteri değeri kullanmaktır. Gözlemci yönteminiz aşağıdaki gibi görünecektir

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

Yöntem ilk kez çağrıldığında bir anahtar kaydeder, yani ikinci tetiklendiğinde artık boş değildir ve yöntem başlangıçta geri döner


Evet, bunu düşünmüştüm, ama oldukça kirli geliyor :(. Bir model_save_after etkinliğinde yeni bir nesne yaratıp yaratmadığımı öğrenemediğim için şaşırdım
Matthew Haworth

sadece bir beforeolay isObjectNewveri henüz kaydedilmiş olarak bildiğim kadarıyla sahiptir . Bildiğim kadarıyla kirli gider, daha zarif yollar olurdu ama kesinlikle bir kesmek değil
Sander Mangel

$customer->save(); $this->_dispatchRegisterSuccess($customer);ne yazık ki burada müşteri, kayıt olayı tetiklenmeden önce kaydedilir, bu nedenle gözlemci yöntemi yine de işe yaramaz :(
Matthew Haworth

0

Başka bir yaklaşım, hangi denetleyici ve eylemin olayı tetiklediğini kontrol etmektir.

Gözlemcide modülü, denetleyiciyi ve eylem adını alabilirsiniz.

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

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

Ve sonra etkinliği kimin gönderdiğini kontrol edin.

Bir stok magento kurulumunda, kullanıcı alanından bir kullanıcı oluştururken $ myURI değeri olacaktır customer_account_createpost.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.