Ganchos Lógicos

Introdução
Os ganchos lógicos permitem que você se conecte a vários eventos no SuiteCRM para disparar o código personalizado. Isso pode permitir que você, por exemplo, faça uma chamada para uma API externa ou crie um novo registro se determinados eventos ocorrerem.

 

Tipos
Os ganchos lógicos podem ocorrer em três contextos. Esses contextos são ganchos de aplicativo, ganchos de módulo e ganchos de usuário. Eles são detalhados a seguir.

Ganchos de aplicativos
Os ganchos do aplicativo são disparados no contexto do aplicativo (ou seja, não são disparados contra um módulo específico). Esses ganchos devem ser definidos no gancho lógico de nível superior (ou seja, custom / modules / logic_hooks.php).

after_entry_point
Chamado após a inicialização do SuiteCRM, mas antes de qualquer outro processamento ser realizado.

after_ui_footer
Chamado após o rodapé da IU.

after_ui_frame
Disparado após a exibição da IU, mas antes da exibição do rodapé.

server_round_trip
Disparado no final de cada solicitação de página.

 

Ganchos de usuário
Os ganchos do usuário são disparados para certas ações de login / logout. Semelhante aos ganchos de aplicativo, esses ganchos devem ser definidos no gancho lógico de nível superior (ou seja, custom / modules / logic_hooks.php).

after_login
Disparado depois que um usuário efetua login no SuiteCRM.

after_logout
Disparado quando um usuário efetua logout do SuiteCRM.

before_logout
Disparado antes que um usuário saia do SuiteCRM.

login_failed
Disparado quando um usuário tenta fazer login no SuiteCRM, mas o login falha.

 

Ganchos de Módulo
Os ganchos do módulo são chamados em várias ações de registro para um módulo específico.

after_delete
Disparado quando um registro é excluído.

after_relationship_add
Disparado depois que um relacionamento é adicionado entre dois registros. Observe que isso pode ser chamado duas vezes, uma para cada lado do relacionamento.

after_relationship_delete
Disparado após a exclusão de um relacionamento entre dois registros.

after_restore
Disparado após o cancelamento da exclusão de um registro.

after_retrieve
Disparado depois que um registro é recuperado do banco de dados.

after_save
Disparado após um registro ser salvo. Observe que devido a algumas peculiaridades, alguns módulos relacionados podem não ser mantidos no banco de dados. O gancho lógico é disparado dentro do método de salvamento das classes do SugarBean. Algumas classes de implementação podem salvar beans relacionados após o retorno desse método. Um exemplo notável disso é o salvamento de endereços de e-mail nos módulos da empresa.

before_delete
Disparado antes de um registro ser excluído.

before_relationship_add
Disparado antes que um relacionamento seja adicionado entre dois registros. Observe que isso pode ser chamado duas vezes, uma para cada lado do relacionamento.

before_relationship_delete
Disparado antes de um relacionamento entre dois registros ser excluído. Observe que isso pode ser chamado duas vezes, uma para cada lado do relacionamento.

before_restore
Disparado antes que um registro seja recuperado.

before_save
Disparado antes que um registro seja salvo.

handle_exception
Disparado quando ocorre uma exceção em um registro.

process_record
Disparado quando um registro é processado e está pronto para ser exibido em visualizações de lista ou dashlets.

 

Ganchos de fila de trabalho
Ganchos de fila de trabalho são disparados para trabalhos do planejador. Semelhante aos ganchos de aplicativo, esses ganchos devem ser definidos no gancho lógico de nível superior (ou seja, custom / modules / logic_hooks.php).

job_failure
Disparado quando um trabalho agendado retorna falso para significar falha ou lança uma exceção e não será tentado novamente. Consulte a seção sobre Tarefas agendadas.

job_failure_retry
Disparado quando um trabalho agendado retorna falso para significar falha ou lança uma exceção, mas será tentado novamente. Consulte a seção sobre Tarefas agendadas.

 

Implementando
Dependendo do tipo Logic Hook, os ganchos lógicos são colocados em custom / modules / Logic_Hooks.php ou custom / modules / /Logic_Hooks.php.

 

Logic_Hooks.php
O próprio arquivo de gancho de lógica especifica quais ganchos de lógica disparar neste evento. É mais ou menos assim:

Exemplo 12.1: Arquivo de gancho lógico

