THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

Rejoignez la communauté sur le Discord Thelia : https://discord.gg/YgwpYEE3y3

Offline


Bonjour,

je me suis lancé dans l'installation de Thelia dernièrement (dernière version) et j'avoue pêcher sur pas mal de points.

je ne comprends pas ou se trouve la définition  de la liste des hooks de layout.tpl, autre part que dans les différents Hook ou ils sont appelés, exemple:

"main.navbar-primary"
...

Mes questions sont les suivantes:
- comment créer un main.navbar-third ? (nom bidon)
- ou sont définies les méthodes "onMainNavbarPrimary" et autres ? si je ne les instancie pas, Thelia fait du boudin.

En gros j'aimerai modifier le Hook de navigation, le Hook de recherche, et le Hook de cart, pour les mettre dans un même sous-template (perso), qui sera inséré à mon layout.

je vous remercie par avance.

Cordialement.

Offline


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"}

OpenStudio Toulouse