foxpowa Posted February 9, 2011 Share Posted February 9, 2011 Bonjour,Je me permets d'ouvrir un nouveau topic car je cherche le moyen de supprimer automatiquement un objet de la base de donnée lorsque sa quantité a atteint zéro. En effet dans ma boutique les objets ne sont que de passage !En détail, je test dans le fichier product.php (et plus tard quand le code fonctionnera dans category.php et dans leurs homologues d'administration) la quantité du produit affiché et si elle vaut zéro, je supprime l'objet. Sauf que la suppression ne se fait tout simplement pas ...Un aperçu de mon product.php : ... else { $product = new Product($id_product, true, intval($cookie->id_lang)); if (!Validate::isLoadedObject($product) OR !$product->active) { header('HTTP/1.1 404 page not found'); $errors[] = Tools::displayError('product is no longer available'); } elseif (!$product->checkAccess(intval($cookie->id_customer))) $errors[] = Tools::displayError('you do not have access to this product'); else { if(Product::getQuantity($id_product) == 0) { $product->delete; header('HTTP/1.1 404 page not found'); $errors[] = Tools::displayError('product is no longer available'); } ... Si quelqu'un a une piste, je suis preneur !Merci.EDIT : quelques infos techniques :Type d’install (nouvelle/MàJ) : NouvelleVersion de PS : 1.3.6.0Thème (défaut/perso) : défautCode (original/modifié) : Original jusque làHébergement : localhost (wamp 2.0)Version de PHP : 5.3.5Version de MySQL : 5.5.8 Link to comment Share on other sites More sharing options...
foxpowa Posted February 13, 2011 Author Share Posted February 13, 2011 Un petit up sur le sujet, je patauge !Idem que sur le FO, sur le BO impossible de supprimer un Produit de la base (table db_prefix_product, _lang et les images associées ...)En gros, j'instancie un objet de la classe product avec son identifiant de la base : $product = new Product($array['id_product']); Et je demande la suppression : $product->delete J'espérais que ça soit aussi simple mais apparemment pas ... ?Si qqn a une idée, je suis preneur ! Merci ! Link to comment Share on other sites More sharing options...
Bruno Leveque Posted February 13, 2011 Share Posted February 13, 2011 Bonsoir,Attention aux problèmes potentiels, par exemple si l'acheteur annule sa commande, ou n'envoie jamais son chèque...etc tu devras re-créer le produit.Le plus simple serait probablement de le désactiver et/ou de le placer dans une autre catégorie.Si j'étais toi, je ferai un script qui tourne à part (tâche planifiée / cron) toutes les heures par exemple :(code non testé) include(dirname(__FILE__)'/config/config.inc.php'); $products = Db::getInstance()->Execute('SELECT p.id_product FROM '._DB_PREFIX_.'product p WHERE p.quantity = 0'); if (sizeof($products)) Db::getInstance()->Execute('UPDATE '._DB_PREFIX_.'product SET active = 0 WHERE id_product IN ('.implode(',', $products).')'); Je décompose en 2 requêtes car de mémoire pas de possibilité de faire un UPDATE from SELECT si les tables concernées sont dans les 2 requêtes... Attention mon code ne fonctionnera uniquement si tes produits n'ont pas de déclinaisons.++ Link to comment Share on other sites More sharing options...
Broceliande Posted February 13, 2011 Share Posted February 13, 2011 Comme le dit Bruno , un $product->active=false et un $product->update() serait plus inspiré : le produit n'apparaitra plus dans ton bo mais en cas de retour produit ou autre mésaventure : pas de hic.Un module peut faire ça au moment du hook newOrder, ou peut être plus prudemment au changement de statut de la commande, hook updateOrderStatus :commande en expédition alors moulinette.... Link to comment Share on other sites More sharing options...
foxpowa Posted February 14, 2011 Author Share Posted February 14, 2011 Merci pour vos conseils !Je vais simplement désactiver le produit et lancer périodiquement la suppression des objets inactifs Mais la méthode delete n'a pas l'air de fonctionner de la manière dont je l'utilise ...En ce qui concerne le BO, j'aimerai pouvoir supprimer les produits de la base dans le cadre d'une synchronisation avec une autre base donnée.Je vous passe les détails mais dans mon processus de synchro, j'ai des produit à maj, à ne pas toucher, à ajouter et enfin à supprimer.La méthode delete n'a pas l'air de fonctionner et j'essaie d'étudier comment un produit est supprimé dans le tab admincatalogue mais j'ai du mal à comprendre ... Link to comment Share on other sites More sharing options...
foxpowa Posted February 14, 2011 Author Share Posted February 14, 2011 En suivant vos conseils j'ai mis en place une méthode de la classe Category qui va chercher les produits dont la quantité est = 0 et qui sont actifs pour les rendre inactifs. static public function updateQtyProduct() { $sql = ' SELECT `id_product` FROM `'._DB_PREFIX_.'product` WHERE `quantity` = 0 AND `active` = 1'; $result = Db::getInstance()->ExecuteS($sql); if(isset($result)) { foreach($result as $array) { $product = new Product($array['id_product']); $product->active = false; $product->update(); } } $sql = ' SELECT `id_product` FROM `'._DB_PREFIX_.'product` WHERE `quantity` > 0 AND `active` = 0'; $result = Db::getInstance()->ExecuteS($sql); if(isset($result)) { foreach($result as $array) { $product = new Product($array['id_product']); $product->active = true; $product->update(); } } return true; } J'appelle cette fonction dans la méthode getProducts de la classe Cateogry juste avant qu'elle ne génère la liste des produits de la catégories.Et j'ai rajouté un test sur la quantité dans la page product.php qui met le produit en inactif avec message d'erreur si un petit malin irait directement sur cette page !Donc au final, les clients n'ont accès qu'aux produits actifs et qui sont disponibles (en quantité >=1).Mais je me retrouve avec x produits inactifs dans la base de données qui sont à supprimer, car ils ne seront jamais approvisionnés. (spécificité de ma boutique ...). Ayant remarqué que la méthode "delete" ne fonctionnait pas, ou ne l'utilisant pas comme il faudrait, je cherche à comprendre comment est supprimé un produit de la base via le BO.Quelqu'un saurait faire cela ?Merci Link to comment Share on other sites More sharing options...
Bruno Leveque Posted February 14, 2011 Share Posted February 14, 2011 Bonsoir,La méthode delete() fonctionne correctement... peut-être que votre version a un souci ?Pouvez-vous télécharger la v1.4 RC3 et effectuer un test de suppression ?Cordialement, Link to comment Share on other sites More sharing options...
Broceliande Posted February 14, 2011 Share Posted February 14, 2011 Je confirme , la methode delete() fonctionne parfaitement et la reproduire revient à réinventer la roue.Il n'y a qu'a jeter un oeil à la methode delete() de la classe produit pour s'en rendre compte : public function delete() { Hook::deleteProduct($this); if (!parent::delete() OR !$this->deleteCategories(true) OR !$this->deleteImages() OR !$this->deleteProductAttributes() OR !$this->deleteProductFeatures() OR !$this->deleteTags() OR !$this->deleteCartProducts() OR !$this->deleteAttributesImpacts() OR !$this->deleteAttachments() OR !$this->deleteCustomization() OR !$this->deleteQuantityDiscounts() OR !$this->deletePack() OR !$this->deleteProductSale() OR !$this->deleteSceneProducts() OR !$this->deleteSearchIndexes() OR !$this->deleteAccessories() OR !$this->deleteFromAccessories()) return false; if ($id = ProductDownload::getIdFromIdProduct($this->id)) if ($productDownload = new ProductDownload($id) AND !$productDownload->delete(true)) return false; return true; } Link to comment Share on other sites More sharing options...
Broceliande Posted February 14, 2011 Share Posted February 14, 2011 Ensuite, je reviens à ce qu'il me semble j'avais suggéré.Modifier le core pour obtenir le résultat que tu cherches ne rime à rien , enfin surtout c'est dommage.Prestashop a des hooks qui suffisent parfaitement bien et tout ce que tu codes pourrait n'être qu'un simple module sans toucher au core . Parmi eux , il y en a justement un fait pour ça : productOutOfStockEn d'autres termes, le hook est exécuté lorsqu'un produit a son stock qui passe à 0Si ton module souscrit à ce hook , tu peux simplement désactiver le produit et le tour est joué. Puis tu n'auras pas touché au core et tu pourras mettre à jour facilement ton presta.Quant à le supprimer , c'est tout aussi simple , sauf que je me demande ce que tu fais dans le cas ou on te retourne un produit que tu as supprimé ?Edit : au fait, si jamais la méthode delete() ne fonctionne pas , c'est peut être que tu n'as pas réellement une instance correcte du produit ? Tu as essayé de faire un var_dump dessus pour voir ? Link to comment Share on other sites More sharing options...
foxpowa Posted February 14, 2011 Author Share Posted February 14, 2011 Merci pour vos réponses.Pour répondre à Borcéliande,j'avais jeté un coup d'oeil à la méthode delete, mais le fait est que sur la version que j'ai dans la config que j'ai, la suppression n'est pas effective.Je ne voulais pas ré-inventer la roue, au contraire, j'ai un temps limité pour développer quelques autres fonctionnalités.J'ai parcouru la doc technique de prestashop mais je n'ai pas vu les explications détaillées des Hooks, méthodes d'objet,... j'ai cru comprendre que le guide du développeur serait bientôt disponible.Dans la précipitation je modifie le coeur pcq je suis sûr de ce que je fais. Je vais me pencher sur les hooks de prestashop puisqu'apparemment ça m'aurait fait gagner du temps La suppression d'un produit n'est pas spécialement grave, puisque le catalogue de ma boutique n'est pas centralisé sur celui de mon site prestahop, j'opère très régulièrement des synchronisations à partir d'un autre inventaire "référence".Je vais rechercher des infos sur les différents hooks de prestashop et leurs fonctionnements !D'ailleurs à ce sujet, j'aimerais générer un fichier lorsque qu'une commande est passée (et confirmée). Il s'agit là aussi de trouver le bon hook je suppose ?Naïvement je pense qu'ils sont codés dans Hook.php ?Vivement le guide du développeur EDIT : j'aurai du lire le doc technique en entier et ne pas juste la parcourir Enfin bon j'avais bien compris l'intérêt de module et autre, mais en l'occurrence, ma méthode delete ne fonctionne pas, je vais tester sur la dernière RC de presta, on verra bien ! Link to comment Share on other sites More sharing options...
Broceliande Posted February 14, 2011 Share Posted February 14, 2011 Il y a un excellent tuto sur la création de modules sur ce même forum, iciIl existe bien sûr un hook lorsqu'une commande est passée : hookNewOrderTu trouveras aussi une liste des hooks dans la bdd , table du même nom.Edit : "réinventer la roue" ne t'était pas destiné directement, c'était juste une façon de dire que quand on regarde tout ce que fait presta lors d'un delete , il y a de quoi ... Link to comment Share on other sites More sharing options...
foxpowa Posted February 14, 2011 Author Share Posted February 14, 2011 Merci pour toutes ces infos Je vais lire tout ça et créer des modules au lieu de modifier le core de presta ! 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