Jump to content

[Résolu] ModuleFrontController et method setMedia() pas prise en compte


Recommended Posts

Bonjour, 

Version de Prestashop : 1.7.8.5

Je suis actuellement en train de réaliser le module du livre "Prestashop, Développez vos propres modules e-commerce", le soucis c'est que malgré le fait qu'il soit annoncé pour être compatible 1.7, ce n'est pas réellement le cas car bon nombre de méthodes sont obsolètes.

Je suis en train de réaliser un FrontController via un module. Il est indiqué qu'il faut créer une méthode setMedia dans le contrôleur, pour surcharger le comportement par défaut de setMedia() avec addCSS et addJS. D'après mes recherches sur la doc officielle, cela a été actualisé par registerStylesheet et registerJavascript: 
https://devdocs.prestashop.com/1.7/themes/getting-started/asset-management/#with-a-front-controller-module

J'ai évidemment vidé les caches et réinitialisé le module.

La page fonctionne bien pas de problème, le var_dump retourne "true" donc il passe bien par setMedia, néanmoins aucun appel n'est fait sur les fichiers css et js. J'ai essayé plusieurs méthode en ligne, mais aucune ne fonctionne, j'en appel donc à vous. Voici mon code : 

    public function setMedia()
    {
        parent::setMedia();

        //// Le var_dump ci-dessous retourne true
        var_dump(file_exists('modules/' . $this->module->name . '/views/css/mymodcomments.css'));
        
        $this->registerStylesheet(
            'module-modulename-style',
            'modules/' . $this->module->name . '/views/css/mymodcomments.css',
            [
                'media' => 'all',
                'priority' => 200,
            ]
        );

        $this->registerJavascript(
            'module-modulename-simple-lib',
            'modules/' . $this->module->name . '/views/js/mymodcomments.js',
            [
                'priority' => 200,
            ]
        );
    }

image.thumb.png.4cbbbe36d3914ba50da5dd19ce2f2877.png


Edit : Voici toutes les techniques que j'ai essayé (copier/coller de stackoverflow et forum que j'ai trouvé, je n'ai pas pris la peine de modifier le code pour vous les mettre sur le forum, mais j'ai bien mis les bons liens dans mon code lors des tests : 
 

    public function setMedia(){
        parent::setMedia();
        $this->context->controller->addJS(_PS_MODULE_DIR_.'/views/js/about_us.js');
    }

 

public function setMedia()
{
    parent::setMedia();
    $this->addCSS($this->module->getPathUri().'views/css/style.css');
}

 

public function setMedia()
{
parent::setMedia();
$this->registerStylesheet('module-tuxinmodcartype-cartypeproducts-style', $this->module->getPathUri() . 'css/cartypeproducts.css');
$this->registerJavascript('module-tuxinmodcartype-cartypeproducts-js', $this->module->getPathUri() . 'js/cartypeproducts.js');
}


Merci à tous, je continue de chercher la solution dans mon coin :)

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

    public function setMedia()
    {
        $this->registerStylesheet(
             'front-controller-' . $this->module->name . '',
            'modules/' . $this->module->name . 'views/css/front/front.css',
            [
                'media' => 'all',
                'priority' => 1000,
            ]
        );

        $this->registerJavascript(
             'front-controller-' . $this->module->name . '',
            'modules/' . $this->module->name . 'views/js/front/front.js',
            [
                'position' => 'bottom',
                'priority' => 1000,
            ]
        );



        return parent::setMedia();
    }

 

Link to comment
Share on other sites

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)

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

  • gngngngn changed the title to [Résolu] ModuleFrontController et method setMedia() pas prise en compte

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...