THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

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

Offline


Bonjour,

En pleine création d'un module qui doit permettre de rajouter facilement une balise meta noindex dans certaines de nos pages, je me retrouve bloqué. J'ai crée un hook dans ce module pour vérifier si l'url de la page actuellement visitée faisait partie de celle qu'on ne veut pas indexer pour le référencement (auquel cas la méthode getIndex() retourne 0).

namespace Indexation\Hook;

use Indexation\Model\IndexationQuery;
use Thelia\Core\Event\Hook\HookRenderEvent;
use Thelia\Core\Hook\BaseHook;

class Front extends BaseHook {
    public function onNoindexDisplay(HookRenderEvent $event) {
        $pageURL = $this->getRequest()->getPathInfo();

        $indexation = IndexationQuery::create()->findByUrl($pageURL);
        if(null !== $currentURL && null !== $pageURL){
            foreach($indexation->getUrl() as $url){
                if($url == $pageURL){
                    $event->add('<meta name="robots" content="noindex">');
                }
            }
        }
    }

}

Et dans le fichier config.xml de ce module, j'ai rajouté ceci :

    <hooks>
        <hook id="indexation.hook.front" class="Indexation/Hook/Front" scope="request">
            <tag name="hook.event_listener" event="noindex.display" />
        </hook>
    </hooks>

Je ne sais pas encore ce que va donner ce hook parce que le site (FO comme BO) est inaccessible. J'ai cette erreur que je ne comprends pas :
InvalidArgumentException in RegisterHookListenersPass.php line 81:
Hook class "Indexation/Hook/Front" must extends class "Thelia\Core\Hook\BaseHook".

J'ai pourtant bien un extends vers BaseHook, l'erreur doit être ailleurs.
Quelqu'un avec un regard extérieur peut me dire ce qui ne va pas avec ma classe, s'il-vous-plaît ?

PS : j'ai bien vidé les caches par suppression du contenu du dossier cache, et les logs Thelia ne sont pas parlants du tout.

Last edited by HeishPi (26-04-2019 08:00:15)


Développeur web Junior

Offline


class="Indexation\Hook\Front"

\, pas /


OpenStudio Toulouse

Offline


Effectivement, c'est le genre d'erreur bête dont je ne me serais jamais aperçu seul. merci Roadster !

Maintenant, j'ai droit à l'erreur "Hook noindex.display is unknown"

Sur un autre topic, je t'ai vu expliquer ceci :

roadster31 wrote:

Non, ça doit être fait automatiquement par BaseModule::registerHooks() lors de l'installation du module, c'est à dire lorsque le module est découvert par Thelia et installé en base de données, ou lors d'une mise à jour du module.

Si tu as ajouté ta déclaration de hook après l'installation du module, alors cette déclaration n'a pas été prise en compte.

Tu peux essayer de supprimer complètement ton module, et de le ré-installer, ou alors de changer sa version pour provoquer un update.

J'ai complètement supprimé mon module, l'ai réinstallé et je lui ai remis le hook, le schema.xml et le config.xml que j'avais afin qu'il prenne le hook en compte, le tout avant de générer le model, et pourtant j'ai toujours la même erreur... hmm


Développeur web Junior

Offline


Quand ça comment à merder avec les hooks, l'arme ultime c'est en général d'ouvrir une console et de clean les hooks :

Thelia hook:clean nom_de_ton_module

Et ça devrait remettre les choses d'équerre.


OpenStudio Toulouse

Offline


Hum, j'obtiens la même erreur mais dans l'invite de commande cette fois big_smile

PHP Fatal error:  Uncaught exception 'InvalidArgumentException' with message 'Hook noindex.display is unknown.' in blablabla


Développeur web Junior

Offline


Ha OK. Je n'avais pas réalisé que tu utilisais un hook non-standard, il faudrait donc que tu le crée tout d'abord avant de t'en servir, par exemple via la méthode getHooks() de ton module : http://doc.thelia.net/en/documentation/ … -your-hook

Cette méthode permet de créer de nouveaux hooks lors de l'activation du module.


OpenStudio Toulouse

Offline


Rooh, je me suis précipité dans la partie Hook de la Doc sans même m'apercevoir que y avait un onglet "Create your own hook". Je me fatigue, parfois.
Donc c'est fait ! J'ai écrit ça dans la classe principale, à la racine du module :

namespace Indexation;

use Thelia\Core\Template\TemplateDefinition;
use Thelia\Module\BaseModule;

class Indexation extends BaseModule
{
    /** @var string */
    const DOMAIN_NAME = 'indexation';

    /*
     * You may now override BaseModuleInterface methods, such as:
     * install, destroy, preActivation, postActivation, preDeactivation, postDeactivation
     *
     * Have fun !
     */

    public function getHooks()
    {
        return array(
            // Only register the title in the default language
            array(
                "type" => TemplateDefinition::BACK_OFFICE,
                "code" => "noindex.display",
                "title" => "IndexationHook",
                "description" => "Permet de rajouter la balise noindex",
            ),
            array(
                "active" => true
            )
        );
    }
}

J'ai désactivé/réactivé mon module, le hook apparaît bien dans la table "hook" de la BDD, et pourtant j'ai toujours l'erreur Hook noindex.display is unknown (mais seulement en mode développement !).
J'ai essayé de faire un hook:clean mais la console m'a demandé si je voulais supprimer tous les hook de mon module. Si je dis Yes, j'obtiens à nouveau la même erreur dans l'invite de commande. hmm

