aide prestashop PhenixSuite Help
    • Catégories
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes
    • Recherche
    • S'inscrire
    • Se connecter

    Champ description longue pour les catégories

    Planifier Épinglé Verrouillé Déplacé Modules
    5 Messages 2 Publieurs 261 Vues 2 Watching
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • C Hors-ligne
      camille
      dernière édition par

      Bonjour,
      Prestashop 1.6 ne prévoyait pas de champ texte supplémentaire pour créer du contenu SEO en bas de page de catégorie. Sur le Net, j'ai trouvé des tutos pour y remédier, mais en modifiant la table category_lang par ajout d'un champ + overrides. Cela fonctionne mais quid lors de la prochaine mise à jour de Phenix Suite ? Alors, j'essaie de créer un module qui ajoute une nouvelle table. Tout fonctionne, sauf lorsque j'essaie de sauvegarder mon texte : il cherche le champ dans category_lang et bien sûr ne le trouve pas. J'ai cherché sans succès comment lui indiquer la bonne table. Alors que fais-je ? Je reviens au champ ajouté dans la table via le module ? Il n'y a pas de risque qu'il soit supprimé lors de la (très attendue) prochaine mise à jour ?

      Merci d'avance

      1 réponse Dernière réponse Répondre Citer 0
      • eoliaE Hors-ligne
        eolia
        dernière édition par

        Phenix ne supprime aucune colonne dans la base de données lors des mises à jour.

        Créateur de PhenixSuite. Pour plus d'infos : https://eoliashop.com

        1 réponse Dernière réponse Répondre Citer 0
        • C Hors-ligne
          camille
          dernière édition par

          ok merci. Je retiens pour d'autres modifs, pour celle-ci, le module est quasiment fonctionnel à 100%, j'ai encore un petit bug sur le HTML à l'enregistrement mais il crée sa table et n'utilise aucun override, juste les hooks.

          1 réponse Dernière réponse Répondre Citer 0
          • C Hors-ligne
            camille
            dernière édition par

            Eolia, tout à fait par hasard, est-ce que la v33 prévoit un second champ de texte avec éditeur pour les pages de catégories afin de pouvoir améliorer son SEO ?
            Juste pour savoir si j'essaie de régler le problème du HTML. Je me suis basée sur des tutos trouvés à gauche et à droite, j'ai bien mon nouveau champ avec l'éditeur. Mais je ne peux pas mettre de code comme des class="" car les doubles guillemets provoquent une erreur sql. Alors que je peux le faire dans le champ Description. J'ai essayé différentes choses. Avec pSQL, plus de balises, le texte est au simple format texte. J'ai bien trouvé une parade, le html est correctement affiché en BO et en FO, mais dans la base de données cela donne ceci

            <div class="test">
            <h2>Titre</h2>
            <p>Test html</p>
            <p>Seconde ligne</p>
            <p>Troisième ligne</p>
            </div>
            

            Cela serait sans doute plus simple de faire des overrides mais j'ai essayé avec des hooks. Tout fonctionne bien sauf ça. Du coup, j'ai dû mettre html_entity_decode dans le tpl pour qu'il n'affiche pas en clair le html.
            Voici par exemple le code de la fonction qui met à jour le champ longdescription

            public function updateLongDescription($params)
            {
                // Récupérer l'ID de la catégorie
                $id_category = (int)Tools::getValue('id_category');
            
                // Vérifier si l'ID est valide
                if ($id_category <= 0) {
                    return; // Si l'ID est invalide, on quitte la fonction
                }
            
                // Récupérer l'objet catégorie
                $category = new Category($id_category);
            
                // Vérifier si l'objet catégorie est valide
                if (!Validate::isLoadedObject($category)) {
                    return; // Si l'objet catégorie n'est pas valide, ne pas procéder
                }
            
                // Récupérer la langue actuelle
                $id_lang = (int)$this->context->language->id;
            
                // Récupérer la valeur du champ longdescription depuis la requête
                $longdescription = Tools::getValue('longdescription');
            
                // Si le champ est vide, supprimer la ligne dans la table
                if (empty($longdescription)) {
                    // Supprimer l'enregistrement correspondant dans la table category_long_description_lang
                    $sql = 'DELETE FROM `' . _DB_PREFIX_ . 'category_long_description_lang`
                            WHERE `id_category` = ' . $id_category . ' 
                            AND `id_lang` = ' . $id_lang;
                    Db::getInstance()->execute($sql);
                    return; // Sortir de la fonction après suppression
                }
              
                // Sécuriser la valeur avec htmlentities pour éviter les problèmes de collation et d'injection SQL
                // $longdescription = strip_tags($longdescription, '<h1><h2><h3><h4><div><p><b><i><u><a><br><ul><ol><li>'); 
                   $longdescription = Tools::getValue('longdescription');
            // $allowed_html_tags = '<h1><h2><h3><h4><div><p><b><i><u><a><br><ul><ol><li><img>';
            // $longdescription = strip_tags($longdescription, $allowed_html_tags);
            $longdescription = htmlentities($longdescription);
            $longdescription = pSQL($longdescription, true);
                // Vérifier si un enregistrement existe déjà pour cette catégorie et cette langue
                $sql = 'SELECT `id_category` 
                        FROM `' . _DB_PREFIX_ . 'category_long_description_lang`
                        WHERE `id_category` = ' . $id_category . ' 
                        AND `id_lang` = ' . $id_lang;
                $existing = Db::getInstance()->getValue($sql);
            
                if ($existing) {
                    // Si un enregistrement existe déjà, mettre à jour le contenu
                    $sql = 'UPDATE `' . _DB_PREFIX_ . 'category_long_description_lang`
                            SET `longdescription` = "' . $longdescription . '"
                            WHERE `id_category` = ' . $id_category . ' 
                            AND `id_lang` = ' . $id_lang;
                } else {
                    // Sinon, insérer un nouvel enregistrement
                    $sql = 'INSERT INTO `' . _DB_PREFIX_ . 'category_long_description_lang` 
                            (`id_category`, `id_lang`, `longdescription`) 
                            VALUES (' . $id_category . ', ' . $id_lang . ', "' . $longdescription . '")';
                }
            
                // Exécuter la requête
                Db::getInstance()->execute($sql);
            }
            

            J'ai laissé certaines choses en les commentant pour les tests.
            Si quelqu'un a 2 minutes pour y jeter un oeil et me dire comment envoyer cela correctement à la bdd et ne pas avoir à utiliser html_entity_decode, ce serait vraiment hyper sympa !

            Merci d'avance

            1 réponse Dernière réponse Répondre Citer 0
            • C Hors-ligne
              camille
              dernière édition par

              Finalement, je pense avoir trouvé. Il fallait juste garder

              $longdescription = Tools::getValue('longdescription');
              $longdescription = pSQL($longdescription, true);
              

              Maintenant tout est fonctionnel (en tout cas, à première vue). Je peux créer une nouvelle catégorie avec une description longue en bas de page, la mettre à jour. Si je supprime le texte, la ligne est effacée de la base de données (pour éviter de l'alourdir). Idem si la catégorie est supprimée.
              Si jamais ça intéresse quelqu'un, je le mets à dispo de qui veut 🙂 Compatible 1.6 et Phenix uniquement.

              1 réponse Dernière réponse Répondre Citer 0
              • Premier message
                Dernier message
              bug
              26 sujets
              1.6
              24 sujets
              front-office
              11 sujets
              1.5
              8 sujets
              1.7
              5 sujets
              système
              4 sujets
              administration
              3 sujets
              hack
              3 sujets
              module
              3 sujets
              performance
              3 sujets
              smtp
              3 sujets
              transporteurs
              3 sujets
              dashboard
              2 sujets
              https
              2 sujets
              paypal
              2 sujets
              promotions
              2 sujets