Jump to content

{RESOLU} Masquer Catégorie -> masquer tous ses produits


Recommended Posts

Bonjour,

Comme le sujet l'indique, je souhaite instaurer le processus suivant dans ma boutique prestashop 1.2.5 :

Quand je masque une catégorie ou sous-catégorie, je souhaite que tous les produits qui s'y trouve ne soient plus visibles dans la boutique ni dans le résultat du moteur de recherche.

CE qui ne semble pas être le cas.

Est-ce que qqun à une idée car je ne sais pas par quel bout commencer ?

Merci de vos diligences ;)

Link to comment
Share on other sites

Bonsoir Divine,

Hey bien quand la catégorie est masqué on ne peut pas accéder aux produits. Par contre, ils sont toujours accessible, notamment par le biais de mon moteur de recherche et ma recherche avancée.
Je cherche donc à masquer en même temps que la catégorie, l'ensemble des produits et sous-catégories qui s'y trouvent.

Est-ce possible ?? :) c'est une question qui serait heureuse de trouver sa réponse.

Par avance merci.

Link to comment
Share on other sites

Jeckyl a raison, il te faut ajouter la désactivation des produits lors de la désactivation de la catégorie, il faudra aussi penser à faire le chemin inverse. Autre point important, désactiver les produits des catégories contenues dans ta catégorie à désactiver, etc, etc....
Si tu regardes tous les fichiers qui ont un rapport avec le catalogue et les catégories et je pense que tu vas trouver ce qu'il te faut.

Link to comment
Share on other sites

Merci BVince :) Ca fait une semaine que je suis dessus et j'ai planté mes fichiers lol
Enfin si quelqu'un peut creuser la réponse se serait super sans abuser de votre amabilité ;)
J'ai beau creuser, je trouve pas ce tuyau dans le php pour les nuls :)
Par avance merci.

Link to comment
Share on other sites

Bonjour,
Si tu cherches dans le PHP pour les nuls, je pense que tu n'y arriveras pas, j'ai regardé dans le code, dans le dossier "classes", fichier "ObjectModel.php", j'ai modifié la fonction update de la manière suivante :

    public function update($nullValues = false)
   {
        if (!Validate::isTableOrIdentifier($this->identifier) OR !Validate::isTableOrIdentifier($this->table))
           die(Tools::displayError());

       /* Automatically fill dates */
       if (key_exists('date_upd', $this))
           $this->date_upd = date('Y-m-d H:i:s');

       /* BVince ADD */
       $resultUpdateProduct = true;
       if($this->table == "category") {
           $dataCat = $this->getFields();
           $categoryState = $dataCat['active'];
           $resultUpdateProduct = Db::getInstance()->Execute(
                   "UPDATE "._DB_PREFIX_."product tb INNER JOIN "._DB_PREFIX_."category_product tbl 
                   ON (tb.id_product=tbl.id_product) SET active=".$categoryState." 
                   WHERE tbl.id_category=".intval($this->id)." OR tb.id_category_default=".intval($this->id)
           );
       }

       /* Database update */
       if ($nullValues)
               $result = Db::getInstance()->autoExecuteWithNullValues(_DB_PREFIX_.$this->table, $this->getFields(), 'UPDATE', '`'.pSQL($this->identifier).'` = '.intval($this->id));
       else
               $result = Db::getInstance()->autoExecute(_DB_PREFIX_.$this->table, $this->getFields(), 'UPDATE', '`'.pSQL($this->identifier).'` = '.intval($this->id));

       /* BVince Modify */
       if (!$result || !$resultUpdateProduct)
           return false;

       /* Database update for multilingual fields related to the object */
       if (method_exists($this, 'getTranslationsFieldsChild'))
       {
           $fields = $this->getTranslationsFieldsChild();
           foreach ($fields as $field)
           {
               foreach ($field as $key => $value)
                    if (!Validate::isTableOrIdentifier($key))
                        die(Tools::displayError());
               $mode = Db::getInstance()->getRow('SELECT `id_lang` FROM `'.pSQL(_DB_PREFIX_.$this->table).'_lang` WHERE `'.pSQL($this->identifier).
               '` = '.intval($this->id).' AND `id_lang` = '.intval($field['id_lang']));
               $result *= (!Db::getInstance()->NumRows()) ? Db::getInstance()->AutoExecute(_DB_PREFIX_.$this->table.'_lang', $field, 'INSERT') :
               Db::getInstance()->AutoExecute(_DB_PREFIX_.$this->table.'_lang', $field, 'UPDATE', '`'.
               pSQL($this->identifier).'` = '.intval($this->id).' AND `id_lang` = '.intval($field['id_lang']));
           }
       }
       return $result;
   }



