customer registers
アカウントで構築しているmodule
でいくつかの機能を実行できるようにしたいのですが、起動されたevent
が見つからないようです。 new customer registration
に。
そのためにディスパッチされるevent
を知っている人はいますか?
この質問に対する答えは、そのためのイベントはないということです。
イベントを探しているときはいつでも、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イベントには論理的な名前が付けられているため、結果のログをスキャン/並べ替えると、通常、私が何を求めているかがわかります。
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>
私は今日これを達成する方法を発見しました。これには、汎用コントローラーイベントの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
も同様です。
事件を完全に解決したとしても、答えがないことに少し驚いています。
顧客の作成が発生する可能性があります
私は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>
事前発送時にアカウントがまだ作成されていないためです。たとえば、メールがショップにすでに存在する場合、エラーが発生する可能性があります。
このための直接のイベントはありませんが、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以降非推奨になりました!!、だが:
if ($this->getCustomerSession()->isLoggedIn()) {
return self::METHOD_CUSTOMER;
}
...「METHOD_CUSTOMER」は、すでに登録されているユーザーとのチェックアウトの名前です。私たちの場合ではありません....しかし、はい!、なぜなら....
チェックアウト時に登録するための他のアイデアはありますか?
登録がこのイベントを2回送信する唯一のことであるcustomer_save_afterを試すことができます
実際には_customer_save_after
_と_customer_save_before
_(magento 1.5)があります
フォームの投稿後にデータをオンザフライで変更する場合は、_customer_save_before
_を選択し、必要なデータを変更するだけです(保存アクションが後に行われるため、変更が考慮されます)。
$customer->save()
は_customer_save_after
_では機能しません。 (致命的なエラー)このオブザーバーを使用して、顧客の作成後に、顧客データに関連しないコードを実行します。
お役に立てば幸いです。
customer_register_success
adminhtml_customer_save_after
これら2つは、顧客がデータベースに挿入されたときのデフォルトのイベントです。最初のイベントは、ユーザーが登録したときにフロントエンドで発生し、2番目のイベントは、管理パネルで顧客が作成されたときにバックエンドで発生します。イベントのオブザーバーを登録するには...これがお役に立てば幸いです...
イベント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が提供されます。理由はわかりません。お役に立てれば。
私は同じことを探していました。イベントはcustomer_register_success
。
すべてのイベントへのリンクは次の場所にあります: http://www.nicksays.co.uk/magento_events_cheat_sheet/
私はcustomer_login
およびcustomer_session_init
イベントは両方ともアカウント作成時にスローされます。 どちらかのリスナーを登録してから、アカウントの作成日を確認できますか?
Customer_register_successイベントを使用できます。これは、顧客が正常に作成された後にトリガーされます。これがイベントのチートシートのリンクです。それがあなたにも役立つことを願っています。
http://www.nicksays.co.uk/magento-events-cheat-sheet-1-7/
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)
);
}