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 cherche le template du hook "invoice.header". D'une manière générale où sont-ils ? J'ai vu des modules hook-xxxx, mais je n'ai pas trouvé ce que je cherchais...
Et dernière question et non des moindres, comment faire des hooks ?

Merci de votre aide.

Last edited by GillesL (06-09-2018 08:46:46)

Offline


templates/pdf/default/invoice.html, ligne 130

Une recherche dans tous les fichiers te permet de trouver les hooks dans les templates.

Qu'est ce que tu veux dire exactement par "faire des hooks" ?


OpenStudio Toulouse

Offline


Merci de ta réponse. Je me rend compte que j'ai peut être mal formulée ma question...

roadster31 wrote:

templates/pdf/default/invoice.html, ligne 130

Une recherche dans tous les fichiers te permet de trouver les hooks dans les templates.

{hook name="invoice.header" order=$order_id}

Ca n'appelle pas une sorte de template ? Si oui, où est-il ? Telle est ma question ;-)

Offline


Je ne comprends pas ce que tu veux faire.


OpenStudio Toulouse

Offline


En gros, je cherche à comprendre comment marche les hooks. Apparement, ça permet de modifier certaines zones dans un template. Mais je ne comprend pas, si , de base le ligne :

{hook name="invoice.header" order=$order_id}

appelle une sorte de template pour afficher quelque chose à l'écran.... Et si  oui, ou est le template qui permet d'afficher ce quelque chose. Et comment le remplacer le cas échéant.

Bon, en gros, c'est quoi un hook et comment ça marche. J'ai lu http://doc.thelia.net/en/documentation/ … index.html, mais je comprend pas... Il y a un truc qui m'échappe...

Ca serait pour faire la page d'accueil des marchands dans l'espace privé. Un peu comme la page d'accueil de base de Thelia, mais avec des infos qui regarde seulement le marchand connecté. Je ne suis pas usr d'être clair. Merci de ta patience !

Offline


Le hook sert exactement à ça : injecter dans la page un bout de code HTML généré par un module.

En général il faut coder dans le module pour générer et injecter ce code HTML, par exemple regarde dans le module HookContact les fichiers suivants :

HookContact/Config/config.xml : on y trouve la déclaration du hook dans la section "hooks"
HookContact/templates/frontOffice/default/main-footer-body.html : le template Smarty du HTML à injecter
HookContact/Hook/FrontHook.php : on y trouve la génération du code HTML à partir d'un template ($this->render()), et l'injection ($event->add())

Dans, le nom de la méthode est implicite, car on respect une règle de nommage fonction du nom du hook  : main.footer-body => onMainFooterBody (tu vois l'idée)

Mais tu pourrais aussi indiquer explicitement la méthode a appeler pour générer le code HTML :

<tag name="hook.event_listener" event="main.footer-body" method="monNomDeMethodeAMoi"/>

Dans ce cas dans Hook/FrontHook.php on aurait écrit :

public function monNomDeMethodeAMoi(HookRenderBlockEvent $event) { ... }

Attention à la subtilité entre HookRenderEvent et HookRenderBlockEvent le premier est utllisé pour un hook simple, comme {hook name="home.body"}, et le second pour les hook de type bloc (avec répétition) : {hookblock name="main.footer-body"  fields="id,class,title,content"}

Depuis Thelia 2.3, on peut accrocher un template à un hook sans coder (cf. http://doc.thelia.net/en/documentation/ … -thelia-23 ). Tu peux donc essayer quelque chose comme ça dans le config.xml du module BetterContact

        <hooks>
            <hook id="bettercontact.hooks">
                 <tag name="hook.event_listener" event="home.body" templates="render:le-nom-de-ton-template.html" />
            </hook>
        </hooks>

Inconvénient : tu ne peux pas passer de paramètres (comme un ID vendeur par exemple) au template qui est rendu.

Tu trouveras un exemple de cette technique dans HookProductsNew qui injecte les 4 derniers produits sur la home page.

Enfin, tu peux créer tes propes hooks. Il te suffit alors de les placer où tu veux dans tes templates : {hook name="mon-hook-a-moi"}. Voir ici : http://doc.thelia.net/en/documentation/ … e_own.html


OpenStudio Toulouse

Offline


Merci de tes explications qui clarifie bien les choses !

Offline


J'ai créé mon hook comme cela

public function getHooks() {
        return array(
            array(
                "type" => TemplateDefinition::BACK_OFFICE,
                "code" => "home.top-seller",
                "title" => array(
                    "fr_FR" => "Page d'accueil - en haut, exclusivement pour les marchands",
                    "en_US" => "Home - Top, exclusively for sellers",
                ),
            ),
        );
    }

dans "ArtabanMarketplace\ArtabanMarketplace.php".

J'ai désactivé puis réactivé le module, mais mon hook n'apparait pas dans la liste "http://localhost/theliaArtabanMarketplace/web/index_dev.php/admin/hooks?order=code"

Il faut sans doute ajouter quelque chose dans la méthode "postActivation", mais je ne sais pas quoi... Je n'ai pas trouver l'info en regardans dans quelques modules, ni sur le web...
Tout ce que j'ai trouvé, c'est cela : http://forum.thelia.net/viewtopic.php?pid=69156 mais ça me parait bien compliqué et ne correspond pas à ce que laisse entendre la doc...

Une piste ?

[Edit 18/09/10 14h01]
j'ai trouvé la méthode "registerHooks" dans "C:\wamp64\www\theliaArtabanMarketplace\core\lib\Thelia\Module\BaseModuleInterface.php". J'ai essayé de l'utiliser, mais sans succès...

Last edited by GillesL (10-09-2018 13:02:08)

Offline


To hook est bien un hook back office : TemplateDefinition::BACK_OFFICE ?

Sinon, a force de bidouiller avec les hooks, on finit par casser des trucs. Je te conseille un petit

Thelia hook:clean ArtabanMarketplace

pour remettre tout ça d'équerre.


OpenStudio Toulouse

Offline


J'ai fait ce que tu as dit et j'ai finalement mis :

....
use Thelia\Core\Template\TemplateDefinition;
.....
public function postActivation(ConnectionInterface $con = null) {

...
        $this->registerHooks();
    }
.....
    public function getHooks() {
        return array(
            array(
                "type" => TemplateDefinition::BACK_OFFICE,
                "code" => "home.top-info-for-seller",
                "title" => array(
                    "fr_FR" => "Page d'accueil - en haut, exclusivement pour les marchands",
                    "en_US" => "Home - Top, exclusively for sellers",
                ),
            "block" => true,
            "active" => true
            )
        );
    }
....

dans "C:\wamp64\www\theliaArtabanMarketplace\local\modules\ArtabanMarketplace\ArtabanMarketplace.php"

Et en activant le module, le hook apparaît dans "http://localhost/theliaArtabanMarketplace/web/index_dev.php/admin/hooks?type=2". Attention, il y a plusieurs listes de hooks : les front office, les back office, les pdf et les email !

Last edited by GillesL (10-09-2018 14:34:25)

Offline


En principe l'appel à registerHooks() n'est pas nécessaire: cet appel est réalisé lors de l'activation du module.


OpenStudio Toulouse

Offline


Merci de la précision. Je test demain.