Escolhendo o Melhor Evento para seus Observers

havana.club

Quando você desenvolve seu próprio módulo em Magento ou qualquer tipo de modificação que faça utilizando observers para eventos específicos, é muito importante que você escolha o evento mais adequado para utilizar seu observer.

O Magento não possui uma lista oficial de eventos que podem ser capturados em observes para termos como referência, porém um dos métodos para obter esta listagem é fazer uma busca nos arquivos Core do Magento, dentro de seu IDE (como o Netbeans, por exemplo) por Mage::dispatchEvent(, o que lhe trará um resultado de uma média de 400 ocorrências para a versão community e 900 para a versão enterprise.

Muitos destas chamadas passam como parâmetro um nome estático, ex:

[php]
Mage::dispatchEvent(‘catalog_product_is_salable_before’, array(‘product’ => $this));
[/php]

Também existem chamadas de eventos onde os nomes passados como parâmetro são formados pela junção de um prefixo com um nome estático, ex:

[php]
Mage::dispatchEvent($this->_eventPrefix.’_validate_before’, array($this->_eventObject=>$this));
[/php]

Para estes casos, todo e qualquer model que extenda a classe Mage_Core_Model_Abstract, seja customizado ou não, possui um evento atrelado aos métodos save(), load() e delete(), ou seja, quando um model faz um load , save ou delete no banco são disparados por padrão os eventos [prefixo do evento]_load_before[prefixo do evento]_load_after[prefixo do evento]_save_before[prefixo do evento]_save_after[prefixo do evento]_delete_before.

Uma vez que o Magento não possibilita que sejam observados mais de um evento ao mesmo tempo, precisamos encontrar uma maneira de capturar todos os eventos para certos requests.

Se observarmos a declaração do método Mage::dispatchEvent em app/Mage.php encontraremos o seguinte:

[php]
public static function dispatchEvent($name, array $data = array())
{
Varien_Profiler::start(‘DISPATCH EVENT:’.$name);
$result = self::app()->dispatchEvent($name, $data);
#$result = self::registry(‘events’)->dispatch($name, $data);
Varien_Profiler::stop(‘DISPATCH EVENT:’.$name);
return $result;
}
[/php]

Não é possível sobrescrever a classe Mage para adicionar a funcionalidade de logar todos os nomes dos eventos relacionados ao nosso request. O métodoo Mage::dispatchEvent chama o método dispatchEvent  da classe Mage_Core_Model_App. Não podemos sobrescrevê-la também, pois o objeto App é instanciado diretamente pela aplicação, não pelo método Mage::getModel.

Então a única maneira de capturar todos os nomes dos eventos relativos a um certo request é adicionar uma pequena linha hard-code ao método Mage::dispatchEvent.
Nós adicionaremos algo como o seguinte:

[php]
Mage::log($name, null, ‘events.log’, true);
[/php]

Esta linha será responsável por logar todos os nomes dos eventos disparados em um certo request.
Após a modificação, o método dispatchEvent em app/Mage.php estará similar á:

[php]
public static function dispatchEvent($name, array $data = array())
{
// log event name
Mage::log($name, null, ‘events.log’, true);
Varien_Profiler::start(‘DISPATCH EVENT:’.$name);
$result = self::app()->dispatchEvent($name, $data);
#$result = self::registry(‘events’)->dispatch($name, $data);
Varien_Profiler::stop(‘DISPATCH EVENT:’.$name);
return $result;
}
[/php]

Até a próxima!

Tiago Sampaio

Leave a comment