Champ description longue pour les catégories



  • 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



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



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



  • 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



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


Se connecter pour répondre