THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

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

Offline


Bonjour,

J'aimerai faire afficher le module suivant 'DuplicateOrder' dans une autre page
je cree mon tag

    <hooks>
        <hook id="duplicateorder.hook" class="DuplicateOrder\Hook\OrderDetailsHook" scope="request">
            <tag name="hook.event_listener_account" event="account.after-view" type="front" method="onAccountAfterView" />
            <tag name="hook.event_listener" event="account-order.bottom" type="front" method="onAccountOrderBottom" />
        </hook>
    </hooks>

je declare le hook

  public function getHooks() 
  {
     return array(

          // Only register the title in the default language
          array(
              "type" => TemplateDefinition::FRONT_OFFICE,
              "code" => "account.after-view",
              "title" => "Duplicate Order in account page",
              "description" => " ",
              "active" => true
          )
     );
  }

bien entendu, je declare la methode, pour mes tests c'est une simple copie de l'autre methode

J'active le module, l'icone 'hook de ce module' reste desactive
je vais sur la page hook
j'analyse le template Front
il me trouve le hook, je le coche pour le creer
toujours rien cote front

mon erreur est ou ? une idee ?

Offline


Apparemment personne utilise les hooks avec un tag perso...

Offline


Je ne comprends pas ce que tu veux faire.


OpenStudio Toulouse

Offline


j'aimerai faire afficher le plugin  a 2 endroits
par defaut il s'affiche dans le hook suivant page account-order.html

{hook name="account-order.bottom" order="{$order_id}"}

j'aimerai le faire afficher sur la page account
mais a l'endroit ou je veux le placer il n'ya pas de hook donc j'en defini un

{hook name="account.after-view" order="{$order_id}"}

au niveau du plugins je defini mon tag

    <hooks>
        <hook id="duplicateorder.hook" class="DuplicateOrder\Hook\OrderDetailsHook" scope="request">
            <tag name="hook.event_listener_account" event="account.after-view" type="front" method="onAccountAfterView" />
            <tag name="hook.event_listener" event="account-order.bottom" type="front" method="onAccountOrderBottom" />
        </hook>
    </hooks>

je declare aussi le hook pour l'evenement dans le plugins

 public function getHooks() 
  {
     return array(

          // Only register the title in the default language
          array(
              "type" => TemplateDefinition::FRONT_OFFICE,
              "code" => "account.after-view",
              "title" => "Duplicate Order in account page",
              "description" => " ",
              "active" => true
          )
     );
  }

et cela ne marche pas

sur la page hook, j'ai ajoute mon tag
r6h8.jpg

mais dans la positions des hook pour le module 'duplicate order' je n'ai que le tag 'account-order.bottom' qui apparait
6aj8.jpg

est ce la bonne procedure ?

Last edited by zzuutt (20-03-2015 08:43:44)

Offline


dans ma declaration du tag j'ai modifie comme suite <tag name="hook.event_listener_account"

    <hooks>
        <hook id="duplicateorder.hook" class="DuplicateOrder\Hook\OrderDetailsHook" scope="request">
            <tag name="hook.event_listener" event="account.after-view" type="front" method="onAccountAfterView" />
            <tag name="hook.event_listener" event="account-order.bottom" type="front" method="onAccountOrderBottom" />
        </hook>
    </hooks>

j'ai supprime la declaration qui suit

 public function getHooks() 
  {
     return array(

          // Only register the title in the default language
          array(
              "type" => TemplateDefinition::FRONT_OFFICE,
              "code" => "account.after-view",
              "title" => "Duplicate Order in account page",
              "description" => " ",
              "active" => true
          )
     );
  }

maintenant dans la position des hooks j'ai bien les 2 evenements qui s'affiche
i3qm.jpg

mais sur la page account a l'endroit

{hook name="account.after-view" order="{$order_id}"}

rien ne s'affiche

Last edited by zzuutt (20-03-2015 09:47:17)

Offline


