Как найти подходящее событие в Magento? - PullRequest
11 голосов
/ 12 марта 2011

Иногда, когда я ищу удобное событие для подключения, я делаю небольшое исследовательское программирование ...

  • Изменить Mage::dispatchEvent с помощью этой дополнительной строки:

    Mage::log($name.'('.implode(',', array_keys($data)).')');
    
  • Отметьте начальную точку, которую, я знаю, я не смогу поймать раньше:

    Mage::log(__METHOD__.'::START');
    
  • Отметьте конечную точку, которую я не хочу ловить позже:

    Mage::log(__METHOD__.'::STOP');
    
  • Просмотр журнала и просмотр сайта (например, подача заказа, что бы ни расследовалось)

    tailf var/log/system.log
    

Это дает мне экран, полный скучных данных и имен передаваемых объектов.Кроме START и STOP, я обычно не ищу ничего достаточно конкретного, чтобы понять это, и мне приходится полагаться на свой опыт для определения возможных точек начальной загрузки.Например, при размещении заказов, которые я знаю, часто где-то есть «цитата», или можно получить ссылку на заказ через объект «платеж», или наоборот.

Тогда я должен запомнитьудалить мои маркеры (не так сложно при использовании какого-либо управления версиями).

Какие методы вы используете, чтобы найти события?Можете ли вы сделать это без изменения кода ядра?

Ответы [ 5 ]

9 голосов
/ 14 марта 2011

Если я ищу конкретное событие, обычно я редактирую dispatchEvent () в Mage.php и добавляю его в начало (я думаю, что это правильные параметры для журнала, хотя и записываю это из памяти):

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

Затем я обновлю страницу, закомментирую эту строку, чтобы не допустить в файл дополнительных событий, а затем перейду к моему файлу events.txt, чтобы увидеть все события, которые сработали для этой страницы.load.

Конечно, это немного хакерски, но я нашел это полезным для поиска событий с переменными как частью их имен.

6 голосов
/ 12 марта 2011

Начиная с 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 в вашей конкретной версии.

Изменить 14.02.2013:

Этот список, будучи парой лет, больше не действителен. Я предлагаю вам использовать следующий ресурс, так как это не только лучший ответ, но и дает вам много примеров и источников поиска лучших обработчиков событий.

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

2 голосов
/ 12 марта 2011

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, которые я не могу найти. Во всяком случае, надеюсь, что это дает вам представление о моем процессе!

Спасибо, Джозеф Мастей

1 голос
/ 21 июня 2014

Список событий, явно запущенных в magento, вместе с внутренними неявными.

отметьте здесь

0 голосов
/ 16 февраля 2012

Я думал, что отправлю обратно код сверху, но немного изменил для правильной работы.Необходимо указать $ 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;
    }

    ?>
...