Pregunta

No entiendo por qué el objeto Varien_Event_observer tiene Getters y Setters para el atributo 'Nombre'. Sin embargo, cuando lo usa en el método definido por mi XML de configuración, llamar a getName () devuelve nulo?

¿Adivinaría que el nombre de nodo único que usa en la configuración XML debería usarse como el nombre del observador?

p.ej.

 <events>
    <catalog_product_save_after>
        <observers>
            <my_special_unique_name>
                <type>singleton</type>
                <class>my_special/catalog_product_save_after_observer</class>
                <method>myMethod</method>
            </my_special_unique_name>
        </observers>
    </catalog_product_save_after>
</events>

public function myMethod($observer) {

    //Returns null , not what I would expect to be "my_special_unique_name"
    $observer->getName();

}

¿Me estoy perdiendo algo, hubo intención allí y nunca se agregó?

¿Fue útil?

Solución

Obtiene un valor vacío para el nombre del observador porque el nombre no está configurado. No hay ninguna línea como $observer->setName()
La instancia de observador se crea en Mage_Core_Model_App::duspatchEvent() Y las únicas operaciones realizadas con él son las siguientes:

//instantiate
$observer = new Varien_Event_Observer(); 

//set event details
$observer->setData(array('event'=>$event)); 

//call the needed method with the $observer as parameter
$this->_callObserverMethod($object, $method, $observer); 
//the line above is just a wrapper for $object->$method($observer);

Si inyectas en algún lugar entre el momento en que se instancia el observador y el momento en que el método se llama:

$observer->setName('Mickey Mouse');

Podrá obtener el nombre del observador en su método.

El valor que esperaba que se devolviera es en realidad el valor de la variable $obsName En este código:

foreach ($eventConfig->observers->children() as $obsName=>$obsConfig) {
    $observers[$obsName] = array(
        'type'  => (string)$obsConfig->type,
        'model' => $obsConfig->class ? (string)$obsConfig->class : $obsConfig->getClassName(),
        'method'=> (string)$obsConfig->method,
        'args'  => (array)$obsConfig->args,
    );
} 

Esa etiqueta se usa solo para poder tener diferentes observadores para el mismo evento (diferentes valores de etiqueta) o para poder anular a algún observador usando en su propio módulo una de las etiquetas existentes para un evento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top