【问题标题】:How to find an appropriate event in Magento?如何在 Magento 中找到合适的事件?
【发布时间】:2011-03-12 00:40:46
【问题描述】:

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

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

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

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

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

    tailf var/log/system.log
    

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

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

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

【问题讨论】:

  • 我的问题有点主观,并不完全是 Stack Overflow 的用途。

标签: events magento coding-style exploratory


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    从 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】:

    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 函数。无论如何,希望这能让您对我的流程有所了解!

    谢谢, 约瑟夫·马斯蒂

    【讨论】:

    • 我不认识print_error函数,但我能猜到它的作用。
    【解决方案4】:

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

    查看here

    【讨论】:

      【解决方案5】:

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

      这是一个 SHELL 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;
          }
      
          ?>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-07-14
        • 1970-01-01
        • 1970-01-01
        • 2014-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多