Jump to content

Exemple concret de hook


Recommended Posts

Bonjour, 

 

Je suis tout nouveau sur prestashop et cela fait quelques jours que j'essais de bien comprendre l'architecture de ce CMS.

J'ai compris les principes fondamentaux mais je n'ai pas trouvé d'exemple concret et complet sur le fonctionnement et la création d'un hook.

 

Connaissez-vous un thread complet traitant de ce sujet? (V1.6)

 

Par ailleurs j'essais actuellement de rajouter un lien dans le header de mon site, vous savez juste à côté de "nous contacter" et "connexion" mais je ne trouve pas le module blockpermanentlink dans la copie du theme "default-boostrap". Comment puis-je faire cela simplement dans le code?

 

Enfin et cela pourra peut être faire l'objet d'un autre thread, mais comment fait on pour customizer les css existant? Faut-il les overrider quelque part ou bien modifier directeent le global.css par exemple?

 

Je sais que cela fait beaucoup de questions et je vous remercie par avance.

 

Je suis à votre disposition si avez besoin d'un complément d'information.

 

Merci :)

Link to comment
Share on other sites

  • 3 weeks later...

Salutation bigxavi,

 

PrestaShop (1.6.x) stocke ses hooks (points d'accroche) dans la table ps_hooks de la base de données.

​Soit tu ajoutes un hook à la main dans cette table (essayes de ne pas créer de conflits)
Soit tu passe par les méthodes de PrestaShop pour créer le hook à ta place.

​Je vais te donner la méthode la plus rapide: passer par PrestaShop (et de ce fait éviter tout les conflits!) -- Pour créer des hooks dans ton Module.

 

Le fichier .PHP

 

1) Dans la méthode install() de ton module ajoute la déclaration de la création d'un Hook comme ça:
​Note bien la minuscule au début du nom du hook. C'est important pour la convention de nommage PrestaShop.

$this->registerHook('nomDuHook');

​Il apparaîtra alors dans la base de données (table ps_hooks).

Mais aussi dans l'administration: "Modules & Positions" -> "Positions".

​Et là tu pourras l'associer (le nouveau Hook) à ton module.


​2) Pour t'en servir, toujours au travers de ton module:

 

Ajoute la méthode correspondant au nom du Hook.

    public function hookNomDuHook()
    {
​      // on créé une variable qui va contenir une chose récupérée de la table ps_configuration de PrestaShop.
​      // on utilisera la méthode Configuration::get pour ça.
​      // mais libre à toi de définir toi même ce que tu veux comme variables/traitements AVANT de rendre le tout via Smarty.
​      // concernant le LONG NOM à RALLONGE... de ma variable, tu peux faire comme tu veux. Mais moi j'aime quand les choses sont claires.
      $saphyrak_variable_version_de_prestashop = "Version de PrestaShop: " . Configuration::get('PS_INSTALL_VERSION');
​      // on donne à Smarty la possibilité de récupérer cette variable, via le nom de variable au format Smarty: saphyrak_variable_version_de_prestashop
      $this->context->smarty->assign('saphyrak_variable_version_de_prestashop', $saphyrak_variable_version_de_prestashop);
      // on charge et on retourne son fichier de template !
      return $this->display(__FILE__, 'tapagemodule.tpl', $this->getCacheId());
    }

Le fichier TPL:

1) on va faire simple, on va vérifier si la variable qu'on a spécifié dans notre Hook existe, et si oui, on affiche un nouveau bloc !

{if $saphyrak_variable_version_de_prestashop != ''}
<div id="nomdetonmodule" class="nomdetaclassecss">
​ <!-- Et tu affiche le contenu de ta variable comme ceci -->
 {$saphyrak_variable_version_de_prestashop|escape:'html':'UTF-8'}
</div>
{/if}

Dans mon exemple, on assume que tu initiales le module à partir de son hookHeader() car c'est le seul Hook pouvant manipuler les balises <head> et </head> de ta page rendue par Smarty.

​Si tu n'utilises pas hookHeader() ou que tu charges les CSS différemment..
​Dans la page TPL où tu veux inclure le Hook tu devras lui spécifier justement d'utiliser ton Hook à un emplacement précis.

​Prenons par exemple la page du thème par défaut (theme-bootstrap): theme/theme-bootstrap/footer.tpl

​Pour y dire que c'est là que tu veux que LA PAGE TPL DE TON MODULE (tapagemodule.tpl) y soit affiché (ainsi que son contenu donc!)
​Tu n'auras qu'à écrire cette ligne de plus à l'endroit voulu dans footer.tpl:
 

