2011-03-12 25 views
11

有時候找一個方便的事件掛鉤我做一些探索性的編程...如何在Magento中找到合適的事件?

  • 修改Mage::dispatchEvent這一額外的行:

    Mage::log($name.'('.implode(',', array_keys($data)).')'); 
    
  • 馬克起點,我知道我趕不上更快:

    Mage::log(__METHOD__.'::START'); 
    
  • 標記一個我不想趕上的終點任何更晚:

    Mage::log(__METHOD__.'::STOP'); 
    
  • 觀看日誌並瀏覽網站(例如,訂單提交,無論是正在調查中)

    tailf var/log/system.log 
    

這給了我一個完整的枯燥的數據和對象的名稱的屏幕被傳遞。除了STARTSTOP以外,我通常不會尋找任何足夠特定的東西來幫助它,我必須依靠我的經驗來確定可能的引導點。例如,在下達訂單時,我知道某處通常會有「報價」,或者可能通過「付款」對象獲取訂單參考,反之亦然。

然後,我必須記住刪除我的標記(使用任何類型的版本時都不那麼困難)。

你用什麼方法查找事件?你能做到而不修改核心代碼嗎?

+0

我的問題是稍微主觀的,不太清楚Stack Overflow是什麼。 – clockworkgeek 2011-03-12 16:03:43

回答

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/

如果你方便,你可以在你的Magento工作目錄執行grep -R dispatchEvent並通過調度呼叫的缺乏解析電流。這些是您特定版本中所有Magento事件的實際定義。

編輯2013年2月14日:

這份名單,是一對夫婦歲,不再有效。我建議你使用下面的資源,因爲它不僅是一個更好的答案,而且爲你提供了很多找到更好事件鉤子的例子和資源。

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

+3

這些列表對於發現「適當」事件沒有太大的幫助。前綴和後綴是變量,因此列表不能解釋這些值可能是什麼。它也不解釋它是否會在我認爲它會觸發時觸發,也不會解釋它是否包含正確的信息。不管怎麼說,還是要謝謝你。 – clockworkgeek 2011-03-12 16:02:16

+0

不太有用,但足以接近您正在尋找的內容。感謝你的接納。 – philwinkle 2011-05-16 17:02:58

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函數。無論如何,希望能給你一個關於我的過程的想法!

感謝, 約瑟夫Mastey

+0

我不認識'print_error'函數,但我可以猜測它的功能。 – clockworkgeek 2011-03-12 15:13:26

9

如果我正在尋找一個特定的事件,通常我會在Mage.php編輯dispatchEvent(),這增加了頂部(我覺得這些都是用於記錄的正確PARAMS ,從內存中寫這雖然):

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

然後,我將刷新頁面,註釋掉該行保持文件從獲取額外的事件,然後去看看我的events.txt文件中看到爲該頁面加載的所有事件。

確實有點不好意思,但我發現它對於查找包含變量的事件作爲其名稱的一部分很有用。

0

我以爲我會回傳上面的代碼,但稍微修改一下才能正常工作。需要分配$ magento,以及用於grep的路徑。只要將/ var/www/app更改爲任何您的magento目錄即可。將此腳本複製到一個文件並執行它。你需要安裝ack-grep才能正常工作。 Ubuntu用戶可以輸入「sudo apt-get ack-grep」,我相信會安裝它,或者只是google ack-grep。

這是一個shell PHP SCRIPT。如果你在瀏覽器中運行它,它看起來就像一個MESS!但是,您可以執行「php whateveryoucallthescript.php >> output.txt」,然後在VI中打開該文件或對其進行編輯並搜索您想要的結果。

這對企業1.11.1.0在Magento明確解僱,內部隱含的人一起事件

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

    ?> 
相關問題