lpv Posted November 14, 2014 Share Posted November 14, 2014 Bonjour, J'utilise la version 1.6 de prestashop. Je cherche à modifier en masse les quantités des déclinaisons de mon site internet via le système d'import des déclinaisons de Prestashop. Le problème est que je dois sélectionner l'option "supprimer les déclinaisons avant l'import" car sinon les déclinaisons ayant la même valeur sont doublées alors que je souhaiterais simplement mettre à jour la quantité de la déclinaison souhaitée. Si je choisis l'option "supprimer les déclinaisons avant l'import" toutes les déclinaisons qui sont associées à des paniers sont supprimées, donc les clients ne retrouvent pas leur panier complet après cet import en masse. En résumé, comment faire pour mettre à jour en masse les quantités de mes déclinaisons sans les supprimer toutes au préalable ? Merci par avance pour votre aide. jrm Link to comment Share on other sites More sharing options...
tuk66 Posted November 14, 2014 Share Posted November 14, 2014 Directement dans la base de données via des requêtes SQL ou un module d'importation personnalisé. Directly in the database via SQL queries or a custom import module. Link to comment Share on other sites More sharing options...
lpv Posted November 14, 2014 Author Share Posted November 14, 2014 Ah bon ? C'est moche quand même que l'on puisse pas faire ça.Existe-til des modules qui le font ? (payant ou gratuit ?) Merci par avance. Link to comment Share on other sites More sharing options...
lpv Posted November 14, 2014 Author Share Posted November 14, 2014 Bon, pour ceux que ça pourrait intéresser, voici comment je me suis pris. C'est moche mais ça marche, les déclinaisons présentes dans mes paniers ne sont plus effacés. J'ai créé le script suivant (sous Zend) qui attaque en direct la base de données après avoir récupéré un export depuis mon ERP. $chemin_destination = dirname(APPLICATION_PATH) . DIRECTORY_SEPARATOR . "public" . DIRECTORY_SEPARATOR . "files" . DIRECTORY_SEPARATOR; $finalFilename = $chemin_destination . $_FILES['file']['name']; move_uploaded_file($_FILES['file']['tmp_name'], $finalFilename); // Recupération de tous les produits de l'export ERP $i=0; $productDatas = array(); $firstline = array(); if (($handle = fopen($finalFilename, "r")) !== FALSE) { while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) { if ($i >0) { $productDatas[] = $data; } else { $firstline = $data; } $i++; } } foreach ($productDatas as $productData) { $designation = $productData[0]; $reference = $productData[1]; $price = $productData[2]; $quantite = $productData[3]; $stockType = $productData[4]; $size = $productData[5]; // Recherche de la ligne produit associé $SQL = "SELECT pac.id_product_attribute, ps.id_product FROM `ps_product` ps " . "INNER JOIN ps_product_attribute pa ON ps.id_product = pa.id_product " . "INNER JOIN ps_product_attribute_combination pac ON pa.id_product_attribute = pac.id_product_attribute " . "INNER JOIN ps_attribute_lang pl ON pl.id_attribute = pac.id_attribute " . "WHERE ps.reference = '$reference' and pl.name = '$size' "; $result = $this->_getDbAdapater()->fetchAll($SQL); // On a trouvé la déclinaison et toutes ses informations // Update du stock if ($result && isset($result[0])) { $id_product_attribute = $result[0]['id_product_attribute']; $id_product = $result[0]['id_product']; // mise à jour de la quantité $sqlUpdate = "UPDATE ps_stock_available SET quantity = $quantite " . "where id_product_attribute = $id_product_attribute AND id_product = $id_product"; $this->_getDbAdapater()->query($sqlUpdate); // log $line = date('Y-m-d h:i:s') . " - MAJ -- id_product : $id_product -- reference : $reference -- taille : $size -- nouveau stock : $quantite " . "\n"; file_put_contents($chemin_destination . "update_bague.txt", $line, FILE_APPEND); } } Link to comment Share on other sites More sharing options...
ikoulamathieu Posted August 28, 2015 Share Posted August 28, 2015 Bonjour, J'ia besoin de mettre à jour mes quantités (aucun gestion de stock avancée) sur mes produits sans déclinaison. J'ai mis à jour par conséquent le chiffre du champ `quantity` présent dans la table `stock_available` Sans déclinaison, aucune ligne dans la table product_attribute Problème dans le back-end,ça affiche toujours aucun chiffre Mise à jour à 2 des quantités dont le nombre est strictement inférieur à2 Requete : update stock_available set quantity=2 where quantity < 2; Problème, au niveau du back_end, la quantité reste à 0 ou 1 si elle était à 0 Je ne comprends pas pourquoi car en faisant la mise à jour par le back-end il semble n'écrire que dans cette table si aucune déclinaison n'est défini sur le produit. Avez-vous une idée ? Je n'ai pas épluché le code source php de ce que fait l'enregistrement de la fiche produit et donc des mises à jour dans les tables. Merci de votre aide. Link to comment Share on other sites More sharing options...
rvcat Posted August 29, 2015 Share Posted August 29, 2015 (edited) salut, Perso, j'ai été confronté à un besoin identique de mise à jour des données de la base de données à partir d'un fichier extérieur. Je suis plus à l'aise en sql qu'en php. Perso, j'ai créée une table qui me sert de stockage des données à importer. Tu vides cette table avant d'importer toutes les données de ton fichier. Ensuite, tu fais une requête sql en faisant les jointures de cette table avec les tables product et product_attribute pour trouver l'id_product en fonction de ta ref. Le résultat de la requête sera un peu long (3 à 4 secondes) car les ref de product et product_attribute ne sont pas indexées. et tu mets à jour ta base de données en parcourant en php les résultats de la requête. En plus avec la requête tu peux même détecter si les quantités doivent être modifiées, ça réduira le parcours qu'aux mises à jour réelles..... rv Edited August 29, 2015 by rvcat (see edit history) Link to comment Share on other sites More sharing options...
ikoulamathieu Posted August 31, 2015 Share Posted August 31, 2015 @rvcat : merci de ta réponse. Ce que je ne comprends pas; c'est le fait qu'en passant en base de données et en faisant la mise à jour qui est fonctionnel en base de données (vérifié via un select) toutes mes quantités sont = ou > à 2 Pourquoi dans le back-end, ces quantités ne sont pas affichées ? Est-ce une autre table qui gère celà ? Si je fais la mise à jour à 2 d 'un quantité à 0, la valeur du champ de la table que j'ai modifié par requête se met à jour comme si je le faisais en base. Je ne comprends pas. j'ai fais un commit au cas ou mais ça ne change rien. Quelqu'un a -t-il une explication ? Merci encore. Link to comment Share on other sites More sharing options...
ikoulamathieu Posted August 31, 2015 Share Posted August 31, 2015 Bonjour, après analyse, je me suis rendu compte que j'avais oublié de faire un truc dans la base. En fait, à l'enregistrement via le back end , il fait une insertion dans la table. Du coup j'ai fait les insertions en base SQL dans la table 'stock_available' pour que ça fonctionne et c'est OK INSERT INTO `stock_available` (`id_stock_available`,`id_product_attribute`,`id_shop`,`id_shop_group`,`quantity`,`depends_on_stock`,`out_of_stock`,`id_product`)VALUES('',0,1,0,2,0,2,2),('',0,1,0,2,0,2,3),('',0,1,0,2,0,2,10),('',0,1,0,2,0,2,17),('',0,1,0,2,0,2,18),('',0,1,0,2,0,2,19),('',0,1,0,2,0,2,20),('',0,1,0,2,0,2,21),('',0,1,0,2,0,2,22),('',0,1,0,2,0,2,23),('',0,1,0,2,0,2,24),('',0,1,0,2,0,2,25),('',0,1,0,2,0,2,26),('',0,1,0,2,0,2,27),('',0,1,0,2,0,2,28),('',0,1,0,2,0,2,29),('',0,1,0,2,0,2,30),('',0,1,0,2,0,2,31),('',0,1,0,2,0,2,32),('',0,1,0,2,0,2,33),('',0,1,0,2,0,2,34),('',0,1,0,2,0,2,35),('',0,1,0,2,0,2,36),('',0,1,0,2,0,2,37),('',0,1,0,2,0,2,38),('',0,1,0,2,0,2,39),('',0,1,0,2,0,2,40),('',0,1,0,2,0,2,41),('',0,1,0,2,0,2,42),('',0,1,0,2,0,2,43),('',0,1,0,2,0,2,44),('',0,1,0,2,0,2,45),('',0,1,0,2,0,2,46),('',0,1,0,2,0,2,47),('',0,1,0,2,0,2,48),('',0,1,0,2,0,2,49),('',0,1,0,2,0,2,50),('',0,1,0,2,0,2,51),('',0,1,0,2,0,2,52),('',0,1,0,2,0,2,56),('',0,1,0,2,0,2,57),('',0,1,0,2,0,2,58),('',0,1,0,2,0,2,59),('',0,1,0,2,0,2,60),('',0,1,0,2,0,2,61),('',0,1,0,2,0,2,62),('',0,1,0,2,0,2,63),('',0,1,0,2,0,2,64),('',0,1,0,2,0,2,65),('',0,1,0,2,0,2,66),('',0,1,0,2,0,2,67),('',0,1,0,2,0,2,68),('',0,1,0,2,0,2,69),('',0,1,0,2,0,2,70),('',0,1,0,2,0,2,72),('',0,1,0,2,0,2,79),('',0,1,0,2,0,2,86),('',0,1,0,2,0,2,87),('',0,1,0,2,0,2,92),('',0,1,0,2,0,2,93),('',0,1,0,2,0,2,94),('',0,1,0,2,0,2,95),('',0,1,0,2,0,2,96),('',0,1,0,2,0,2,97),('',0,1,0,2,0,2,99),('',0,1,0,2,0,2,100),('',0,1,0,2,0,2,101),('',0,1,0,2,0,2,103),('',0,1,0,2,0,2,104),('',0,1,0,2,0,2,105),('',0,1,0,2,0,2,107),('',0,1,0,2,0,2,109),('',0,1,0,2,0,2,110),('',0,1,0,2,0,2,111),('',0,1,0,2,0,2,112),('',0,1,0,2,0,2,113),('',0,1,0,2,0,2,114),('',0,1,0,2,0,2,115),('',0,1,0,2,0,2,116),('',0,1,0,2,0,2,117),('',0,1,0,2,0,2,118),('',0,1,0,2,0,2,119),('',0,1,0,2,0,2,121),('',0,1,0,2,0,2,125),('',0,1,0,2,0,2,140),('',0,1,0,2,0,2,141),('',0,1,0,2,0,2,142),('',0,1,0,2,0,2,143),('',0,1,0,2,0,2,144),('',0,1,0,2,0,2,145),('',0,1,0,2,0,2,146),('',0,1,0,2,0,2,147),('',0,1,0,2,0,2,148),('',0,1,0,2,0,2,149),('',0,1,0,2,0,2,150),('',0,1,0,2,0,2,151),('',0,1,0,2,0,2,152),('',0,1,0,2,0,2,153),('',0,1,0,2,0,2,154),('',0,1,0,2,0,2,155),('',0,1,0,2,0,2,156),('',0,1,0,2,0,2,157),('',0,1,0,2,0,2,158),('',0,1,0,2,0,2,159),('',0,1,0,2,0,2,160),('',0,1,0,2,0,2,161),('',0,1,0,2,0,2,162),('',0,1,0,2,0,2,163),('',0,1,0,2,0,2,164),('',0,1,0,2,0,2,165),('',0,1,0,2,0,2,166),('',0,1,0,2,0,2,167),('',0,1,0,2,0,2,168),('',0,1,0,2,0,2,169),('',0,1,0,2,0,2,170),('',0,1,0,2,0,2,171),('',0,1,0,2,0,2,172),('',0,1,0,2,0,2,173),('',0,1,0,2,0,2,174),('',0,1,0,2,0,2,180),('',0,1,0,2,0,2,181),('',0,1,0,2,0,2,182),('',0,1,0,2,0,2,183),('',0,1,0,2,0,2,184),('',0,1,0,2,0,2,185),('',0,1,0,2,0,2,186),('',0,1,0,2,0,2,187),('',0,1,0,2,0,2,188),('',0,1,0,2,0,2,189),('',0,1,0,2,0,2,190),('',0,1,0,2,0,2,191),('',0,1,0,2,0,2,192),('',0,1,0,2,0,2,193),('',0,1,0,2,0,2,194),('',0,1,0,2,0,2,195),('',0,1,0,2,0,2,196),('',0,1,0,2,0,2,197),('',0,1,0,2,0,2,199),('',0,1,0,2,0,2,200),('',0,1,0,2,0,2,201),('',0,1,0,2,0,2,202),('',0,1,0,2,0,2,213),('',0,1,0,2,0,2,214),('',0,1,0,2,0,2,215),('',0,1,0,2,0,2,217),('',0,1,0,2,0,2,218),('',0,1,0,2,0,2,219),('',0,1,0,2,0,2,220),('',0,1,0,2,0,2,221),('',0,1,0,2,0,2,222),('',0,1,0,2,0,2,223),('',0,1,0,2,0,2,224),('',0,1,0,2,0,2,225),('',0,1,0,2,0,2,226),('',0,1,0,2,0,2,227),('',0,1,0,2,0,2,228),('',0,1,0,2,0,2,229),('',0,1,0,2,0,2,230),('',0,1,0,2,0,2,231),('',0,1,0,2,0,2,232),('',0,1,0,2,0,2,233),('',0,1,0,2,0,2,234),('',0,1,0,2,0,2,235),('',0,1,0,2,0,2,236),('',0,1,0,2,0,2,237),('',0,1,0,2,0,2,238),('',0,1,0,2,0,2,266),('',0,1,0,2,0,2,267),('',0,1,0,2,0,2,268),('',0,1,0,2,0,2,269),('',0,1,0,2,0,2,270),('',0,1,0,2,0,2,271),('',0,1,0,2,0,2,272),('',0,1,0,2,0,2,273),('',0,1,0,2,0,2,274),('',0,1,0,2,0,2,278),('',0,1,0,2,0,2,279),('',0,1,0,2,0,2,280),('',0,1,0,2,0,2,281),('',0,1,0,2,0,2,282),('',0,1,0,2,0,2,283),('',0,1,0,2,0,2,295),('',0,1,0,2,0,2,296),('',0,1,0,2,0,2,297),('',0,1,0,2,0,2,298),('',0,1,0,2,0,2,299),('',0,1,0,2,0,2,300),('',0,1,0,2,0,2,301),('',0,1,0,2,0,2,302),('',0,1,0,2,0,2,303),('',0,1,0,2,0,2,304),('',0,1,0,2,0,2,305),('',0,1,0,2,0,2,306),('',0,1,0,2,0,2,307),('',0,1,0,2,0,2,308),('',0,1,0,2,0,2,310),('',0,1,0,2,0,2,311),('',0,1,0,2,0,2,312),('',0,1,0,2,0,2,313),('',0,1,0,2,0,2,318),('',0,1,0,2,0,2,320),('',0,1,0,2,0,2,328),('',0,1,0,2,0,2,329),('',0,1,0,2,0,2,330),('',0,1,0,2,0,2,332),('',0,1,0,2,0,2,333),('',0,1,0,2,0,2,334),('',0,1,0,2,0,2,335),('',0,1,0,2,0,2,336),('',0,1,0,2,0,2,337),('',0,1,0,2,0,2,338),('',0,1,0,2,0,2,340),('',0,1,0,2,0,2,341),('',0,1,0,2,0,2,342),('',0,1,0,2,0,2,343),('',0,1,0,2,0,2,344),('',0,1,0,2,0,2,345),('',0,1,0,2,0,2,346),('',0,1,0,2,0,2,347),('',0,1,0,2,0,2,348),('',0,1,0,2,0,2,351),('',0,1,0,2,0,2,359),('',0,1,0,2,0,2,362),('',0,1,0,2,0,2,368),('',0,1,0,2,0,2,369),('',0,1,0,2,0,2,398),('',0,1,0,2,0,2,409),('',0,1,0,2,0,2,410),('',0,1,0,2,0,2,412),('',0,1,0,2,0,2,415),('',0,1,0,2,0,2,417),('',0,1,0,2,0,2,419),('',0,1,0,2,0,2,420),('',0,1,0,2,0,2,424),('',0,1,0,2,0,2,425),('',0,1,0,2,0,2,426),('',0,1,0,2,0,2,427),('',0,1,0,2,0,2,432),('',0,1,0,2,0,2,437),('',0,1,0,2,0,2,444),('',0,1,0,2,0,2,445),('',0,1,0,2,0,2,446),('',0,1,0,2,0,2,447),('',0,1,0,2,0,2,449),('',0,1,0,2,0,2,450),('',0,1,0,2,0,2,451),('',0,1,0,2,0,2,452),('',0,1,0,2,0,2,453),('',0,1,0,2,0,2,454),('',0,1,0,2,0,2,455),('',0,1,0,2,0,2,456),('',0,1,0,2,0,2,458),('',0,1,0,2,0,2,459),('',0,1,0,2,0,2,460),('',0,1,0,2,0,2,461),('',0,1,0,2,0,2,462),('',0,1,0,2,0,2,463),('',0,1,0,2,0,2,465),('',0,1,0,2,0,2,469),('',0,1,0,2,0,2,470),('',0,1,0,2,0,2,472),('',0,1,0,2,0,2,473),('',0,1,0,2,0,2,474),('',0,1,0,2,0,2,475),('',0,1,0,2,0,2,476),('',0,1,0,2,0,2,485),('',0,1,0,2,0,2,486),('',0,1,0,2,0,2,492),('',0,1,0,2,0,2,493),('',0,1,0,2,0,2,494),('',0,1,0,2,0,2,495),('',0,1,0,2,0,2,497),('',0,1,0,2,0,2,498),('',0,1,0,2,0,2,501),('',0,1,0,2,0,2,502),('',0,1,0,2,0,2,503),('',0,1,0,2,0,2,504),('',0,1,0,2,0,2,505),('',0,1,0,2,0,2,506),('',0,1,0,2,0,2,507),('',0,1,0,2,0,2,511),('',0,1,0,2,0,2,512),('',0,1,0,2,0,2,513),('',0,1,0,2,0,2,514),('',0,1,0,2,0,2,515),('',0,1,0,2,0,2,516),('',0,1,0,2,0,2,517),('',0,1,0,2,0,2,518),('',0,1,0,2,0,2,519),('',0,1,0,2,0,2,520),('',0,1,0,2,0,2,521),('',0,1,0,2,0,2,522),('',0,1,0,2,0,2,526),('',0,1,0,2,0,2,527),('',0,1,0,2,0,2,541),('',0,1,0,2,0,2,542),('',0,1,0,2,0,2,547),('',0,1,0,2,0,2,548),('',0,1,0,2,0,2,550),('',0,1,0,2,0,2,552),('',0,1,0,2,0,2,563),('',0,1,0,2,0,2,567),('',0,1,0,2,0,2,574),('',0,1,0,2,0,2,585),('',0,1,0,2,0,2,586),('',0,1,0,2,0,2,588),('',0,1,0,2,0,2,589),('',0,1,0,2,0,2,600),('',0,1,0,2,0,2,640),('',0,1,0,2,0,2,641),('',0,1,0,2,0,2,642),('',0,1,0,2,0,2,643),('',0,1,0,2,0,2,644),('',0,1,0,2,0,2,645),('',0,1,0,2,0,2,650),('',0,1,0,2,0,2,651),('',0,1,0,2,0,2,652),('',0,1,0,2,0,2,653),('',0,1,0,2,0,2,654),('',0,1,0,2,0,2,655),('',0,1,0,2,0,2,656),('',0,1,0,2,0,2,657),('',0,1,0,2,0,2,658),('',0,1,0,2,0,2,659),('',0,1,0,2,0,2,660),('',0,1,0,2,0,2,661),('',0,1,0,2,0,2,662),('',0,1,0,2,0,2,663),('',0,1,0,2,0,2,664),('',0,1,0,2,0,2,665),('',0,1,0,2,0,2,666),('',0,1,0,2,0,2,669),('',0,1,0,2,0,2,670),('',0,1,0,2,0,2,671),('',0,1,0,2,0,2,672),('',0,1,0,2,0,2,673),('',0,1,0,2,0,2,674),('',0,1,0,2,0,2,675),('',0,1,0,2,0,2,676),('',0,1,0,2,0,2,677),('',0,1,0,2,0,2,678),('',0,1,0,2,0,2,679),('',0,1,0,2,0,2,680); Link to comment Share on other sites More sharing options...
rvcat Posted August 31, 2015 Share Posted August 31, 2015 (edited) salut, si tu ne connait pas id_stock_available alors il faut mettre null à la place '' car ce n'est pas pareil. '' = chaine vide or id_stock_available est un entier. Ensuite j'ai peur que la boutique fasse une totalisation des lignes. Si tu as un accès système à la base de données, le plus simple est de faire des triggers. after insert sur la table product pour ajouter la ligne dans stock_available pour ajouter la ligne. si tu as des attributs alors aussi dans la table product_attribute before update et before insert dans la table stock_available pour forcer la quantité à 2 si la quantité est <= 2 comme ça même si tu ajoutes un nouveau produit ça se fait tout seul. Edited August 31, 2015 by rvcat (see edit history) Link to comment Share on other sites More sharing options...
rvcat Posted August 31, 2015 Share Posted August 31, 2015 (edited) Pour que la base de données le fasse automatiquement. Et c'est seulement si tu as un accès root à la base de données, sinon tu ne pourras pas mettre les triggers. Trigger after insert pour la table product CREATE DEFINER=`root`@`localhost` TRIGGER `product_after_insert` AFTER INSERT ON `product` FOR EACH ROW BEGININSERT INTO `stock_available` (`id_product_attribute`,`id_shop`,`id_shop_group`,`quantity`,`depends_on_stock`,`out_of_stock`,`id_product`)VALUES (0,1,0,2,0,2,new.id_product); END; trigger before insert sur stock_available CREATE DEFINER=`root`@`localhost` TRIGGER `stock_available_before_insert` BEFORE INSERT ON `stock_available` FOR EACH ROW BEGIN if (coalesce(new.quantity, 0) < 2) then set new.quantity = 2; end if; if (coalesce(new.out_of_stock, 0) < 2) then set new.out_of_stock = 2; end if; END; trigger before update sur stock_available CREATE DEFINER=`root`@`localhost` TRIGGER `stock_available_before_update` BEFORE UPDATE ON `stock_available` FOR EACH ROW BEGIN if (coalesce(new.quantity, 0) < 2) then set new.quantity = 2; end if; if (coalesce(new.out_of_stock, 0) < 2) then set new.out_of_stock = 2; end if; END; Edited August 31, 2015 by rvcat (see edit history) Link to comment Share on other sites More sharing options...
ikoulamathieu Posted September 7, 2015 Share Posted September 7, 2015 Bonjour et merci, Je n'avais pas d'accès root permettant de mettre un trigger pour l'autoincrement, j'ai pris le dernier ID de la base (le plus élevé) J'ai mis à jour manuellement les IDs via Excel des produits pour la requete. Je peux ajouter sans problème un nouveau produit. Merci Cordialement, Link to comment Share on other sites More sharing options...
rvcat Posted September 8, 2015 Share Posted September 8, 2015 voici un requête pour ajouter les produits qui n'existe pas dans la table `stock_available` INSERT INTO `stock_available` (`id_product_attribute`,`id_shop`,`id_shop_group`,`quantity`,`depends_on_stock`,`out_of_stock`,`id_product`)select0,1,0,2,0,2,p.`id_product`from `product` pwhere not exists(select 1 from `stock_available` s where s.`id_product` = p.`id_product`); Link to comment Share on other sites More sharing options...
ikoulamathieu Posted September 13, 2015 Share Posted September 13, 2015 Salut, Super merci beaucoup pour vos réponses. C'est fonctionnel désormais grâce à vos solutions. Cordialement, Mathieu 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