Elle est appelée ta méthode onAccountAfterView() ?


OpenStudio Toulouse

Offline


apparement oui

496: INFO [ConnectionWrapper.php:log()] {653} 2015-03-20 10:00:27: SELECT order_status.ID, order_status.CODE, order_status.CREATED_AT, order_status.UPDATED_AT, NOT ISNULL(`requested_locale_i18n`.`ID`) AS IS_TRANSLATED, CASE WHEN NOT ISNULL(`requested_locale_i18n`.ID) THEN `requested_locale_i18n`.`TITLE` ELSE `default_locale_i18n`.`TITLE` END AS i18n_TITLE, CASE WHEN NOT ISNULL(`requested_locale_i18n`.ID) THEN `requested_locale_i18n`.`CHAPO` ELSE `default_locale_i18n`.`CHAPO` END AS i18n_CHAPO, CASE WHEN NOT ISNULL(`requested_locale_i18n`.ID) THEN `requested_locale_i18n`.`DESCRIPTION` ELSE `default_locale_i18n`.`DESCRIPTION` END AS i18n_DESCRIPTION, CASE WHEN NOT ISNULL(`requested_locale_i18n`.ID) THEN `requested_locale_i18n`.`POSTSCRIPTUM` ELSE `default_locale_i18n`.`POSTSCRIPTUM` END AS i18n_POSTSCRIPTUM FROM `order_status` LEFT JOIN `order_status_i18n` `default_locale_i18n` ON (order_status.ID=default_locale_i18n.ID AND `default_locale_i18n`.LOCALE = 'fr_FR') LEFT JOIN `order_status_i18n` `requested_locale_i18n` ON (order_status.ID=requested_locale_i18n.ID AND `requested_locale_i18n`.LOCALE = 'fr_FR') WHERE (NOT ISNULL(`requested_locale_i18n`.ID) OR NOT ISNULL(`default_locale_i18n`.ID)) AND order_status.ID IN ('1') LIMIT 2147483647
497: ERROR [OrderDetailsHook.php:onAccountAfterView()] {20} 2015-03-20 10:00:27: appel methode onAccountAfterView
498: INFO [ConnectionWrapper.php:log()] {653} 2015-03-20 10:00:27: SELECT config.ID, config.NAME, config.VALUE, config.SECURED, config.HIDDEN, config.CREATED_AT, config.UPDATED_AT FROM `config` WHERE config.NAME='form.secret' LIMIT 1
499: INFO [ConnectionWrapper.php:log()] {653} 2015-03-20 10:00:27: SELECT config.ID, config.NAME, config.VALUE, config.SECURED, config.HIDDEN, config.CREATED_AT, config.UPDATED_AT FROM `config` WHERE config.NAME='html_output_trim_level' LIMIT 1
500: INFO [ConnectionWrapper.php:log()] {653} 2015-03-20 10:00:27: SELECT order_status.ID, order_status.CODE, order_status.CREATED_AT, order_status.UPDATED_AT, NOT ISNULL(`requested_locale_i18n`.`ID`) AS IS_TRANSLATED, CASE WHEN NOT ISNULL(`requested_locale_i18n`.ID) THEN `requested_locale_i18n`.`TITLE` ELSE `default_locale_i18n`.`TITLE` END AS i18n_TITLE, CASE WHEN NOT ISNULL(`requested_locale_i18n`.ID) THEN `requested_locale_i18n`.`CHAPO` ELSE `default_locale_i18n`.`CHAPO` END AS i18n_CHAPO, CASE WHEN NOT ISNULL(`requested_locale_i18n`.ID) THEN `requested_locale_i18n`.`DESCRIPTION` ELSE `default_locale_i18n`.`DESCRIPTION` END AS i18n_DESCRIPTION, CASE WHEN NOT ISNULL(`requested_locale_i18n`.ID) THEN `requested_locale_i18n`.`POSTSCRIPTUM` ELSE `default_locale_i18n`.`POSTSCRIPTUM` END AS i18n_POSTSCRIPTUM FROM `order_status` LEFT JOIN `order_status_i18n` `default_locale_i18n` ON (order_status.ID=default_locale_i18n.ID AND `default_locale_i18n`.LOCALE = 'fr_FR') LEFT JOIN `order_status_i18n` `requested_locale_i18n` ON (order_status.ID=requested_locale_i18n.ID AND `requested_locale_i18n`.LOCALE = 'fr_FR') WHERE (NOT ISNULL(`requested_locale_i18n`.ID) OR NOT ISNULL(`default_locale_i18n`.ID)) AND order_status.ID IN ('4') LIMIT 2147483647
501: ERROR [OrderDetailsHook.php:onAccountAfterView()] {20} 2015-03-20 10:00:27: appel methode onAccountAfterView

