cocoges Posted May 18, 2010 Share Posted May 18, 2010 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 More sharing options...
Divine Posted May 18, 2010 Share Posted May 18, 2010 Bonsoir,Tes produits sont toujours visibles quand tu désactives la catégorie concernée ? Link to comment Share on other sites More sharing options...
cocoges Posted May 18, 2010 Author Share Posted May 18, 2010 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 More sharing options...
cocoges Posted May 20, 2010 Author Share Posted May 20, 2010 Bonsoir à toutes et tous, Ma petit question reste toujours sans réponse.Votre contribution à la réponse est la bienvenue ! Dans l'attente de vous lire Link to comment Share on other sites More sharing options...
jeckyl Posted May 20, 2010 Share Posted May 20, 2010 Bonjour,je suppose qu'il faut modifier la fonction qui désactive la catégorie pour qu'elle désactive en même temps tous les produits de la dite catégorie. Link to comment Share on other sites More sharing options...
cocoges Posted May 20, 2010 Author Share Posted May 20, 2010 Effectivement, cette réflexion me semble tout a fait appropriée.Par contre, mes connaissances ne sont pas tout a fait appropriées Une idée pour m'aider ?Par avance merci Link to comment Share on other sites More sharing options...
BVince Posted May 21, 2010 Share Posted May 21, 2010 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 More sharing options...
cocoges Posted May 21, 2010 Author Share Posted May 21, 2010 Merci BVince Ca fait une semaine que je suis dessus et j'ai planté mes fichiers lolEnfin 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 More sharing options...
BVince Posted May 22, 2010 Share Posted May 22, 2010 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 More sharing options...
cocoges Posted May 22, 2010 Author Share Posted May 22, 2010 Bonjour BVince et merci pour cette réponse.J'ai une 1.2.5J'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 More sharing options...
BVince Posted May 22, 2010 Share Posted May 22, 2010 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 More sharing options...
cocoges Posted May 22, 2010 Author Share Posted May 22, 2010 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 More sharing options...
BVince Posted May 22, 2010 Share Posted May 22, 2010 Et bien pour moi ça marche nickel... Es tu sûr que tu as remplacé le fichier ? Link to comment Share on other sites More sharing options...
cocoges Posted May 22, 2010 Author Share Posted May 22, 2010 Je l'ai supprimé avant de l'uploader.Snif ! Link to comment Share on other sites More sharing options...
BVince Posted May 22, 2010 Share Posted May 22, 2010 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 More sharing options...
cocoges Posted May 22, 2010 Author Share Posted May 22, 2010 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 More sharing options...
BVince Posted May 22, 2010 Share Posted May 22, 2010 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...7Je te joins le fichier objectModel.php de mon site. ObjectModel.php Link to comment Share on other sites More sharing options...
BVince Posted May 22, 2010 Share Posted May 22, 2010 Tiens moi au courant avec cette modification...Merci... Link to comment Share on other sites More sharing options...
cocoges Posted May 22, 2010 Author Share Posted May 22, 2010 Super ! Effectivement cela fonctionne nikel maintenant.Merci à toi ! Link to comment Share on other sites More sharing options...
BVince Posted May 22, 2010 Share Posted May 22, 2010 C'est parfait.... Link to comment Share on other sites More sharing options...
chrisxm Posted October 8, 2010 Share Posted October 8, 2010 Super, c'est exactement ce que je cherchais !!Merci Bvince ! Link to comment Share on other sites More sharing options...
chrisxm Posted October 14, 2010 Share Posted October 14, 2010 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 More sharing options...
BVince Posted October 14, 2010 Share Posted October 14, 2010 Bonjour,je viens de faire le test sur une 1.3.2.3 et le serveur me répond Il y a 1 erreur : 1. ce produit n'est plus disponible donc pas de soucis..... Link to comment Share on other sites More sharing options...
chrisxm Posted October 14, 2010 Share Posted October 14, 2010 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 More sharing options...
chrisxm Posted October 14, 2010 Share Posted October 14, 2010 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 More sharing options...
BVince Posted October 14, 2010 Share Posted October 14, 2010 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 More sharing options...
chrisxm Posted October 14, 2010 Share Posted October 14, 2010 Non, de mon côté, quand je rentre l'url directement, le produit est toujours disponible !Et de plus, en BO, la coche des produits qui se trouvent dans la catégorie déactivée est toujours verte, est-ce normal ? Link to comment Share on other sites More sharing options...
BVince Posted October 14, 2010 Share Posted October 14, 2010 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 More sharing options...
chrisxm Posted October 14, 2010 Share Posted October 14, 2010 Ok , ça me rassure, alors ! car avant de migrer , cela fonctionnait bien ! Link to comment Share on other sites More sharing options...
BVince Posted October 14, 2010 Share Posted October 14, 2010 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 More sharing options...
chrisxm Posted October 14, 2010 Share Posted October 14, 2010 Ok , je teste ça de suite !merci pour ta célérité Link to comment Share on other sites More sharing options...
chrisxm Posted October 14, 2010 Share Posted October 14, 2010 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 More sharing options...
BVince Posted October 15, 2010 Share Posted October 15, 2010 Bonjour,le code que j'ai ajouté permet de transformer l'état actuel du produit dans son inverse, donc active => inactiveinactive = activepour 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 More sharing options...
chrisxm Posted October 15, 2010 Share Posted October 15, 2010 Bonjour,je viens de tester et cela marche parfaitement !Merci à toi ! Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now