Tu pourras voir 2 parties de codes précédées par /* BVince Modify */ et /* BVince ADD */, cette modification permet simplement d'activer et de désactiver les produits contenus dans la catégories que l'on modifie, il n'y a pas de récursivité dans les catégories enfants. Donc si tu actives la catégorie, tous tes produits seront activés, si tu la désactives, tous les produits seront désactivés. [Attention : modification sur une 1.2.5]
En espérant que ça serve à la communauté, mais attention, les modifications de Prestashop ne sont jamais sans conséquences, à utiliser avec beaucoup de précautions.

Link to comment
Share on other sites

Bonjour BVince et merci pour cette réponse.
J'ai une 1.2.5
J'ai effectué la mise à jour du fichier en question mais quand je désactive une catégorie, les produits sont toujours visibles.
Je pense que cela ne fonctionne pas chez moi.
Une idée ?

Link to comment
Share on other sites

As tu vérifié que lors de la désactivation de la catégorie, les produits sont aussi désactivés...?
EDIT : Je viens de faire 2 ou 3 modifs dans le code...
EDIT bis : De mon côté, avec cette modification, quand je désactive une catégorie, les produits contenus dans celle ci sont aussi désactivés.
EDIT ter : je viens de faire le test, désactivation de la catégorie = désactivation des produits et si on tape un truc du style http://www.monsite.fr/product.php?id_product=19 alors la boutique répond "1. ce produit n'est plus disponible".
EDIT qua : Comme tu es en 1.2.5, je te mets ici mon fichier objectModel.php de mon site aussi en 1.2.5.

ObjectModel.php

Link to comment
Share on other sites

Je viens de mettre ton fichier pour essai.
Quand je désactive la catégorie (sous-catégorie pour être précis) tous les produits qui se trouvent dans à la racine de ladite catégorie restent actifs dans l'admin (vert) et accessible sur le site.
Quid ?

Link to comment
Share on other sites

Je crois que je viens de comprendre, tu cliques directement sur le symbole "coche verte" dans le tableau des catégorie, c'est ça ? mais si tu entres dans la catégories et que tu désactives la catégorie et que tu valides, alors là ça devrait être bon...

Link to comment
Share on other sites

Affirmatif !
Quand je clique sur la fleche verte cela ne fonctionne pas.
Je suis passé en mode édition dans la catégorie et maintenant cela fonctionne !
C'est déjà une excellente nouvelle et ca va tout de même bien faciliter la vie.
Merci pour cette contribution BVince !!

Link to comment
Share on other sites