Offline


pour mes tests j'ai fait une simple copie

    public function onAccountOrderBottom(HookRenderEvent $event)
    {
        $content = $this->render("duplicate-order.html", ["orderId"=>$event->getArgument("order")]);

        $event->add($content);
    }
    
    public function onAccountAfterView(HookRenderEvent $event)
    {
      Tlog::getInstance()->error("appel methode onAccountAfterView");
        $content = $this->render("duplicate-order.html", ["orderId"=>$event->getArgument("order")]);

        $event->add($content);
    }

si je mais le hook

{hook name="account-order.bottom" order="{$order_id}"}

dans ma page account, il s'affiche
mais pas avec mon tag

Offline


je ne comprends plus rien
j'ai mis dans ma page account

{hook name="account-order.bottom" order="{$order_id}"}
{hook name="account.after-view" order="{$order_id}"}

un seul s'affiche
j'ai supprime

{hook name="account-order.bottom" order="{$order_id}"}

et ho miracle cela s'affiche
bon j'espere que cela va durer.... mais je n'ai pas compris le pourquoi du comment

Offline


zzuutt wrote:

je declare le hook

  public function getHooks() 
  {
     return array(

          // Only register the title in the default language
          array(
              "type" => TemplateDefinition::FRONT_OFFICE,
              "code" => "account.after-view",
              "title" => "Duplicate Order in account page",
              "description" => " ",
              "active" => true
          )
     );
  }

Bonjour,
je ne comprends a quoi sert cette declaration
Si je la rajoute cela fait planter le module a l'activation
je pensait que cela eviter d'aller valider le nouveau hook dans la liste

Offline


Regarde dans ta table "hook" si ton "account.after-view" existe ainsi que dans "module_hook"

Personnellement, je n'ai pas réussi avec la doc, j'ai finalement tout inséré directement dans les tables via SQL. (comme le fait l’installation/MAJ de Thélia)
Ci-dessous un exemple d'ajout de 2 "hooks"

SET FOREIGN_KEY_CHECKS = 0;
SELECT @maxHookId := MAX(`id`) FROM `hook`;
INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES
(@maxHookId + 1, 'folder.gallery', 1, 0, 0, 0, 1, 1, NOW(), NOW()),
(@maxHookId + 2, 'content.gallery', 1, 0, 0, 0, 1, 1, NOW(), NOW());
INSERT INTO  `hook_i18n` (`id`, `locale`, `title`, `description`, `chapo`) VALUES
(@maxHookId + 1, 'fr_FR', 'Page dossier - gallerie photos', '', ''),
(@maxHookId + 1, 'en_US', 'Folder page - photo gallery', '', ''),
(@maxHookId + 2, 'fr_FR', 'Page contenu - gallerie photos', '', ''),
(@maxHookId + 2, 'en_US', 'Content page - photo gallery', '', '');
SELECT @maxModuleHookId := MAX(`id`) FROM `module_hook`;
SELECT @moduleId := `id` FROM `module` WHERE `code`='Monmodule';
INSERT INTO  `module_hook` (`id`, `module_id`, `hook_id`, `classname`, `method`, `active`, `hook_active`, `module_active`, `position`) VALUES
(@maxModuleHookId +1, @moduleId, @maxHookId + 1, 'monmodule.hook.front', 'onFolderGallery', 1, 1, 1, 1),
(@maxModuleHookId +2, @moduleId, @maxHookId + 2, 'monmodule.hook.front', 'onContentGallery', 1, 1, 1, 1);
SET FOREIGN_KEY_CHECKS = 1;";

