11

有时在寻找一个方便的事件来挂钩时,我会做一些探索性编程......

  • Mage::dispatchEvent用这个额外的行修改:

    Mage::log($name.'('.implode(',', array_keys($data)).')');
    
  • 标记一个我知道我不能很快赶上的起点:

    Mage::log(__METHOD__.'::START');
    
  • 标记一个我以后不想捕获的端点:

    Mage::log(__METHOD__.'::STOP');
    
  • 观看日志并逐步浏览网站(例如订单提交,正在调查的任何内容)

    tailf var/log/system.log
    

这给了我一个充满无聊数据和正在传递的对象名称的屏幕。除了STARTandSTOP我通常不会寻找任何足够具体的东西来 grep ,我必须依靠我的经验来确定可能的引导点。例如,在下订单时,我知道某处经常有“报价”,或者可以通过“付款”对象获取对订单的引用,反之亦然。

然后我必须记住删除我的标记(使用任何版本控制时都不是那么难)。

您使用什么方法来查找事件?不修改核心代码能做到吗?

4

5 回答 5

9

如果我正在寻找一个特定的事件,通常我会在 Mage.php 中编辑 dispatchEvent() 并将其添加到顶部(我认为这些是日志的正确参数,尽管从内存中写入):

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

然后我将刷新页面,注释掉该行以防止文件在其中获取额外的事件,然后查看我的 events.txt 文件以查看为该页面加载而触发的所有事件。

可以肯定的是,这有点 hacky,但我发现它对于查找名称中包含变量的事件很有用。

于 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 回答
1

在 magento 中显式触发的事件列表,以及内部隐式事件列表。

在这里检查

于 2014-06-21T09:51:18.077 回答
0

我以为我会从上面发回代码,但稍作修改以使其正常工作。需要分配 $magento 以及用于 grep 的路径。只需将 /var/www/app 更改为您的 magento 目录即可。将此脚本复制到文件并执行它。您需要安装 ack-grep 才能正常工作。Ubuntu 用户可以输入“sudo apt-get ack-grep”我相信安装它,或者只是 google ack-grep。

这是一个外壳 PHP 脚本。如果您在浏览器中运行它,它看起来就像一团糟!但是,您可以执行“php whateveryoucallthescript.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 回答