Tu peux tout à fait créer tes propres hooks dans un module, puis accrocher un module au hook qu'il a créé.
Exemple ci dessous, avec le code qui permet 1) de créer le hook (ici, "order-invoice.before-discount"à, et 2) d'accrocher le module au hook.
// Ajouter le hook order-invoice.before-discount s'il n'est pas déjà défini
if (null === HookQuery::create()->findOneByCode('order-invoice.before-discount')) {
try {
$hookEvent = new HookCreateEvent();
// Définir les caractéristiques du Hook
$hookEvent
->setCode('order-invoice.before-discount')
->setType(TemplateDefinition::FRONT_OFFICE)
->setNative(false)
->setActive(true)
->setLocale('en_US')
->setTitle("Before discount code form block");
// Créer le hook
$this->getDispatcher()->dispatch(TheliaEvents::HOOK_CREATE, $hookEvent);
if ($hookEvent->hasHook()) {
// La création a réussi, accrocher le module au hook
$moduleHookEvent = new ModuleHookCreateEvent();
// On indique ici que le module déclare une méthode "orderInvoiceForm" qui traitera le HookEvent
$moduleHookEvent
->setModuleId($this->getModuleId())
->setHookId($hookEvent->getHook()->getId())
->setClassname('creditaccount.order_invoice.hook')
->setMethod('orderInvoiceForm');
// Accrocher le module au hook
$this->getDispatcher()->dispatch(TheliaEvents::MODULE_HOOK_CREATE, $moduleHookEvent);
if ($moduleHookEvent->hasModuleHook()) {
// Si l'accrochage a réussi, activer l'accrochage du module, ce n'est pas réalisé lors de la création.
$event = new ModuleHookToggleActivationEvent($moduleHookEvent->getModuleHook());
$this->getDispatcher()->dispatch(TheliaEvents::MODULE_HOOK_TOGGLE_ACTIVATION, $event);
}
}
} catch (\Exception $ex) {
// Un truc a foiré quelque part: on logge le problème.
throw new TheliaProcessException(
Translator::getInstance()->trans(
"Failed to put module in 'order-invoice.before-discount' hook (%err)",
['%err' => $ex->getMessage()]
),
$ex
);
}
}
Ce code peut être placé dans la méthode postActivation() de ton module.
Tu devras bien sût aller ajouter ton hook dans tes templates. Ici, par exemple :
{hook name="order-invoice.before-discount"}