Après recherche dans le code, voici la solution :
toujours dans le fichier objectModel.php, modifier la fonction toggleStatus de la manière suivante :

    public function toggleStatus()
   {
        if (!Validate::isTableOrIdentifier($this->identifier) OR !Validate::isTableOrIdentifier($this->table))
            die(Tools::displayError());

        /* Object must have a variable called 'active' */
        elseif (!key_exists('active', $this))
            die(Tools::displayError());

       /* BVince ADD */
       if($this->table == "category") {
           $dataCat = $this->getFields();
           $categoryState = $dataCat['active'];
           $resultUpdateProduct = Db::getInstance()->Execute(
                   "UPDATE "._DB_PREFIX_."product tb INNER JOIN "._DB_PREFIX_."category_product tbl 
                   ON (tb.id_product=tbl.id_product) SET `active` = !`active` 
                   WHERE tbl.id_category=".intval($this->id)." OR tb.id_category_default=".intval($this->id)
           );
       }

       /* Change status to active/inactive */
       return Db::getInstance()->Execute('
       UPDATE `'.pSQL(_DB_PREFIX_.$this->table).'`
       SET `active` = !`active`
       WHERE `'.pSQL($this->identifier).'` = '.intval($this->id));
   }



et voilà, tu pourras désactiver et activer tes catégories (et produits) en cliquant sur l'icône du tableau...7
Je te joins le fichier objectModel.php de mon site.

ObjectModel.php

Link to comment
Share on other sites

  • 4 months later...

Bonjour Bvince,

je suis passé en 1.3.2.3 et je viens de remarquer que sur une recherche ou bien avec le bloc nouveau produits, même si les catégories étaient désactivés, les produits désactivés apparaissent toujours si l on connait le nom du produit.



Merci

Link to comment
Share on other sites

ha mince, je viens de tester aussi et il m a sorti une liste de produits dont j ai pourtant désactivé la catégorie ....


est ce que dans le BO les produits de la catégorie désactivée apparaissent désactivée eux aussi ?

Dans le doute, j ai pris ton fichier et l ai mis à la place du mien, mais sans succès !

je vais retenter en ré-activant/ désactivant la catégorie !

Link to comment
Share on other sites

Non, je viens de ré-essayer et j ai bien le produit qui est toujours présent !

Je viens de mettre en pièce jointe, le fichier modifié avec les deux options desactivation produit (avec produits concernés) et la modification pour la désactivation en masse des produits que tu proposais sur un autre thread !

si tu veux y jeter un oeil , mais bon, tout me semble correct, et avec ton fichier, j'obtiens le même résultat !

ObjectModel.php

Link to comment
Share on other sites

Et bien de mon côté, je persiste et signe, les produits désactivés ne sont plus accessibles en Front Office. Tu vois tes produits quand tu tapes l'URL complète pour y accéder ou tu les vois ailleurs dans un autre module ? car quand je fais un copier-coller de l'url et que j'essaie d'y accéder après désactivation, je ne peux pas...

Link to comment
Share on other sites

Et bien non, ton problème vient de là, si la coche est toujours verte, le produit est donc toujours actif, donc toujours accessible en Front Office, les fichiers que j'ai fourni sont des version pour PS 1.3.1.1 alors ce n'est peut être pas la même chose avec une 1.3.2.3...

Link to comment
Share on other sites

Je viens de faire le test sur une 1.3.2.3 en modifiant la fonction ToogleStatus de la manière suivante et ça fonctionne :


    public function toggleStatus()
   {
        if (!Validate::isTableOrIdentifier($this->identifier) OR !Validate::isTableOrIdentifier($this->table))
            die(Tools::displayError());

        /* Object must have a variable called 'active' */
        elseif (!key_exists('active', $this))
            die(Tools::displayError());

       /* BVince ADD */
       if($this->table == "category") {
           $dataCat = $this->getFields();
           $categoryState = $dataCat['active'];
           $resultUpdateProduct = Db::getInstance()->Execute(
                   "UPDATE "._DB_PREFIX_."product tb INNER JOIN "._DB_PREFIX_."category_product tbl 
                   ON (tb.id_product=tbl.id_product) SET `active` = !`active` 
                   WHERE tbl.id_category=".intval($this->id)." OR tb.id_category_default=".intval($this->id)
           );
       }

        /* Update active status on object */
        $this->active = intval(!$this->active);

       /* Change status to active/inactive */
       return Db::getInstance()->Execute('
       UPDATE `'.pSQL(_DB_PREFIX_.$this->table).'`
       SET `active` = !`active`
       WHERE `'.pSQL($this->identifier).'` = '.intval($this->id));
   }



cela permet de désactiver les produits contenu dans une catégorie lorsqu'on la désactive...

Link to comment
Share on other sites

Alors , j'ai un comportement pour le moins bizarre , quand j active la catégorie les produits sont désactivés et quand je désactive la catégorie, les produits sont activés ?!

Ceci que pour les catégories que j'avais désactivés par defaut , pour les autres catégories le fonctionnement est normal !

Edit: je pense que c est lors de l'importation de mes produits dans des catégories qui sont désactivées par défaut!

Je vais regarder pour essayer de trouver une solution !

En tous cas, encore merci pour ton aide !

Link to comment
Share on other sites

Bonjour,

le code que j'ai ajouté permet de transformer l'état actuel du produit dans son inverse, donc
active => inactive
inactive = active
pour que les produits prennent obligatoirement l'état de la catégorie, il faudrait plutôt modifier le code de cette manière là :

fonction update du fichier ObjectModel.php

public function update($nullValues = false)
{
   if (!Validate::isTableOrIdentifier($this->identifier) OR !Validate::isTableOrIdentifier($this->table))
       die(Tools::displayError());

   /* Automatically fill dates */
   if (key_exists('date_upd', $this))
       $this->date_upd = date('Y-m-d H:i:s');

   /* BVince ADD */
   if($this->table == "category") {
       $dataCat = $this->getFields();
       $categoryState = $dataCat['active'];
       $resultUpdateProduct = Db::getInstance()->Execute(
               "UPDATE "._DB_PREFIX_."product tb INNER JOIN "._DB_PREFIX_."category_product tbl 
               ON (tb.id_product=tbl.id_product) SET `active` = ".intval(!$this->active)." 
               WHERE tbl.id_category=".intval($this->id)." OR tb.id_category_default=".intval($this->id)
       );
   }

   /* Database update */
   if ($nullValues)
       $result = Db::getInstance()->autoExecuteWithNullValues(_DB_PREFIX_.$this->table, $this->getFields(), 'UPDATE', '`'.pSQL($this->identifier).'` = '.intval($this->id));
   else
       $result = Db::getInstance()->autoExecute(_DB_PREFIX_.$this->table, $this->getFields(), 'UPDATE', '`'.pSQL($this->identifier).'` = '.intval($this->id));
   if (!$result)
       return false;

   /* Database update for multilingual fields related to the object */
   if (method_exists($this, 'getTranslationsFieldsChild'))
   {
       $fields = $this->getTranslationsFieldsChild();
       foreach ($fields as $field)
       {
           foreach ($field as $key => $value)
               if (!Validate::isTableOrIdentifier($key))
                   die(Tools::displayError());
           $mode = Db::getInstance()->getRow('SELECT `id_lang` FROM `'.pSQL(_DB_PREFIX_.$this->table).'_lang` WHERE `'.pSQL($this->identifier).
           '` = '.intval($this->id).' AND `id_lang` = '.intval($field['id_lang']));
           $result *= (!Db::getInstance()->NumRows()) ? Db::getInstance()->AutoExecute(_DB_PREFIX_.$this->table.'_lang', $field, 'INSERT') :
           Db::getInstance()->AutoExecute(_DB_PREFIX_.$this->table.'_lang', $field, 'UPDATE', '`'.
           pSQL($this->identifier).'` = '.intval($this->id).' AND `id_lang` = '.intval($field['id_lang']));
       }
   }
   return $result;
}



fonction toggleStatus du fichier ObjectModel.php

public function toggleStatus()
{
   if (!Validate::isTableOrIdentifier($this->identifier) OR !Validate::isTableOrIdentifier($this->table))
       die(Tools::displayError());

   /* Object must have a variable called 'active' */
   elseif (!key_exists('active', $this))
       die(Tools::displayError());

   /* BVince ADD */
   if($this->table == "category") {
       $dataCat = $this->getFields();
       $categoryState = $dataCat['active'];
       $resultUpdateProduct = Db::getInstance()->Execute(
               "UPDATE "._DB_PREFIX_."product tb INNER JOIN "._DB_PREFIX_."category_product tbl 
               ON (tb.id_product=tbl.id_product) SET `active` = ".intval(!$this->active)." 
               WHERE tbl.id_category=".intval($this->id)." OR tb.id_category_default=".intval($this->id)
       );
   }

   /* Change status to active/inactive */
   return Db::getInstance()->Execute('
   UPDATE `'.pSQL(_DB_PREFIX_.$this->table).'`
   SET `active` = !`active`
   WHERE `'.pSQL($this->identifier).'` = '.intval($this->id));
}



de cette manière, la liste des produits contenus dans la catégorie héritent de l'état de la catégorie.

Link to comment
Share on other sites

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