THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

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

Offline


Bonjour la communauté !

je me lances dans le dev d'un module pour vendre des produits dématérialisés mais plus spécifiquement comme une librairie d'accès a des ressources.
Je demande pas qu'on me developpe le module, bien loin de la l'idée. Je suis développeur de métier, et j'ai déjà fait des modules pour d'autres framework.
Mais j'ai besoin d'un coup de pouce, la doc et l'analyse des autres modules ne m'aidant pas beaucoup.
Je compte partager le module en même temps que j'avance.
Pour faire court ca sera similaire a une plate forme de jeu, comme Steam, ou autre.
On achète un produit, un fois acheté on l'a dans sa bibliothèque et on peut le lancer.

Premier problème, j'ai un peu avancé, mais la je coince depuis 1 heure sur un truc bête.
J'essaye d'ajouter un nouveau menu dans l'admin sans succès.
Je précise que je suis en index_dev que ce soit en front ou en admin et que je vide le cache à chaque fois.

Mon code =>

config.xml

        <hook id="accesstrader.hook.back" class="AccessTrader\Hook\AccessTraderHook" scope="request">
            <tag name="hook.event_listener" event="module.configuration" type="back" />
            <tag name="hook.event_listener" event="main.top-menu-tools" type="back"/>
        </hook>

AccessTraderHook.php

public function onModuleConfiguration(HookRenderEvent $event)
    {
        $event->add($this->render("gameslist.html"));
    }
    public function onMainTopMenuTools(HookRenderEvent $event){
        $event->add(
            $this->render('menu.html')
        );
    }

Et l'HTML bah c'est juste une copie du code HTML pour le menu et un simple "TEST" dans gameslist.

Si vous voyez quelque chose de louche, un oeil externe serait le bienvenu.
Merci d'avance.

Offline


Si tu as un peu bidouillé les hooks avant d'arriver à ta config actuelle, il se peut que la table "module_hook" contienne des infos obsolètes, elle ne se met pas forcément à jour...

Desactive ton module, purge toutes les références de ton module de la table module_hook, vide ton cache et enfin ré-active ton module.


OpenStudio Toulouse

Offline


Non rien a faire, j'ai même copier les fichiers à l'abris, désinstaller le module en supprimant les données, j'ai remis les fichiers après avoir vidé le cache.
Y'a des infos a jour, comme celles que j'ai changée dans le module.xml, mais pour ce qui est des hooks j'en ai que 2 sur 3 dans la BDD.
Le hook main.top-menu-tools n'est pas pris en compte.

Au pire est-ce que tu connais un module qui installe un nouveau menu dans l'admin, que je compare, j'ai peut-être fait une erreur de frappe dans le nom du hook (pris sur la doc).
Merci pour ton intérêt a mon problème.

Offline


Oui, je l'ai fait plein de fois. Mais j'ai compris, j'ai trop survolé ton code avant de te répondre.