Last edited by informatiqueprog (23-03-2015 18:07:01)

Offline


Merci, je vais faire pareil
cela evite d'aller le selectionner pour l'activer

Offline


En 2.1.1, ça a marché du 1er coup pour moi, avec la surcharge de getHooks() dans le module.

Le module en question : https://github.com/roadster31/GiftVoucher

Quel est le problème que vous pouvez rencontrer (et que vous avez sans doute rencontré) ? C'est de définir dans le config.xml de votre beau module un ID pour votre hook qui ne soit pas "cazmelizable", c'est à dire transformable en nom de méthode PHP. Par exemple, à cause du tiret entre product et edit,  "giftvoucher.product-edit.hook" n'est pas camelizable:

<hook id="giftvoucher.product-edit.hook" class="GiftVoucher\Hook\HookManager" scope="request">
    <tag name="hook.event_listener" event="product-edit.right-column.bottom" type="back" method="onProductEditRightColumnBottom" />
</hook>

Vous obtenez alors le message :

"Service id "giftvoucher.product-edit.hook" cannot be converted to a valid PHP method name".

Damned ! Du coup, vous changez l'ID du hook, en "giftvoucher.product_edit.hook", vous videz le cache (un très beau réflexe) et le tour est joué !

Hé bien non ! Vous obtenez l'erreur :

"ServiceNotFoundException: You have requested a non-existent service "giftvoucher.product-edit.hook".

Mais pourquoi ? Gniiiiiiiiii ! Raaaahhhh ! Pourquoiiiiiiiiiiiiiii ? Ras le bol, je réinstalle OS Commeeeeeerce !

Relax, prends un chewing-gum. C'est parce que la table 'module_hook' n'a pas été mise à jour, malgré votre changement d'ID et le vidage du cache. Il y a toujours dans la colonne "classname" "giftvoucher.product-edit.hook" !

Ni une ni deux, vous modifiez à la main dans la table module_hook cette fichue valeur, et la remplacez par "giftvoucher.product_edit.hook". Vous videz le cache (oui, encore une fois), et là... CA MARCHE !

Donc attention à ces ID de hooks, des points, des underscore, des chiffres, des lettres, mais pas de tirets ou d'autres caractères cabalistiques.

Ce problème de MAJ de la base sera corrigé en 2.2, grâce à cette mirifique PR : https://github.com/thelia/thelia/pull/1309, que vous pouvez d'ores et déjà appliquer à vos 2.1 chéries. Vous pourrez alors patouiller joyeusement sur les ID de hooks sans craindre le honteux châtiment de la camelization.


OpenStudio Toulouse

Offline


Merci pour les infos.

Dans le cas de mon module, je ne pense pas que le problème venait de là

<tag name="hook.event_listener" event="content.stylesheet" />
<tag name="hook.event_listener" event="content.gallery" />
<tag name="hook.event_listener" event="content.after-javascript-include" />
<tag name="hook.event_listener" event="content.javascript-initialization" />
<tag name="hook.event_listener" event="folder.stylesheet" />
<tag name="hook.event_listener" event="folder.gallery" />

Les hooks "content.gallery" et "folder.gallery" n'apparaissaient pas (module désactivé, cache vidée, module activé), aucun message d'erreur.
Par contre, je n'y pense que maintenant, j'aurais peut être du essayer de supprimer le module et de le réinstaller.

Offline


Merci Roadster31, je vais essaye de macher plus souvent wink