<?php
  // Do not store anything in this file that is not part of the array or the hook
  //version.  This file will be automatically rebuilt in the future.
 $hook_version = 1;
 $hook_array = Array();
  // position, file, function
 $hook_array['before_save'] = Array();
 $hook_array['before_save'][] = Array(
                                77,
                                'updateGeocodeInfo',
                                'custom/modules/Cases/CasesJjwg_MapsLogicHook.php',
                                'CasesJjwg_MapsLogicHook',
                                'updateGeocodeInfo');
  $hook_array['before_save'][] = Array(
                                10,
                                'Save case updates',
                                'modules/AOP_Case_Updates/CaseUpdatesHook.php',
                                'CaseUpdatesHook',
                                'saveUpdate');
  $hook_array['before_save'][] = Array(
                                11,
                                'Save case events',
                                'modules/AOP_Case_Events/CaseEventsHook.php',
                                'CaseEventsHook',
                                'saveUpdate');
  $hook_array['before_save'][] = Array(
                                12,
                                'Case closure prep',
                                'modules/AOP_Case_Updates/CaseUpdatesHook.php',
                                'CaseUpdatesHook',
                                'closureNotifyPrep');
  $hook_array['before_save'][] = Array(
                                1,
                                'Cases push feed',
                                'custom/modules/Cases/SugarFeeds/CaseFeed.php',
                                'CaseFeed',
                                'pushFeed');
  $hook_array['after_save'] = Array();
  $hook_array['after_save'][] = Array(
                                77,
                                'updateRelatedMeetingsGeocodeInfo',
                                'custom/modules/Cases/CasesJjwg_MapsLogicHook.php',
                                'CasesJjwg_MapsLogicHook',
                                'updateRelatedMeetingsGeocodeInfo');
  $hook_array['after_save'][] = Array(
                                10,
                                'Send contact case closure email',
                                'modules/AOP_Case_Updates/CaseUpdatesHook.php',
                                'CaseUpdatesHook',
                                'closureNotify');
  $hook_array['after_relationship_add'] = Array();
  $hook_array['after_relationship_add'][] = Array(
                                77,
                                'addRelationship',
                                'custom/modules/Cases/CasesJjwg_MapsLogicHook.php',
                                'CasesJjwg_MapsLogicHook',
                                'addRelationship');
  $hook_array['after_relationship_add'][] = Array(
                                9,
                                'Assign account',
                                'modules/AOP_Case_Updates/CaseUpdatesHook.php',
                                'CaseUpdatesHook',
                                'assignAccount');
  $hook_array['after_relationship_add'][] = Array(
                                10,
                                'Send contact case email',
                                'modules/AOP_Case_Updates/CaseUpdatesHook.php',
                                'CaseUpdatesHook',
                                'creationNotify');
  $hook_array['after_relationship_delete'] = Array();
  $hook_array['after_relationship_delete'][] = Array(
                                77,
                                'deleteRelationship',
                                'custom/modules/Cases/CasesJjwg_MapsLogicHook.php',
                                'CasesJjwg_MapsLogicHook',
                                'deleteRelationship');

Vamos examinar cada parte do arquivo.
4 $hook_version = 1;

Isso define a versão do gancho que estamos usando. Atualmente existe apenas uma versão, portanto, esta linha não é utilizada.
5 $hook_array = Array();

Aqui nós configuramos um array vazio para nossos Logic Hooks. Isso sempre deve ser chamado de $hook_array.
7 $hook_array[‘before_save’] = Array();

Aqui iremos adicionar alguns ganchos before_save, então adicionaremos um array vazio para aquela chave.

$hook_array['before_save'][] = Array(
                               77,
                               'updateGeocodeInfo',
                               'custom/modules/Cases/CasesJjwg_MapsLogicHook.php',
                               'CasesJjwg_MapsLogicHook',
                               'updateGeocodeInfo');

Finalmente chegamos a uma linha interessante. Isso adiciona um novo gancho lógico aos ganchos before_save. Este array contém 5 entradas que definem este gancho.
Esses são:

Sort Order
O primeiro argumento (77) é a ordem de classificação para este gancho. A matriz de gancho lógico é classificada por este valor. Se você deseja que um gancho atire antes, você deve usar um número menor. Se você deseja que um gancho seja disparado mais tarde, você deve usar um número maior. Os próprios números são arbitrários.

Hook Label
O segundo argumento (‘updateGeocodeInfo’) é simplesmente um rótulo para o gancho lógico. Deve ser algo curto, mas descritivo.

Hook File
O terceiro argumento é onde está a classe real para este gancho. Neste caso, ele está em um arquivo chamado custom / modules / Cases / CasesJjwg_MapsLogicHook.php. Geralmente você deseja que os arquivos estejam em algum lugar personalizado e é comum tê-los em custom / modules / / .php ou custom / modules / .php para Logic Hooks não direcionados a um módulo específico . No entanto, os arquivos podem ser colocados em qualquer lugar.

Hook Class
O quarto argumento é o nome da classe para a classe Logic Hook. Neste caso, CasesJjwg_MapsLogicHook. É normal que o nome da classe corresponda ao nome do arquivo, mas isso não é necessário.

Método Hook
O quinto e último argumento é o método que será chamado na classe. Neste caso, updateGeocodeInfo.

 

Adicionando seus próprios ganchos lógicos
Ao adicionar ganchos lógicos, você deve fazer uso total da estrutura de extensões (consulte a seção sobre extensões). Isso envolve a criação de um arquivo em custom / Extension / application / Ext / LogicHooks / para ganchos de aplicativos e custom / Extension / modules / / Ext / LogicHooks / para ganchos específicos de módulo. Esses arquivos podem então adicionar / alterar o $ hook_array conforme apropriado.

Função Logic Hook
A função de gancho lógico em si irá variar ligeiramente com base no tipo de gancho lógico.
Para ganchos de módulo, será semelhante a:

Exemplo 12.2: Exemplo de método de gancho lógico
class SomeClass {function someMethod($bean, $event, $arguments) { //Custom Logic } }

Os ganchos da lógica do aplicativo omitem o argumento $bean:
Exemplo 12.3: Exemplo de método de gancho lógico para ganchos de aplicativo
class SomeClass {function someMethod($event, $arguments) { //Custom Logic }}

$bean (SugarBean)
O argumento $ bean passado para seu gancho lógico é geralmente o bean no qual o gancho lógico está sendo executado. Para User Logic Hooks, este será o objeto User atual. Para ganchos lógicos de módulo (como before_save), este será o registro que está sendo salvo. Para ganchos lógicos de fila de trabalho, este será o bean SchedulersJob. Observe que, para Application Logic Hook, esse argumento não está presente.

$event (string)
O argumento $ event contém o evento de gancho lógico, por exemplo, process_record, before_save, after_delete etc.

$argumentos (array)
O argumento $ arguments contém quaisquer detalhes adicionais do evento de gancho lógico. Ou seja no caso de before_relationship_add, conterá detalhes dos módulos relacionados.