En fait, le hook du menu tools est un hook "block" (http://doc.thelia.net/en/documentation/ … hook-block), qui ne retourne pas un contenu HTML (comme pour les hook "render"), mais un ensemble de paramètres valorisés, paramètres définis par le hook lui-même.

Observe la définition du hook main.top-menu-tools dans admin-layout.tpl :

                                        {hookblock name="main.top-menu-tools" fields="id,class,url,title"}
                                            {forhook rel="main.top-menu-tools"}
                                                <li role="menuitem">
                                                    <a {if $id}id="{$id}" {/if} class="{$class}" data-target="{$url nofilter}" href="{$url nofilter}">
                                                        {$title}
                                                    </a>
                                                </li>
                                            {/forhook}
                                        {/hookblock}

hookblock indique que nous sommes en présence d'un hook de type block. fields="id,class,url,title" indique que ce hook supporte 4 variables, que tu peux passer depuis ta méthode hook.

Pour un hook de type block, la déclaration est un peu différente, l'event étant de type HookRenderBlockEvent. Il ne s'utilise pas de la même façon que pour un hook render. (il doit y avoir quelque part dans tes logs (logs/log-thelia.txt) un warning qui indique que ta méthode n'a pas la bonne signature, un truc du genre "Method onMainTopMenuTools should use an event of type HookRenderBlockEvent. found: HookRenderEvent").

Exemple ci-dessous :

    public function onTopMenuTools(HookRenderBlockEvent $event)
    {
        $event->add([
            "id"      => "reservation-tools",
            "url"     => URL::getInstance()->absoluteUrl('/admin/module/Geoloc'),
            "title"   => $this->trans("Geofencing des MiBox", [], Geoloc::DOMAIN_NAME)
        ]);
    }

Et voilà !

Je suis d'accord avec toi, la doc mériterait d'être étoffée sur les hooks, même si tu as déjà un exemple ici : http://doc.thelia.net/en/documentation/ … hook-block.

Peut-être aussi qu'en mode dev, certaines erreurs devraient être fatales au lieu de se glisser silencieusement dans les logs, on économiserait des heures de prises de tête. J'ai ouvert une issue à ce sujet: https://github.com/thelia/thelia/issues/1927

My 2 cents.


OpenStudio Toulouse

Offline


Merci, je vais mettre en application tes explications. Merci pour ton aide smile
Je te tiens au jus demain.

Offline


Tiens, j'ai fait la PR qui va bien pour mettre en évidence les problèmes de création de hooks: https://github.com/thelia/thelia/pull/1928


OpenStudio Toulouse

Offline


Voila j'ia fait la modif :

public function onMainTopMenuTools(HookRenderBlockEvent $event){
        $event->add([
            "id"      => "accesstrader-menu",
            "url"     => URL::getInstance()->absoluteUrl('/admin/module/accesstrader'),
            "title"   => $this->trans("Manage Games")
        ]);
    }

sans oublier les librairies sinon ca plante :

use Thelia\Core\Event\Hook\HookRenderBlockEvent;
use Thelia\Tools\URL;

Et ca fonctionne niquel smile
Merci.

La suite au prochain problème tongue

PS : je vais mettre le module sur github, ca pourra servir à la communauté par la suite wink

Last edited by Djey1301 (21-01-2016 08:34:03)

Offline


Je te recommande l'utilisation d'un IDE performant, comme PhpStorm (outil de la core team), Eclipse PDT, Netbeans ou autre, qui facilite grandement la découverte de l'architecture de Thelia, et le développement.


OpenStudio Toulouse

Offline


J'utilise déjà PHPStorm depuis un bout de temps, j'ai même du mettre a jour ma licence y'a quelques mois.
il m'aide pas mal a trouver les librairies par exemple et j'ai aussi accès a toutes les méthodes et classes.

J'ai une autre question maintenant. Je suis dans la génération des forms, de base pas de soucis vu que je connais bien Symfony.
Seulement, dans Symfony j'ai l'habitude d'utiliser les entities générées par Doctrine pour que le formulaire suive le model.
Hors vu qu'ici on utilise pas Doctrine, comment je peux lier les models aux formulaires.

Normalement, je le faisais via l'ajout des fichiers entities et via :

public function getDefaultOptions(array $options)
    {
        return array(
            'data_class' => 'Thelia\AccessTrader\Entity\games'
        );
    }

Par exemple, mais la j'avoue ne pas comprendre comment faire le lien sans entity.

Je m'appuie sur la doc et les autres modules comme avant.
http://doc.thelia.net/en/documentation/form/index.html
http://api.symfony.com/2.3/Symfony/Comp … method_add
Mais pour les entities....
http://api.symfony.com/2.3/Symfony/Brid … yType.html

Last edited by Djey1301 (21-01-2016 10:02:28)

Offline


Laissez tomber, je vais faire sans wink