11

フックするのに便利なイベントを探すとき、ちょっとした探索的プログラミングを行うことがあります...

  • Mage::dispatchEvent次の追加行で変更します。

    Mage::log($name.'('.implode(',', array_keys($data)).')');
    
  • すぐには追いつけないことがわかっている開始点をマークします。

    Mage::log(__METHOD__.'::START');
    
  • 後でキャッチしたくないエンドポイントをマークします。

    Mage::log(__METHOD__.'::STOP');
    
  • ログを見て、サイトをステップスルーします (例: 注文の送信、調査中のもの)

    tailf var/log/system.log
    

これにより、退屈なデータと渡されるオブジェクトの名前でいっぱいの画面が表示されます。以外にSTARTSTOP私は通常、それをgrepするのに十分なほど具体的なものを探していません。可能なブートストラップポイントを特定するには、経験に頼る必要があります。たとえば、注文を行うとき、どこかに「見積もり」があることがよくあります。または、「支払い」オブジェクトを介して注文への参照を取得することも、その逆も可能です。

次に、マーカーを削除することを覚えておく必要があります (どのような種類のバージョン管理を使用する場合でも、それほど難しくありません)。

イベントを見つけるためにどのような方法を使用しますか? コアコードを変更せずにそれを行うことはできますか?

4

5 に答える 5

9

特定のイベントを探している場合は、通常、Mage.php で dispatchEvent() を編集し、これを一番上に追加します (これらはログの正しいパラメーターだと思いますが、メモリから書き込みます):

Mage::log( $name, 1, 'events.txt' );

次に、ページを更新し、その行をコメントアウトして、ファイルに余分なイベントが含まれないようにします。次に、events.txt ファイルを調べて、そのページの読み込みで発生したすべてのイベントを確認します。

確かにハックですが、名前の一部として変数を含むイベントを見つけるのに役立つことがわかりました。

于 2011-03-14T02:52:28.197 に答える
6

1.2 の時点で、イベント リストは Magento Wiki で精選されました。そのリストは次の場所にあります。

http://www.magentocommerce.com/wiki/_media/magento_events_v1.2.0.2.xls

ただし、それ以降、さまざまなイベントが非推奨になりました。ここにリストがありますが、1.4 の時点で最新のものです。

http://masteringmagento.com/2010/06/events-list-in-magento-community-1-4/

便利な場合はgrep -R dispatchEvent、Magento 作業ディレクトリで実行し、不足しているディスパッチ コールを解析できます。これらは、特定のバージョンのすべての Magento イベントの実際の定義です。

2013 年 2 月 14 日編集:

このリストは数年前のものであり、もはや有効ではありません。次のリソースを使用することをお勧めします。これは、より良い答えであるだけでなく、より良いイベント フックを見つけるための多くの例とソースを提供するためです。

https://magento.stackexchange.com/a/167/336

于 2011-03-12T06:43:41.237 に答える
2

philwinkle は既に私の古いリストへのリンクを投稿しましたが、イベント リストの生成に使用するものを投稿します。思ったよりも長くなってしまいましたが、これはフレームワークにコーディング標準が一般的に欠けているためです。基本的に、このコードはすべてのイベントを検索してフォーマットしようとします。必要に応じて、1.5.0.1 で実行してブログを更新することもできます (何ヶ月も経ってから更新するのもいいかもしれませんが、時間は気まぐれです)。

コード:

$results    = `ack Mage::dispatchEvent $magento 2>/dev/null | grep -v "app/code/local" | grep -v "downloader/pearlib"`;
$results    = explode("\n", $results);
print_error(sprintf("%-100s\t%-4s\t%s\n", "FILE", "LINE", "EVENT"));
foreach($results as $result) {
    if(!strlen(trim($result))) { continue; }

    $matches        = array();
    preg_match("/([^:]+):(\d+):\W+(.*)/", $result, $matches);

    $file           = str_replace($magento, "", $matches[1]);
    $line           = $matches[2];
    $event          = $matches[3];

    $eventMatches   = array();
    if(preg_match("/Mage::dispatchEvent\('(\w+)'\);/", $event, $eventMatches)) {
        $event      = $eventMatches[1];
        $matchType  = 1;
    } else if(preg_match("/Mage::dispatchEvent\('(\w+)',.*/", $event, $eventMatches)) {
        $event      = $eventMatches[1];
        $matchType  = 2;
    } else if(preg_match("/Mage::dispatchEvent\($/", $event)) {
        $event      = get_next_line_event($file, $line+1, $magento);
        $matchType  = 3;
    } else if(preg_match("/Mage::dispatchEvent\(\"?(['\$a-zA-Z._{}\-> ]+).*/", $event, $eventMatches)) {
        $event      = $eventMatches[1];
        $matchType  = 4;
    } else {
        print "Found unmatcheable event:\n";
        var_dump($event);exit;
    }

    printf("%-100s\t%-4s\t%s\n", $file, $line, $event);
}

