How to find an appropriate event in Magento?

前端 未结 5 948
粉色の甜心
粉色の甜心 2020-12-29 11:19

Sometimes when looking for a convenient event to hook I do a bit of exploratory programming...

  • Modify Mage::dispatchEvent with this extra line:

5条回答
  •  失恋的感觉
    2020-12-29 11:46

    I thought I would post back the code from above, but modified slightly to work right. $magento needed to be assigned, as well as the paths used for grep. Just change /var/www/app to whatever your magento directory is. Copy this script to a file and execute it. You need to have ack-grep installed for it to work properly. Ubuntu users can type "sudo apt-get ack-grep" I believe to install this, or just google ack-grep.

    THIS IS A SHELL PHP SCRIPT. IF YOU RUN IT IN A BROWSER, IT LOOKS LIKE A MESS! However, you can do "php whateveryoucallthescript.php >> output.txt" and then open that file in VI or edit it and search for the results you want.

    This has been tested on Enterprise 1.11.1.0

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

提交回复
热议问题