web-dev-qa-db-ja.com

Magentoで顧客アカウント登録のイベントはありますか?

customer registersアカウントで構築しているmoduleでいくつかの機能を実行できるようにしたいのですが、起動されたeventが見つからないようです。 new customer registrationに。

そのためにディスパッチされるeventを知っている人はいますか?

15
Prattski

この質問に対する答えは、そのためのイベントはないということです。

0
Prattski

イベントを探しているときはいつでも、Mage.phpファイルを一時的に編集して、特定のリクエストのすべてのイベントを出力します。

File: app/Mage.php
public static function dispatchEvent($name, array $data = array())
{
    Mage::log('Event: ' . $name); //not using Mage::log, as 
    //file_put_contents('/tmp/test.log','Dispatching '. $name. "\n",FILE_APPEND); //poor man's log
    Varien_Profiler::start('DISPATCH EVENT:'.$name);
    $result = self::app()->dispatchEvent($name, $data);
    #$result = self::registry('events')->dispatch($name, $data);
    Varien_Profiler::stop('DISPATCH EVENT:'.$name);
    return $result;
}

そして、私がフックしようとしているアクションを実行します。 Magentoイベントには論理的な名前が付けられているため、結果のログをスキャン/並べ替えると、通常、私が何を求めているかがわかります。

45
Alan Storm

customer_register_successはあなたが探しているものです:

<config>
  <frontend>
    <events>
      <customer_register_success>
        <observers>
          <your_module>
            <type>singleton</type>
            <class>your_module/observer</class>
            <method>yourMethod</method>
          </your_module>
        </observers>
      </customer_register_success>
    </events>
  </frontend>
</config>
19
Paul Grigoruta

私は今日これを達成する方法を発見しました。これには、汎用コントローラーイベントの1つを使用することが含まれます。 config.xmlのこのノードは、適切なイベントにフックします。

<events>
 ....
  <controller_action_postdispatch_customer_account_createPost>
    <observers>
     <your_module_here>...etc

controller_action_postdispatch_REQUESTPATHイベントは、Mage_Core_Controller_Front_Action(基本的にはすべて)を拡張するすべてのコントローラーに対してスローされるため、ターゲットを簡単に設定できます。 controller_action_predispatch_REQUESTPATHも同様です。

16
Jonathan Day

事件を完全に解決したとしても、答えがないことに少し驚いています。

顧客の作成が発生する可能性があります

  1. uRLによる顧客/アカウント/作成
  2. チェックアウトに登録する

私は2つのイベントを追跡することでそれを解決しました:

config.xml

    <events>
        <controller_action_postdispatch_customer_account_createpost>
            <observers>
                <myextensionkey_create_account>
                    <class>myextensionkey/observer</class>
                    <method>createAccount</method>
                    <type>singleton</type>
                </myextensionkey_create_account>
            </observers>
        </controller_action_postdispatch_customer_account_createpost>
        <checkout_submit_all_after>
           <observers>
              <myextensionkey_checkout_create_account>
                    <class>myextensionkey/observer</class>
                    <method>createAccountCheckout</method>
                    <type>singleton</type>
              </myextensionkey_checkout_create_account>
           </observers>
        </checkout_submit_all_after>
    </events>

およびObserver.php

public function createAccount($observer) { ... } //Nothing special here