Est-ce que j'aurais du supprimer ce que j'avais déjà mis dans config.xml et dans le hook ?


Développeur web Junior

Offline


Je ne comprends pas. Ça marche en prod et pas en dev ?


OpenStudio Toulouse

Offline


Non non, ça ne marche ni en prod ni en dév mais ça ne m'étonne pas trop vu que je n'ai jamais pu vérifier si le contenu de mon hook est fonctionnel. Ce qu'il y a c'est que je n'obtiens cette page d'erreur QUE en mode dév !


Développeur web Junior

Offline


Elle dit quoi exactement la page d'erreur ?


OpenStudio Toulouse

Offline


Whoops, looks like something went wrong.
1/1
InvalidArgumentException in RegisterHookListenersPass.php line 69:
Hook noindex.display is unknown.
in RegisterHookListenersPass.php line 69
at RegisterHookListenersPass->logAlertMessage('Hook noindex.display is unknown.') in RegisterHookListenersPass.php line 344
at RegisterHookListenersPass->getHook('noindex.display', '1') in RegisterHookListenersPass.php line 122
at RegisterHookListenersPass->registerHook('Indexation\Hook\Front', object(Module), 'indexation.hook.front', array('event' => 'noindex.display')) in RegisterHookListenersPass.php line 93
at RegisterHookListenersPass->processHook(object(TheliaContainerBuilder), object(Definition)) in RegisterHookListenersPass.php line 60
at RegisterHookListenersPass->process(object(TheliaContainerBuilder)) in Compiler.php line 107
at Compiler->compile(object(TheliaContainerBuilder)) in ContainerBuilder.php line 589
at ContainerBuilder->compile() in TheliaContainerBuilder.php line 32
at TheliaContainerBuilder->customCompile() in Thelia.php line 500
at Thelia->buildContainer() in Kernel.php line 510
at Kernel->initializeContainer() in Kernel.php line 133
at Kernel->boot() in Thelia.php line 219
at Thelia->boot() in Kernel.php line 182
at Kernel->handle(object(Request)) in index_dev.php line 38

Développeur web Junior

Offline


Normal. Tu as déclaré ton hook comme étant un hook back-office ("type" => TemplateDefinition::BACK_OFFICE,), et tu l'utilises comme un hook front office dans le config.xml : <tag name="hook.event_listener" event="noindex.display" /> sauf indication contraire, ça désigne un hook front. Tu dois spécifier type="back" pour désigner un hook back-office :

<tag name="hook.event_listener"  type="back" event="noindex.display" />


OpenStudio Toulouse

Offline


Aaaaaaaah, effectivement ! Je n'ai plus d'erreur maintenant, merci beaucoup Roadster ! smile


Développeur web Junior

Offline


En revanche, au final c'est plutôt un hook FrontOffice. Seulement j'ai à nouveau l'erreur si je le définis en "type" => TemplateDefinition::FRONT_OFFICE et que je ne précise pas le type dans config.xml (donc front, de base).


Développeur web Junior

Offline


Purge les hooks avant de changer le type


OpenStudio Toulouse

Offline


Hmm... Je ne comprends pas ce que je fais mal. Je laisse le hook en back-office, je purge les hook avec php Thelia hook:clean, je modifie le hook pour en faire un frontOffice (dans config.xml et dans sa classe), je vide les caches (en supprimant le contenu du dossier cache), je recharge la page d'accueil : OK.
Ensuite j'essaie de passer en mode développement sur cette même page et hop, exactement la même erreur que précédemment...

Last edited by HeishPi (25-04-2019 08:53:35)


Développeur web Junior

Offline


Qu'est-ce que je peux faire différemment pour contrer ça ?

Par ailleurs, est-ce que c'est vraiment grave d'utiliser un hook backOffice sur un template frontOffice ?


Développeur web Junior

Offline


Ça ne marche tout simplement pas d'utiliser une hook BO en FO : le hook est soit BO, soit FO, pas les deux.

Si ton hook existe dans la table des hooks, alors il existe en dev ET en prod.

Vérifie directement dans la table que le hook a bien le bon type.


OpenStudio Toulouse

Offline


Ah, j'aurai du commencé par là. J'ai refait la manip mais j'ai forcé le changement en base, je lui ai filé le bon type en manipulant directement les données et là ça fonctionne parfaitement. Le hook a même très bien rempli son rôle !

Merci encore Roadster, ton aide fait gagner un temps précieux aux 3/4 du forum wink

Si jamais quelqu'un passe par là et cherche à faire la même chose (bloquer l'indexation de certaines pages), voilà la tronche du hook que j'utilise :

public function onNoindexDisplay(HookRenderEvent $event) {
        $actualPage = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

        $indexationTab = IndexationQuery::create()->find();
        if(null !== $indexationTab && null !== $actualPage){
            foreach($indexationTab as $url){
                if($url->getUrl() == $actualPage && $url->getIndex() == 0){
                    $event->add('<meta name="robots" content="noindex">');
                }
            }
        }
    }

J'ai une table Indexation dans ma BDD qui contient toutes les url possibles de mon site, avec pour chacune un booléen (ici appelé index) qui dit si on veut l'indexer (1) ou non (0). C'est géré en backOffice pour que le client final puisse décider quelle page il veut soustraire au référencement.


Développeur web Junior