Как найти подходящее событие в 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 для этого, и я должен полагаться на свой опыт, чтобы определить возможные точки загрузки. Например, при размещении заказов я знаю, что где-то часто есть "цитата", или можно получить ссылку на заказ через объект "оплата" или наоборот.
Затем я должен забыть удалить мои маркеры (не так сложно при использовании какого-либо управления версиями).
Какие методы вы используете для поиска событий? Можете ли вы это сделать без изменения кода ядра?
Ответы
Ответ 1
Начиная с 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 в вашей конкретной версии.
Редактировать 2/14/2013:
Этот список, находящийся на пару лет, больше не действует. Я предлагаю вам использовать следующий ресурс, поскольку это не только лучший ответ, но и дает вам множество примеров и источников поиска лучших крючков событий.
https://magento.stackexchange.com/a/167/336
Ответ 2
Если я ищу конкретное событие, как правило, я отредактирую dispatchEvent() в Mage.php и добавлю его в начало (я думаю, что это правильные параметры для журнала, но это из памяти):
Mage::log( $name, 1, 'events.txt' );
Затем я обновляю страницу, закомментирую эту строку, чтобы файл не получал дополнительные события, а затем загляните в мой файл events.txt, чтобы просмотреть все события, которые были запущены для загрузки этой страницы.
Это хакки, чтобы быть уверенным, но я нашел полезным для поиска событий с переменными как часть их имен.
Ответ 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, которые я не могу найти. В любом случае, надеюсь, что вы дадите представление о моем процессе!
Спасибо,
Джозеф Масти
Ответ 4
Список событий, явно запущенных в magento, вместе с внутренними неявными.
проверить здесь
Ответ 5
Я думал, что верну код назад, но немного изменил, чтобы работать правильно. $magento необходимо назначить, а также пути, используемые для grep. Просто измените /var/www/app на любой ваш каталог magento. Скопируйте этот script в файл и выполните его. Для правильной работы вам необходимо установить ack-grep. Пользователи Ubuntu могут набирать "sudo apt-get ack-grep". Я считаю, что установить это или просто gock-ack-grep.
ЭТО ОБОЛОЧКА PHP SCRIPT. ЕСЛИ ВЫ СДЕЛАЛИ ЭТО В БРАУЗЕРЕ, ЭТО СМОТРЕТЬ КАК МЫС! Однако вы можете сделать "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;
}
?>