public function createAccountCheckout($observer) {
    if ($observer->getQuote()->getData('checkout_method') != Mage_Checkout_Model_Type_Onepage::METHOD_REGISTER) {
            return;
    }

編集:私は変更しました

<controller_action_predispatch_customer_account_createpost>

<controller_action_postdispatch_customer_account_createpost>

事前発送時にアカウントがまだ作成されていないためです。たとえば、メールがショップにすでに存在する場合、エラーが発生する可能性があります。

7
ahe_borriglione

このための直接のイベントはありませんが、customer_save_commit_afterイベントを使用できます。このイベントは、顧客がショップのデータベースに保存されていることも保証します。このイベントの問題は、2回トリガーされることです。以下は、このイベントを使用できるようにするハックです。オブザーバー関数は次のとおりです。

public function customer_save_commit_after($p_oObserver) {

    $l_oCustomer = $p_oObserver->getCustomer();

    if ($l_oCustomer->isObjectNew() && !$l_oCustomer->getMyCustomKeyForIsAlreadyProcessed()) {
        $l_oCustomer->setMyCustomKeyForIsAlreadyProcessed(true);
        // new customer
    }
    else {
        // existing customer
    }

    return false;

}

これが誰かを助けることを願っています!

ユーザーがチェックアウト時にオンザフライで登録する場合も考慮する必要があります。チェックアウトで登録します。この場合を考えると、独自のObserverクラスで「checkout_type_onepage_save_order_after」イベントをキャッチしてから、このコードをキャッチできます...


if($observer->getEvent()->getQuote()->getCheckoutMethod(true) == Mage_Sales_Model_Quote::CHECKOUT_METHOD_REGISTER){
    (...)
}

誰もが言うかもしれません: Mage_Sales_Model_Quote-> getCheckoutMethod()は1.4以降非推奨になりました!!、だが:

  • OrtodoxメソッドMage_Checkout_Model_Type_Onepage-> getCheckoutMethod()を呼び出し、「METHOD_REGISTER」として何かを待機すると、これが実行されます:
    if ($this->getCustomerSession()->isLoggedIn()) {
                return self::METHOD_CUSTOMER;
            }

    ...「METHOD_CUSTOMER」は、すでに登録されているユーザーとのチェックアウトの名前です。私たちの場合ではありません....しかし、はい!、なぜなら....

    • ...登録操作は、「checkout_type_onepage_save_order_after」イベントの前に実行されます。次に、METHOD_CUSTOMERがあります。アップ、何か矛盾がありますか?
    • 幸い、見積もりは元の値のままです:CHECKOUT_METHOD_REGISTER

      チェックアウト時に登録するための他のアイデアはありますか?

  • 4
    Katapofatico

    登録がこのイベントを2回送信する唯一のことであるcustomer_save_afterを試すことができます

    3
    user392565

    実際には_customer_save_after_と_customer_save_before_(magento 1.5)があります

    フォームの投稿後にデータをオンザフライで変更する場合は、_customer_save_before_を選択し、必要なデータを変更するだけです(保存アクションが後に行われるため、変更が考慮されます)。

    $customer->save()は_customer_save_after_では機能しません。 (致命的なエラー)このオブザーバーを使用して、顧客の作成後に、顧客データに関連しないコードを実行します。

    お役に立てば幸いです。

    3
    Mève

    customer_register_success

    adminhtml_customer_save_after

    これら2つは、顧客がデータベースに挿入されたときのデフォルトのイベントです。最初のイベントは、ユーザーが登録したときにフロントエンドで発生し、2番目のイベントは、管理パネルで顧客が作成されたときにバックエンドで発生します。イベントのオブザーバーを登録するには...これがお役に立てば幸いです...

    3
    Krishna

    イベントcheckout_submit_all_afterが見つかりました。

    <checkout_submit_all_after>
       <observers>
          <my_example>
             <class>my_example/observer</class>
                <method>customerRegistered</method>                        
          </my_example>
       </observers>
    </checkout_submit_all_after>
    

    私のObserver.phpで、渡されたquoteオブジェクトを取得します。

    public function customerRegistered (Varien_Event_Observer $observer) {
        $quote = $observer->getQuote();
        $checkout_method = $quote->getData();
        $checkout_method = $checkout_method['checkout_method'];                      
    
        if ($checkout_method == Mage_Checkout_Model_Type_Onepage::METHOD_REGISTER) {        
    }
    

    $ quote-> getCheckoutMethod()を使用しないでください。代わりにlogin_inが提供されます。理由はわかりません。お役に立てれば。

    2
    Lance Badger

    私は同じことを探していました。イベントはcustomer_register_success

    すべてのイベントへのリンクは次の場所にあります: http://www.nicksays.co.uk/magento_events_cheat_sheet/

    2
    Guillermo

    私はcustomer_loginおよびcustomer_session_initイベントは両方ともアカウント作成時にスローされます。 どちらかのリスナーを登録してから、アカウントの作成日を確認できますか?

    1
    Jonathan Day

    Customer_register_successイベントを使用できます。これは、顧客が正常に作成された後にトリガーされます。これがイベントのチートシートのリンクです。それがあなたにも役立つことを願っています。

    http://www.nicksays.co.uk/magento-events-cheat-sheet-1-7/
    
    0

    customer_register_successは、顧客登録が成功した後にディスパッチされるイベントです。
    これはMage/Customer/controllers/AccountController.php :: 454 inmagento 1.8のコードからです:

    protected function _dispatchRegisterSuccess($customer)
    {
        Mage::dispatchEvent('customer_register_success',
            array('account_controller' => $this, 'customer' => $customer)
        );
    }
    
    0
    Mohammad Faisal