[REGLÉ] override - je n'y arrive pas.



  • Bonjour plutôt que de créer un nouveau module, juste pour ajouter la possibilité d'accrocher le blockcatégorie au hookdisplayTop.

    je me suis dis faisons un override. je ne veux pas écrire directement

    && $this->registerHook('displayTop')
    

    dans le module orgiginal, sinon il faudra que je change à la main à chaque mise à jour et le jour ou ce n'est plus moi aux commandes (un camion, toussa) le truc sera perdu pour le suivant.

    donc je tente d'écrire un "override" que je pose directement comme un goret dans le dossier override de phénixsuite. (je ne veux pas faire de module)
    avec ce code minimal qui me semble simple (livre de serny et doc et forums sur interne)

    # fichier override/modules/blockcategories
    
    class ProductsCategoryOverride extends ProductsCategory
    {
    
    public function install()
    	{
    			return (parent::install()
    			&& $this->registerHook('displayTop')
    		);
    	}
    public function hookDisplayTop($params)
    	{
    		return '<div class="header_user_info"><a>Test</a></div>';
    		// return $this->display(__FILE__, 'nav.tpl');
    	}
    }
    

    et la le phenix me jette avec un peu améne

    Fatal error: Uncaught Error: Class "ProductsCategory" not found in mon fichier

    je me voyais déjà en haut de la fiche... mais patatras je retombe sur terre.



  • peut être que in fine je ferrais un module avec tous mes overrides s'il y en a beaucoup.



  • je vais me fouetter, j'ai vu mon erreur (mic-mac dans le nom de la classe/module)

    cela marche, mais il faut installer-désisntaller le module, le réinitialiser seulement ne fonctionne pas.



  • @herve_02 a dit dans [REGLÉ] override - je n'y arrive pas. :

    je vais me fouetter, j'ai vu mon erreur (mic-mac dans le nom de la classe/module)

    cela marche, mais il faut installer-désisntaller le module, le réinitialiser seulement ne fonctionne pas.

    Non, inutile de toucher au module.
    Il y a un fichier readme_override.txt dans le répertoire /override:

    Bonjour,
    
    Veuillez lire la documentation avant d'essayer de remplacer quelque chose ici.
    http://doc.prestashop.com/display/PS16/Overriding+default+behaviors
    
    Question fréquemment posée:
    
    Q: J'ai ajouté un override (classe ou contrôleur) mais il semble être ignoré par PrestaShop
    R: Vous devez déclencher la régénération du cache des fichiers de classe. Cela se fait simplement en supprimant le fichier /cache/classes/index.php. Il en est de même lors de la suppression manuelle d'un override : pour rétablir le comportement par défaut, vous devez supprimer le fichier /cache/classes/index.php.
    


  • @eolia

    Alors, les docs de prestashop sont plutôt compliquées car pas complète. on dirait qu'elles sont écrites pour que celui qui écrit se souviennent de ce qu'il a fait. Et celui qui veut comprendre (j'ai lu la une large partie de la doc en suivant le lien que j'avais trouvé avant même d'ouvrir un éditeur de texte - je suis un homme de la doc) en partant de zéro, c'est assez compliqué.

    Ensuite ceux qui ont écrit la doc se sont débrouillé pour que le lien clickable me (je suis peut être pas doué) redirige vers la page d'accueil. et donc il est particulièrement chiant de retrouver une référence et pour mopi, plus aucun lien vers la dic "officielle" ne fonctionne.

    J'ai acheté 2 bouquins dont celui de serny et j'y trouve largement mon compte, même si parfois je me mélange les pinceaux.

    Ensuite je cherche pas à remplacer comme largement écrit dans mon post, je veux seulement ajouter un hook au module pour permettre de faire une barre de lien supplémentaire et je trouve particulièrement contre-productif d'utiliser un module (megamenu) qui va créer une table pour y mettre les catégories afin de faire un menu, catégories qui existent déjà dans phenixsuite.

    je crois me souvenir (il était tard ce main) que ce fichier n'existait pas ou alors je ne l'ai pas trouvé, mais j'ai tous les réglages à pas de cache. parce que c'est la première chose que j'avais regardé mais je pense me souvenir que j’avais lu que le fichier s'appelait classe_index.php ou quelque chose comme cela et je ne l'ai pas trouvé. je dois avouer que si le fichier index.php existe dans le répertour de cache, je ne l'ai même pas regardé car dans tout prestashop le fichier index est un fichier "vide" (juste une redirection) pour pallier ce soucis de conception que chaque répertoire accessible du net du logiciel ne possède pas par défaut un fichier index.php alors que la conception même d'un serveur de fichier internet (comme apache) recherche par défaut ce fichier en tout premier lieu s'il n'a pas une uri complète vers un fichier à servir.

    Maintenant j'ai bien conscience que ma manière de faire est probablement pas "prestashopienne" et je sais que dans le futur assez proche je serais amené à ré-écrire une partie de ce que je fais maintenant car même si c'est "tombé" en marche", c'est probablement largfemetn sous-optimal.

    Alors je pourrais faire à l'ancienne et écrire du code html statique dans un des fichiers tpl, puisque ce menu ne bougera pas, mais j'ai voulu le faire à la mode prestashop/phenixsuite. parce que je veux que les mises à jours se passent bien.

    Maintenant comme je suis à cheval sur 3 serveur - celui en production avec 1.7.xx, le futur en prod avec phenixsuite 1.6.30 ou je ne monte que ce qui marche et mon serveur home de travail, tous en ligne de commande dans un terminal il est possible que je n'ai pas regardé le bon serveur.

    J'en profite pour poser une question qui me taraude....

    Lorsque je veux un changement "simple" par exemple ajouter un champ au fiches produits (par exemple un 'résumé')
    -a) La possibilité "simple" est de l'ajouter dans la terminal mariadb, le remplir avec une requete insert et mofdier la vue et le formulaire d'admin.
    -b) la possibilité qui me semble la plus prestashopienne : faire des ovverrides pour modifier juste ce que j'ai changé/modifier comme dans le code proposé au dessus.
    c) - la possibilité de recul serait de faire un module qui ajoute cela en le "hookant" au même endroit....
    d) - la possibilité la plus répandue est d'acheter un module (je trouve l'univers de prestashop assez désagréable ou on a l'impression que tout est compliqué pour permettre de vendre des modules dont une bonne partie doit être si on regarde bien de sacrées merdes

    J'ai bien compris que le a est une impasse qui sera cassée à la mise à jour.

    Mais je crois me souvenir avoir lu un truc ou vous disiez que les overrides ce n'était pas une bonne idée. alors est-ce que l'override "bourrin" (je prends tout le code pour de petits modifications) est une mauvaise idée ou même un override qui ajoute 2 lignes est aussi une mauvaise idée ?



  • Oui, dans un Prestashop de base, c'est cache/class_index.php mais PhenixSuite a amélioré la gestion du cache des classes et pour ne pas interférer avec des rétrocompats possible nous avons tout déplacé dans /cache/classes/
    Le fichier index des classes et overrides s'appelle donc index.php.

    Vous pouvez également utiliser la fonction, en haut à droite, dans Paramètres avancés => Performances : Vider le cache. Le fichier index.php sera supprimé ainsi que toutes les compilations smarty.

    @herve_02 a dit dans [REGLÉ] override - je n'y arrive pas. :

    -b) la possibilité qui me semble la plus prestashopienne : faire des ovverrides pour modifier juste ce que j'ai changé/modifier comme dans le code proposé au dessus.
    Oui, c'est la bonne méthode.



  • @eolia

    merci j'utilise tout le temps vider le cache...

    ;-)



  • en zonant sur internet je suis tombé sur ça... j'ai envie de pleurer devant tant de bêtise.....

    https://www.webbax.ch/2022/03/10/prestashop-ajouter-champ-fiche-produit/

    la première est ça :

    a) il était préférable d’acheter un module qui fait le travail où tout le développement a déjà été effectué en amont. Certes on achète le module, mais on obtient un gain de temps d’implémentation et plus de confort à l’utilisation…

    qui est une démonstration que le produit n'est pas adapté à un commerçant, mais à un vendeur pour commerçant. pas certain que Bruno Lévêque, soit enchanté de cela.

    la seconde.... est le thème même de l'article

    b) Et en prenant cette approche de manière assez amusante, je suis arrivé à une conclusion que je pouvais détourner toutes les règles habituelles en me servant d’un fichier externe CSV qui pourrait être piloté à la main, sans faire aucun changement dans des fichiers PHP tout en me limitant uniquement au template de Smarty.

    je suis ébahie que le mec n'a même pas honte d’écrire ça. et il se dit, attention du peu, "Expert PrestaShop"



  • 1 - Bruno s'en tamponne le coquillard depuis qu'il a vendu Presta aux italiens
    2 - Webaxx est le champion de la bidouille

    Un des buts de Phenix est de pouvoir se passer de tous ses modules qui s'empilent mais on ne pourra jamais prévoir tous les cas de figure.

    Ajouter une colonne en bdd c'est un override de 4 lignes dans la classe liée

    <?php
    class Product extends ProductCore
    {
        public $my_new_column;
    
        public function __construct($id_product = null, $full = false, $id_lang = null, $id_shop = null, Context $context = null)
        {
            self::$definition['fields']['my_new_column'] = array('type' => self::TYPE_INT, 'shop' => true, 'validate' => 'isUnsignedId');
            
            parent::__construct($id_product, $full, $id_lang, $id_shop, $context);
        } 
    }
    

    Après vous pouvez écrire un module qui s'occupe de gérer vos overrides et listes (il y a des hooks pour ça: actionAdminOrdersListingFieldsModifier par exemple.

        public function hookActionAdminOrdersListingFieldsModifier(array $params)
        {
            // If hook is called in AdminController::processFilter() we have to check existence
            if (isset($this->params['select'])) {
                $this->params['select'] .= ', a.`my_new_column`';
            }
    
            if (!array_key_exists('my_new_column', $this->params['fields'])) {
                $tmp_params = $this->params['fields'];
                $this->params['fields'] = [];
                $prev_key = '';
                foreach ($tmp_params as $key => $tmp_param) {
                    if ($prev_key === "reference") {
                        $this->params['fields']['my_new_column'] = [
                            'title' => $this->module->l('Nom de ma Colonne'),
                            'align' => 'text-center',
                            'class' => 'fixed-width-xs',
                            'filter_key' => 'a!my_new_column',
                            'order_key' => 'a!my_new_column',
                        ];
                    }
    
                    $this->params['fields'] += [
                        $key => $tmp_param
                    ];
                    $prev_key = $key;
                }
            }
        }
    


  • @eolia

    oui c'est pour cela que je travaille à l'ancienne mais à la mode phénix,; et si je suis "chiant" c'est parce que j'aime bien faire les choses et je préfère demander le temps que j'acquiers l'expérience de bien faire, pour peut être, qui sait proposer aussi du code à reverser.

    là je travaille dans mon coin à ajouter une barre de catégorie en horizontal, sans faire de module mais en utilisant le module blockcatégorie du thème de base. avec le moins de modifs possibles... ensuite je viendrais me faire humilier ici en expàosant ce que j'ai fait ;-)

    en tout cas largement merci du code que je vais étudier avec la révérence d'un padawan, ce qui va me permettre de gagner de longues heures ;-)

    j'ai aussi commandé un bouquin bootstrap et jquery....

    lorsque j'avais fait mon site de suivi d'instruction en famille j'avais codé tout seul mon ajax, mais à rome on fait comme les romains.


Se connecter pour répondre