Tentukan apakah pelanggan baru di customer_save_after

9

Saya memiliki acara yang ingin saya jalankan ketika pelanggan mendaftar atau menyimpan detailnya. Untuk ini, saya menggunakan dua acara: customer_register_success dan customer_save_after. Masalah saya adalah bahwa saya akhirnya menjalankan tugas dua kali karena customer_save_after selalu dipanggil dalam eksekusi yang sama dengan customer_register_success.

Saya telah mencoba mendeteksi apakah pelanggan baru dengan memeriksa data asli dan menelepon isObjectNew, tetapi keduanya mengembalikan data yang menyiratkan objek sebenarnya bukan baru. Bagaimana saya bisa mengecek untuk melihat apakah pelanggan baru saja mendaftar di customer_save_Setelah acara menetapkan sesuatu di registri dalam customer_register_successacara tersebut?

Matthew Haworth
sumber

Jawaban:

5

Pertama-tama, Anda dapat mendefinisikan pengamat sebagai singleton untuk kedua acara tersebut

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

Dalam hal ini objek pengamat yang sama akan digunakan untuk kedua acara. Jadi Anda dapat membuat bendera di pengamat Anda dan sebelum melakukan beberapa tindakan, periksa bendera itu.

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

Sekarang kode Anda akan dieksekusi hanya sekali.

oleksii.svarychevskyi
sumber
0

Cara termudah untuk mencegah hal ini adalah dengan menggunakan nilai registri. Metode pengamat Anda akan terlihat seperti berikut ini

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

Pertama kali metode ini disebut register kunci, yang berarti kedua kalinya dipicu tidak kosong lagi dan metode akan kembali di awal

Sander Mangel
sumber
Ya saya telah memikirkan hal ini, tetapi rasanya sangat kotor :(. Saya terkejut bahwa saya tidak dapat mengetahui apakah suatu objek baru saja dibuat dalam acara model_save_after
Matthew Haworth
hanya sebuah beforeacara yang memiliki isObjectNewdata sejauh yang saya tahu karena data belum disimpan. Sejauh kotornya, saya kira akan ada cara yang lebih elegan tapi itu jelas bukan hack
Sander Mangel
$customer->save(); $this->_dispatchRegisterSuccess($customer);sayangnya di sini, pelanggan diselamatkan sebelum acara register dipicu, sehingga metode pengamat tidak akan tetap bekerja :(
Matthew Haworth
0

Pendekatan lain adalah mengecek controller dan action mana yang memicu event.

Di pengamat Anda bisa mendapatkan modul, pengontrol dan nama tindakan.

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

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

Dan kemudian periksa metode Anda siapa yang mengirim acara.

Dalam pemasangan magento saham, saat membuat pengguna dari area pengguna nilai $ myURI akan customer_account_createpost.

Yesaya
sumber