function get_next_line_event($file, $line, $magento) {
    $cnt        = `cat -n $magento/$file | grep -e "^ *$line"`;
    $cnt        = preg_replace("/^\s*\d*\s*/", "", $cnt);
    $matches    = array();
    if(preg_match("/^'?([\$a-z_>. -]*)'?,$/i", $cnt, $matches)) {
        return $matches[1];
    } else if(preg_match("/^([\$a-z_>. '\-\(\)]*),$/i", $cnt, $matches)) {
        return $matches[1];
    }
    print "Found unmatcheable event:\n";
    var_dump($cnt);exit;
}  

これは、自作の Magento コマンド ライン ツールチェーンの一部です。おそらく Linux でのみ実行され、見つからない内部 lib 関数が含まれている可能性があります。とにかく、私のプロセスについてのアイデアが得られることを願っています!

ありがとう、ジョセフ・マスティ

于 2011-03-12T13:33:56.050 に答える
0

上記のコードをポストバックすると思っていましたが、正しく動作するように少し変更しました。$magento と、grep に使用されるパスを割り当てる必要がありました。/var/www/app を magento ディレクトリに変更するだけです。このスクリプトをファイルにコピーして実行します。正しく動作させるには、ack-grep をインストールする必要があります。Ubuntu ユーザーは、「sudo apt-get ack-grep」と入力して、これをインストールするか、単に google ack-grep をインストールすることができます。

これはシェル PHP スクリプトです。ブラウザで実行すると、混乱しているように見えます。ただし、「php whatyoucallthescript.php >> output.txt」を実行してから、そのファイルを VI で開くか、編集して必要な結果を検索することができます。

これは Enterprise 1.11.1.0 でテスト済みです。

<?php
    $magento = "/var/www/app/";
    $results    = `ack-grep Mage::dispatchEvent $magento 2>/dev/null | grep -v "/var/www/app/code/local" | grep -v "/var/www/downloader/pearlib"`;
    $results    = explode("\n", $results);

    print_error(sprintf("%-100s\t%-4s\t%s\n", "FILE", "LINE", "EVENT"));

    foreach($results as $result) {
        if(!strlen(trim($result))) { continue; }

        $matches        = array();
        preg_match("/([^:]+):(\d+):\W+(.*)/", $result, $matches);

        $file           = str_replace($magento, "", $matches[1]);
        $line           = $matches[2];
        $event          = $matches[3];

        $eventMatches   = array();
        if(preg_match("/Mage::dispatchEvent\('(\w+)'\);/", $event, $eventMatches)) {
            $event      = $eventMatches[1];
            $matchType  = 1;
        } else if(preg_match("/Mage::dispatchEvent\('(\w+)',.*/", $event, $eventMatches)) {
            $event      = $eventMatches[1];
            $matchType  = 2;
        } else if(preg_match("/Mage::dispatchEvent\($/", $event)) {
            $event      = get_next_line_event($file, $line+1, $magento);
            $matchType  = 3;
        } else if(preg_match("/Mage::dispatchEvent\(\"?(['\$a-zA-Z._{}\-> ]+).*/", $event, $eventMatches)) {
            $event      = $eventMatches[1];
            $matchType  = 4;
        } else {
            print "Found unmatcheable event:\n";
            var_dump($event);
        }

        printf("%-100s\t%-4s\t%s\n", $file, $line, $event);
    }

    function get_next_line_event($file, $line, $magento) {
        $cnt        = `cat -n $magento/$file | grep -e "^ *$line"`;
        $cnt        = preg_replace("/^\s*\d*\s*/", "", $cnt);
        $matches    = array();
        if(preg_match("/^'?([\$a-z_>. -]*)'?,$/i", $cnt, $matches)) {
            return $matches[1];
        } else if(preg_match("/^([\$a-z_>. '\-\(\)]*),$/i", $cnt, $matches)) {
            return $matches[1];
        }
        print "Found unmatcheable event:\n";
        var_dump($cnt);exit;
    }  

    function print_error($err) {
        echo $err;
    }

    ?>
于 2012-02-16T12:16:39.177 に答える