Merci @ventura,
Malheureusement, cela ne fonctionne pas mieux. Et pour cause : dans le fichier TPL rien n'indique le block CSS et JS. (j'ai beau lire et relire les 3 pages traitants de ce sujet, rien n'y est mentionné. Cela m'étonnerait que ce soit si différent de la 1.6 à la 1.7).
DONC :
Pour ceux qui en 2022, voudrait réaliser la page 66 du bouquin, le tpl doit avoir cette forme ci :
<!doctype html> <html lang="{$language.locale}"> <head> {block name='head'} {include file='_partials/head.tpl'} {/block} </head> <body id="{$page.page_name}" class="{$page.body_classes|classnames}"> <h1>{l s='Comments' mod="mymodcomments"} "{$product->name}" </h1> <div class="rte"> {foreach from=$comments item=comment} <img src="https://www.gravatar.com/avatar/{$comment.email|trim|strtolower|md5}?s=45" class="pull-left img-thumbnail mymodcomments-avatar" /> <p>{$comment.firstname} {$comment.lastname|substr:0:1}</p> <strong>{l s='Comment' mod='mymodcomments'} #{$comment.id_mymod_comment}:</strong> {$comment.comment}<br> <p> <strong>{l s='Review' mod='mymodcomments'} : </strong> {$comment.grade}/5<br> </p><br> {/foreach} </div> {block name='javascript_bottom'} {include file="_partials/javascript.tpl" javascript=$javascript.bottom} {/block} {block name='hook_before_body_closing_tag'} {hook h='displayBeforeBodyClosingTag'} {/block} </body> </html>
Problématique :
Par contre, ce que je ne comprend pas :
Ma fonction setMedia() fonctionne maintenant avec le code suivant :
public function setMedia() { parent::setMedia(); $this->registerJavascript( 'module-modulename-simple-lib', 'modules/' . $this->module->name . '/views/js/mymodcomments.js' ); $this->registerStylesheet( 'module-modulename-style', 'modules/' . $this->module->name . '/views/css/mymodcomments.css', [ 'media' => 'all', 'priority' => 200, ] ); }
Mais j'ai 2 appels du Javascript et CSS. Lorsque je retire la fonction setMedia(), il me charge correctement 1 seule fois le JS et CSS.
Résolution :
Si je comprend bien, il me charge donc le hookHeader qui contient :
public function hookHeader() { $this->context->controller->addCSS($this->_path . 'views/css/mymodcomments.css', 'all'); $this->context->controller->addJS($this->_path . 'views/js/mymodcomments.js'); }
Je retire donc la méthode hookHeader, et réimplémente les fichier dans ma méthode hookActionFrontControllerSetMedia (comme indiqué dans : https://devdocs.prestashop.com/1.7/themes/getting-started/asset-management/ où l'on trigger juste la page product)
public function hookActionFrontControllerSetMedia($params) { if ('product' === $this->context->controller->php_self) { $this->context->controller->registerJavascript( 'front-controller-' . $this->name . '-css', 'modules/' . $this->name . '/views/js/mymodcomments.js', [ 'position' => 'all', 'priority' => 1000, ] ); $this->context->controller->registerStylesheet( 'front-controller-' . $this->name . '-js', 'modules/' . $this->name . '/views/css/mymodcomments.css', [ 'media' => 'all', 'priority' => 1000, ] ); } }
Et là ça fonctionne nickel. Le livre mériterait une actualisation (et quelque chose de plus clair au niveau du TPL, car selon les indications données, il est clairement indiqué qu'en mettant la fonction setMedia(), cela allait les implémenter dans le TPL. Si le block JS et CSS, n'est pas implémenté, vous n'aurez donc jamais l'appel de vos fichiers.
En espérant que ma solution apporte donc un peu de lumière pour certains qui seraient bloqués. Et au cas où Fabien Serny passe par là : bon bouquin mais pour un débutant débutant sur 1.7, il mériterait d'être plus clair sur certain détail (ceci dit, c'est probablement que le bouquin est sorti au début de 1.7, à quand une réédition? <3)