Cawet Posted January 20, 2016 Share Posted January 20, 2016 (edited) Bonjour, J'ai surcharger l'import de produit, affin d'ajouter automatiquement des combinaison d’attributs au produits. Je vous passe le principe du mécanisme, mais au final, c'est entre 100 et 500 combinaison qui sont ajouter a chaque produits, avec chacune des références et des prix spécifiques. en gros, voici l'algorithme - Pour chaque ligne de produit du fichier CSV, -> je constitue la liste des combinaisons du produit courant - Pour chaque combinaisons de ce produit -> j'insert la combinaison dans la BDD. 1er approche pour l'insertion, je fait quelque chose comme ceci : $combi = new Combination(); $combi->id_product = $idProduct; $combi->price = $price $combi->reference = $reference; $combi->add(); $combi->setAttributes([$idAttribute01, $idAttribute02, [etc...]]); Sa fait son taf sans histoire. Mais avec 2 requêtes par combinaison, si j'ai 200 combinaison, sa fait 400 requetes ... super lourd. 2eme approche: Il y a deux requête par combinaisons car il y a deux table. $combi->add(); -> insert dans la table "product_attribute" $combi->setAttributes(...) -> insert dans la table "product_attribute_combinaison". Je constitue donc deux tableau : $productAttributes[] = [ 'id_product'=>$idProduct, 'price'=>$price, 'reference'=>$reference, ]; $combinaisons = [$attribute01, $attribute02,...]]; Puis j'insert le tout avec seulement 3 requêtes. //insertion dans la table product_attribute Db::getInstance()->insert('product_attribute', $productAttributes); //récupération des id insérés pour les injecter en suite dans product_attribute__combinaison ( $query = new DbQuery(); $query->select('*') ->from('product_attribute', 'pa') ->where('pa.id_product = '.(int)$productAttributes[0]['id_product']); $productAttributes = $rs = Db::getInstance()->executeS($query); $productAttribute_combinaisons = []; foreach($productAttributes as $i => $pa){ foreach($combinaisons[$i] as $idAttribute){ $productAttribute_combinaisons[] = [ 'id_product_attribute' =>(int)$pa['id_product_attribute'], 'id_attribute'=>(int)$idAttribute ]; } } // et on insert dans product_attribute_combination Db::getInstance()->insert('product_attribute_combination',$productAttribute_combinaisons); je n''ai donc plus que 3 requêtes, au lieux de 400, bravo moi! sauf que je n'utlise ni la méthode Combinaison->add, ni la méthode Combinaison->addAttributes, qui contienne quelque routine pour géré les stock , les prix, certain hook... et qui me faut donc les reproduire, et je peut donc dire adieu a la possiblité de mettre a jour le projet. n'y aurai t'il pas une 3eme possibilité ? C'est dommage je trouve le core de prestashop pas assez segmenter, il y a des fonction qui font 500 ligne... Toute les méthode de la class Product permettants de faire sa sont "deprecated". De toute façons en regardant le code, c'est la même chose que la 1er solution ^^. EDIT: je pense que je pourrai avoir un énorme gain de performance si je pouvais envoyé toute les requêtes d'un coup. Un peut comme avec le flush du Manager de doctrine.Peut on faire pareille avec la class Db ? stocker les requêtes puis les balancé toute d'un coup ? Edited January 20, 2016 by Cawet (see edit history) 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