// note bien la minuscule au début du nom !! Important pour la convention de nommage PrestaShop.
{Hook::exec('nomDuHook')}

Et voilà, ton hook est opérationnel !

 

NOTE:

​Si tu passes par la base de données pour ajouter ton hook, tu n'auras même pas besoin de module.
Mais de fait, tu ne pourras pas créer de "dynamisme via PHP", si le hook ne doit traiter que des informations non-dynamique ça va, sinon, c'est pas bien.

 

 

Je réponds à tes autres questions dans un autre post.

Link to comment
Share on other sites

Comme je l'ai dis plus, haut, voici la réponse à tes autres questions.

​Déjà...
Je te recommande de dupliquer le thème default-bootstrap (via l'administration) et d'utiliser uniquement ta version dupliquée.
​(pourquoi? Disons.. penses aux mises à jours qui vont empiéter sur le thème par défaut et le remettre à son état initial.....)
​Bien que mon exemple va utiliser default-bootstrap (car tu n'as qu'un thème dans ton installation pour l'instant)..

 

Ensuite.

 

Ajouter des liens au module blockpermanentlinks

 

** avant tout, tu sais que depuis le backOffice tu peux en allant dans "Modules et Services" configurer chaque modules séparément.
​** utilise le bouton-liste, le module blockpermanentlinks en fait partie, mais là, ça relève pas du développement mais de l'utilisation du backOffice (ce que la doc PrestaShop explique très bien).

 

Pour le module "blockpermanentlinks" tu sais que tu peux pour n'importe quel module supportant les views overrider son template, CSS, JS, Traductions et Images.
​Cela pour n'importe quel thème.
​Le PHP n'est pas facilement overrideable, donc évites...

C'est très facile,
​Déjà, il faut savoir que le module "blockpermanentlinks" se trouve dans le dossier: "modules/blockpermanentlinks" à la racine de ton installation PrestaShop !
​(celui (qui est parfois) dans le thème, n'est qu'un override des templates/css/js/traductions/images)
Donc, tu vas dans ton dossier "modules/blockpermanentlinks" et tu y récupères les fichiers dossiers:

/img
​/translations
blockpermanentlinks-footer.tpl
blockpermanentlinks-header.tpl
blockpermanentlinks.css
blockpermanentlinks.tpl

Une fois ces fichiers et dossiers (ainsi que leur contenu) récupérés, tu les places vers les dossiers adéquats dans ton thème (default-bootstrap).
​Toutefois, chaque fichiers et dossiers ont leur importance.
Et si des chemins n'existent pas, tu devras les créer.

​Ainsi, tu places tes fichiers et dossiers récupérés comme cela, pour respecter la logique de PrestaShop:​

/img
 vers: /themes/default-bootstrap

​/translations
blockpermanentlinks-footer.tpl
blockpermanentlinks-header.tpl
blockpermanentlinks.tpl
vers: /themes/default-bootstrap/modules/blockpermanentlinks

​blockpermanentlinks.css
vers: /themes/default-bootstrap/css/modules/blockpermanentlinks

Et maintenant, il ne te reste plus qu'à modifier ces nouveaux fichiers dans le thème où tu les as placés.
​Tu pourras donc y éditer les TPL pour ajouter tes nouveaux liens.
​Par contre n'oublies pas, si tu veux modifier le comportement du code PHP du module, tu devras le modifier dans son dossier original, pas dans le dossier du thème.
​Et si tu met à jour le module, n'oublies pas que tes changements apportés au code PHP du module ne sera JAMAIS gardé (à toi de refaire les mêmes changements après une maj, le mieux c'est d'avoir des backups et des patchs maisons déjà prêt avant une mise à jour!)

 

 

Pour customizer (personnaliser) les css existants:
 

Dans ton dossier /css du thème, tu as la possibilité de modifier TOUT les CSS qui ne font pas partis de modules.

Dans ton dossier /css/modules/nomdumodulequetuveuxmodifier/ du thème, tu as la possibilité de modifier TOUT les CSS qui sont initialisés par modules.

 

 

Pour overrider les css existants:

 

La section "Ajouter des liens au module blockpermanentlinks" de mon post t'explique exactement le procédé !
​(avec comme exemple le module blockpermanentlinks)

 

(n'oublies pas de faire ce travail sur le THEME QUI SERA LE TIEN (celui dupliqué comme expliqué plus haut) pour éviter les mauvaises surprises !)

 

Merci de ta lecture, bon courage, et de rien !


EDIT: ​Retrait du smiley qui s'est incrusté dans mon post, méchant smiley, méchant !

Edited by SaphyraK (see edit history)
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...