2011-03-12 24 views
11

A veces cuando se busca un caso práctico para enganchar hago un poco de programación exploratoria ...¿Cómo encontrar un evento apropiado en Magento?

  • Modificar Mage::dispatchEvent con esta línea adicional:

    Mage::log($name.'('.implode(',', array_keys($data)).')'); 
    
  • marca un punto de inicio que sé no puedo coger más pronto:

    Mage::log(__METHOD__.'::START'); 
    
  • marca un punto final, que no quieren ponerse al día más adelante:

    Mage::log(__METHOD__.'::STOP'); 
    
  • Mire el registro y recorra el sitio (ej. envío de pedidos, lo que está siendo investigado)

    tailf var/log/system.log 
    

Esto me da una pantalla llena de datos aburridos y los nombres de los objetos que se pasa. Aparte de START y STOP Normalmente no busco nada lo suficientemente específico como para obtenerlo y tengo que confiar en mi experiencia para identificar posibles puntos de arranque. Por ejemplo, al hacer pedidos, sé que a menudo hay una "cotización" en algún lugar, o es posible obtener una referencia al pedido a través de un objeto de "pago", o viceversa.

Luego, tengo que acordarme de quitar mis marcadores (no es tan difícil cuando uso cualquier tipo de control de versiones).

¿Qué métodos usas para encontrar eventos? ¿Puedes hacerlo sin modificar el código central?

+0

Mi pregunta es un poco subjetivo y no es exactamente para lo que Stack Overflow es. – clockworkgeek

Respuesta

6

A partir del 1.2, la lista de eventos se seleccionó en la wiki de Magento. Puede encontrar la lista aquí:

http://www.magentocommerce.com/wiki/_media/magento_events_v1.2.0.2.xls

Sin embargo, desde entonces, varios eventos han quedado obsoletos. Hay una lista aquí, pero es sólo vigente a partir de 1,4

http://masteringmagento.com/2010/06/events-list-in-magento-community-1-4/

Si usted es hábil, puede ejecutar grep -R dispatchEvent en su directorio de trabajo Magento y analizar a través de la escasez de llamadas de despacho. Estas son las definiciones reales de todos los eventos de Magento en su versión particular.

Edición 14/02/2013:

Esta lista, siendo un par de años de edad, ya no es válido. Sugiero que use el siguiente recurso, ya que no solo es una mejor respuesta, sino que le brinda muchos ejemplos y fuentes para encontrar mejores ganchos para eventos.

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

+3

Este tipo de listas no son tan útiles para encontrar ese evento "apropiado". Los prefijos y postfixes son variables, por lo que la lista no explica cuáles podrían ser esos valores. Tampoco explica si se disparará cuando creo que sí o si contendrá el tipo correcto de información. Gracias de cualquier manera. – clockworkgeek

+0

No es tan útil, pero es suficiente para acercarse a lo que está buscando. Gracias por aceptar. – philwinkle

2

philwinkle ya se publicó un enlace a mi lista de edad, pero voy a seguir adelante y publicar lo que utilizo para generar listas de eventos. Es más largo de lo que parece que debería ser, pero eso se debe a una falta general de estándares de codificación en el marco. Básicamente, este código se apagará y encontrará todos los eventos, e intentará formatearlos por usted. Si lo desea, puedo ejecutarlo en 1.5.0.1 y actualizar el blog (probablemente sería bueno hacerlo después de tantos meses, pero el tiempo es una amante voluble).

El código:

$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; 
} 

Esto es parte de mi homebrew línea de cadena de herramientas de comandos de Magento. Probablemente solo se ejecute en Linux, y puede haber funciones lib internas que no puedo encontrar. De todos modos, espero que te dé una idea sobre mi proceso.

Gracias, José Mastey

+0

No reconozco la función 'print_error', pero puedo adivinar qué hace. – clockworkgeek

9

Si estoy buscando para un evento específico, por lo general voy a editar dispatchEvent() en Mage.php y añadir esto a la parte superior (creo que estos son los parametros adecuados para registro , escribiendo esto desde la memoria sin embargo):

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

entonces voy a actualizar la página, comentar que la línea para mantener el archivo de hacer que los eventos adicionales en ella, y luego ir a buscar a mi archivo Events.txt para ver todos los eventos que dispararon para esa página cargan.

Es un poco hacky estar seguro, pero me ha resultado útil para encontrar eventos con variables como parte de sus nombres.

0

Pensé que volvería a publicar el código desde arriba, pero se modificó ligeramente para que funcione bien. $ magento debe asignarse, así como las rutas utilizadas para grep. Simplemente cambie/var/www/app a cualquiera que sea su directorio magento. Copie este script en un archivo y ejecútelo. Necesita tener ack-grep instalado para que funcione correctamente. Los usuarios de Ubuntu pueden escribir "sudo apt-get ack-grep" Creo que para instalar esto, o simplemente google ack-grep.

ESTE ES UN SHELL PHP SCRIPT. ¡SI LO EJECUTAS EN UN NAVEGADOR, PARECE COMO UN MOSQUERO! Sin embargo, puede hacer "php whateveryoucallthescript.php >> output.txt" y luego abrir ese archivo en VI o editarlo y buscar los resultados que desee.

Esto ha sido probado en el 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; 
    } 

    ?> 
1

Lista de eventos activados explícitamente en Magento, junto con los implícitos internos ..

cheque here

Cuestiones relacionadas