2011-03-12 8 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 
    

यह मैं एक स्क्रीन उबाऊ डेटा और वस्तुओं के नाम से भरा देता है पारित किया जा रहा। START और STOP के अलावा मैं आमतौर पर इसके लिए grep के लिए पर्याप्त विशिष्ट चीज़ों की तलाश नहीं कर रहा हूं और मुझे संभावित बूटस्ट्रैप बिंदुओं की पहचान करने के लिए अपने अनुभव पर भरोसा करना है। उदाहरण के लिए जब ऑर्डर देना मुझे पता है कि अक्सर कहीं 'उद्धरण' होता है, या 'भुगतान' ऑब्जेक्ट, या इसके विपरीत के माध्यम से आदेश का संदर्भ प्राप्त करना संभव है।

तब मुझे अपने मार्करों को हटाने के लिए याद रखना होगा (किसी भी प्रकार के संस्करण का उपयोग करते समय मुश्किल नहीं)।

घटनाओं को खोजने के लिए आप किन तरीकों का उपयोग करते हैं? क्या आप इसे कोर कोड संशोधित किए बिना कर सकते हैं?

+0

मेरा प्रश्न थोड़ा व्यक्तिपरक है और स्टैक ओवरफ़्लो के लिए पर्याप्त नहीं है। – clockworkgeek

उत्तर

6

1.2 में से इवेंट सूची Magento विकी पर क्यूरेट की गई थी। आप उस सूची यहाँ पा सकते हैं:

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/02/14:

इस सूची में वर्ष कुछ साल किया जा रहा है, अब वैध नहीं है। मेरा सुझाव है कि आप निम्न संसाधन का उपयोग करें क्योंकि यह न केवल एक बेहतर उत्तर है बल्कि आपको बेहतर घटना हुक खोजने के कई उदाहरण और स्रोत प्रदान करता है।

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

+3

इस प्रकार की सूचियां "उपयुक्त" घटना को खोजने में इतनी उपयोगी नहीं हैं। उपसर्ग और पोस्टफिक्स चर हैं इसलिए सूची यह नहीं बताती कि वे मान क्या हो सकते हैं। न ही यह समझाता है कि यह तब ट्रिगर होगा जब मुझे लगता है कि यह करता है और न ही इसमें सही प्रकार की जानकारी होगी। फिर भी धन्यवाद। – clockworkgeek

+0

इतना उपयोगी नहीं है, लेकिन आप जो खोज रहे हैं उसके करीब पहुंचने के लिए पर्याप्त है। स्वीकार करने के लिए धन्यवाद। – philwinkle

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

यह मेरा homebrew Magento कमांड लाइन toolchain का हिस्सा है। यह शायद केवल लिनक्स पर ही चलाएगा, और वहां वहां आंतरिक lib फ़ंक्शन हो सकते हैं जिन्हें मैं नहीं ढूंढ सकता। वैसे भी, उम्मीद है कि आपको मेरी प्रक्रिया के बारे में एक विचार देता है!

धन्यवाद, यूसुफ Mastey

+0

मैं 'print_error' फ़ंक्शन को नहीं पहचानता, लेकिन मुझे लगता है कि यह क्या करता है। – clockworkgeek

9

मैं एक विशिष्ट घटना के लिए देख रहा हूँ, आम तौर पर मैं Mage.php में dispatchEvent() को संपादित करने और शीर्ष करने के लिए इस ऐड (मुझे लगता है कि इन लॉग के लिए सही पैरामीटर हैं जाएगा , स्मृति से इस लेखन हालांकि):

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

तब मैं पेज को ताज़ा कर देंगे, बाहर टिप्पणी कि लाइन में अतिरिक्त घटनाओं को प्राप्त करने से फ़ाइल रखने के लिए, और फिर जाना मेरी events.txt फ़ाइल को देखो देखने के लिए उस पृष्ठ लोड के लिए निकाल दी गई सभी घटनाएं।

यह सुनिश्चित करने के लिए हैकी की तरह है, लेकिन मुझे उनके नामों के हिस्से के रूप में चर के साथ ईवेंट खोजने के लिए उपयोगी पाया गया है।

0

मैंने सोचा कि मैं ऊपर से कोड वापस पोस्ट करूंगा, लेकिन सही काम करने के लिए थोड़ा संशोधित किया। $ Magento असाइन करने की आवश्यकता है, साथ ही grep के लिए इस्तेमाल पथ। अपनी Magento निर्देशिका जो भी हो/बस/var/www/ऐप को बदलें। इस स्क्रिप्ट को एक फ़ाइल में कॉपी करें और इसे निष्पादित करें। ठीक से काम करने के लिए आपको एके-जीईआर स्थापित करने की आवश्यकता है। उबंटू उपयोगकर्ता "sudo apt-get ack-grep" टाइप कर सकते हैं, मुझे यह इंस्टॉल करने का विश्वास है, या सिर्फ Google ack-grep।

यह एक शेल PHP स्क्रिप है। यदि आप इसे ब्राउजर में चलाते हैं, तो यह एक कम पसंद है! हालांकि, आप "php whateveryoucallthescript.php >> output.txt" कर सकते हैं और फिर उस फ़ाइल को VI में खोलें या इसे संपादित करें और इच्छित परिणामों की खोज करें।

इस उद्यम 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; 
    } 

    ?> 
1

घटनाओं को स्पष्ट रूप से, Magento में निकाल दिया आंतरिक अंतर्निहित लोगों के साथ की सूची ..

चेक पर परीक्षण किया गया है here