0

本番マシンで結果を複製するために、ローカルマシンにデフォルトの「変更なし」の magento コピーをセットアップしました。

モジュールで「adminhtml_customer_save_after」イベントをキャッチしようとすると、常に customer_save_before で停止します。これは、customer_save_after タイプのイベントにも当てはまります。

追加する

file_put_contents('/tmp/events.log','Dispatching '. $name. "\n",FILE_APPEND); 

/var/www/app/Mage.php の dispatchEvent 関数に対して、実際に customer_save_before に戻ることを確認しますが、それは私が求めているイベントではありません。

これを検証して、これが意図した機能であるかどうかをお知らせください。当社のコール センター/注文チームがサイトの管理側 (電話で注文するため) で新しい顧客を作成し、当社のデータベースと同期する場合、magento 管理セクションの entity_id にアクセスできる必要があります。

モジュールからの PHP

<?php
class NKI_CustomerSync_Model_Observer
{

public function AddCustomerToQueue($observer)
{

$event = $observer->getEvent();
$customer = $event->getCustomer();

$model=$event->getModel();

echo "<PRE>";
var_dump($event->getName());
var_dump($event->getData());

var_dump($event);
var_dump(get_class_methods($event));
die();
}.....

XML

<config>
<modules>
<NKI_CustomerSync>
<version>0.1.0</version>
</NKI_CustomerSync>
</modules>

<global>
<events>
<adminhtml_customer_save_after>
<observers>
<NKI_customersync_model_observer>
<type>singleton</type>
<class>NKI_CustomerSync_Model_Observer</class>
<method>AddCustomerToQueue</method>
</NKI_customersync_model_observer>
</observers>
</adminhtml_customer_save_after>
4

2 に答える 2

2

まず、あなたの投稿は Magento のイベント システムがどのように機能するかについてのいくつかの誤解を裏切っており、それが問題を誤って診断することにつながっているため、ここでイベント システムの簡単なレビューを行います。

dispatchEventメソッドMage.phpは、Magento がイベントを「キャッチ」するかどうかを確認するのに間違った場所です。このメソッドはすべてのイベントを受け取ります。Mage_Core_Model_Appの同じ名前のdispatchEventメソッドで、呼び出しチェーンのより深いところまでではありません

#File: app/code/core/Mage/Core/Model/App.php
public function dispatchEvent($eventName, $args)
{
    foreach ($events[$eventName]['observers'] as $obsName=>$obs) {    
        //...
    }
}

ここで、Magento はイベント オブザーバー (つまり、イベント キャッチャー) を探します。

Magentoは、リクエストごとにあらゆる種類のイベントを発行します。このcustomer_save_beforeイベントは、顧客モデル オブジェクトが保存されるたびに発行されます。これには、フロントエンドとバックエンドの両方での保存が含まれます。ただし、adminhtml_customer_save_afterイベントはここで発生します

#File: app/code/core/Mage/Adminhtml/controllers/CustomerController.php
public function saveAction()
{
    //...
    $customer->save();
    //...
    Mage::dispatchEvent('adminhtml_customer_prepare_save', array(
        'customer'  => $customer,
        'request'   => $this->getRequest()
    ));        
    //..
}

つまり、このイベントsaveActionは管理者の顧客コントローラーで発生します。つまり、このイベントは、ユーザーが個々の顧客を表示しているときに Magento 管理コンソールで [保存] をクリックした後に発生します。

そのため、顧客が Magento admin に保存されると、 と イベントの両方が発生します。イベントが最初に発生し、次にイベントが発生します。customer_save_beforeadminhtml_customer_save_aftercustomer_save_beforeadminhtml_customer_save_after

あなたの特定のコードに関しては、あなたが示したものは正しいように見えます。}これは、オブザーバー クラスが終了していて、それが正しい場所にあると仮定した場合です。

app/code/community/NKI/CustomerSync/Model/Observer.php

//or, if your module is configured in the local code pool

app/code/local/NKI/CustomerSync/Model/Observer.php    

そして、あなたのモジュールconfig.xmlには終了</config>があり、有効な XML であり、あなたのモジュールのetc/config.xmlファイルに含まれています。これは、Magento がモジュールを認識できることも前提としています。

私はあなたのコードを使用してスケルトン モジュールを一緒にスローし、Magento のバックエンドで顧客を保存したときにイベントが発生しました。そのスケルトン モジュールがここにあります。モジュールが微妙に間違っている可能性がある場所を確認するために必要なものと比較してください。

于 2013-06-11T01:53:34.780 に答える
1

イベントは adminhtml に配置する必要があり、customer_save_after と呼ばれます

于 2013-06-10T21:11:55.257 に答える