Jump to content

Impossible d'ajouter des articles dans le panier


Recommended Posts

Bonjour,

 

Je rencontre quelques soucis concernant l'utilisation du panier. Il n'est pas possible d'y ajouter des articles depuis le frontoffice.

Après plusieurs investigations, il semblerait qu'une requête SQL soit à l'origine du problème.

En effet, j'ai environ 1.600 produits dans la base avec un total de 20.000 de déclinaisons. Or, la requete permettant d'ajouter des articles dans le panier fait 2/3 jointure sur ces 20.000 déclinaisons ce qui entraine une requête tout simplement impossible à résoudre dans un délai raisonnable (plus d'une dizaine de minutes sur un core i7).

Bref, y a-t-il un moyen de contourner ce problème en optimisant la base de données ? le code ? la requete ?

Sachant que je suis en v1.5.1.0, la prochaine version prévoit-elle de résoudre ce problème ?

Sinon, vaut-il mieux que je me tourne vers une version antérieur ?

 

Merci d'avance !

 

P.S. Voici la superbe requête

 

SELECT cp.`id_product_attribute`, cp.`id_product`, cp.`quantity` AS cart_quantity, cp.id_shop, pl.`name`, p.`is_virtual`,
		pl.`description_short`, pl.`available_now`, pl.`available_later`, p.`id_product`, product_shop.`id_category_default`, p.`id_supplier`,
		p.`id_manufacturer`, product_shop.`on_sale`, product_shop.`ecotax`, product_shop.`additional_shipping_cost`, product_shop.`available_for_order`, product_shop.`price`, p.`weight`,
		stock.`quantity` quantity_available, p.`width`, p.`height`, p.`depth`, stock.`out_of_stock`, product_shop.`active`, p.`date_add`,
		p.`date_upd`, t.`id_tax`, tl.`name` AS tax, t.`rate`, IFNULL(stock.quantity, 0) as quantity, pl.`link_rewrite`, cl.`link_rewrite` AS category,
		CONCAT(cp.`id_product`, cp.`id_product_attribute`, cp.`id_address_delivery`) AS unique_id, cp.id_address_delivery,
		product_shop.`wholesale_price`, product_shop.advanced_stock_management,
0 AS customization_quantity, 0 AS id_customization,

	product_attribute_shop.`price` AS price_attribute, product_attribute_shop.`ecotax` AS ecotax_attr,
	IF (IFNULL(pa.`reference`, '') = '', p.`reference`, pa.`reference`) AS reference,
	IF (IFNULL(pa.`supplier_reference`, '') = '', p.`supplier_reference`, pa.`supplier_reference`) AS supplier_reference,
	(p.`weight`+ pa.`weight`) weight_attribute,
	IF (IFNULL(pa.`ean13`, '') = '', p.`ean13`, pa.`ean13`) AS ean13,
	IF (IFNULL(pa.`upc`, '') = '', p.`upc`, pa.`upc`) AS upc,
	pai.`id_image` as pai_id_image, il.`legend` as pai_legend,
	IFNULL(product_attribute_shop.`minimal_quantity`, product_shop.`minimal_quantity`) as minimal_quantity

FROM `cart_product` cp
LEFT JOIN `product` `p` ON p.`id_product` = cp.`id_product`
INNER JOIN `product_shop` product_shop ON product_shop.id_shop=1
LEFT JOIN `product_lang` `pl` ON
  p.`id_product` = pl.`id_product`
  AND pl.`id_lang` = 5 AND pl.id_shop = 1
LEFT JOIN `tax_rule` `tr` ON
  product_shop.`id_tax_rules_group` = tr.`id_tax_rules_group`
  AND tr.`id_country` = 8
  AND tr.`id_state` = 0
  AND tr.`zipcode_from` = 0
LEFT JOIN `tax` `t` ON t.`id_tax` = tr.`id_tax`
LEFT JOIN `tax_lang` `tl` ON
  t.`id_tax` = tl.`id_tax`
  AND tl.`id_lang` = 5
LEFT JOIN `category_lang` `cl` ON
  product_shop.`id_category_default` = cl.`id_category`
  AND cl.`id_lang` = 5 AND cl.id_shop = 1
LEFT
  JOIN stock_available stock
  ON (stock.id_product = cp.id_product AND stock.id_product_attribute = IFNULL(`cp`.id_product_attribute, 0) AND stock.id_shop = 1  )
LEFT JOIN `product_attribute` `pa` ON pa.`id_product_attribute` = cp.`id_product_attribute`
LEFT JOIN `product_attribute_shop` `product_attribute_shop` ON product_attribute_shop.id_shop=1
LEFT JOIN `product_attribute_image` `pai` ON pai.`id_product_attribute` = pa.`id_product_attribute`
LEFT JOIN `image_lang` `il` ON il.id_image = pai.id_image AND il.id_lang = 5
WHERE (cp.`id_cart` = 1) AND (p.`id_product` IS NOT NULL)
GROUP BY unique_id
ORDER BY p.id_product, cp.id_product_attribute, cp.date_add ASC

Edited by jpopcenter (see edit history)
Link to comment
Share on other sites

Finalement, je pense que la jointure sur 'product_attribute_shop' est un peu vague. Du coup, en remplaçant la ligne 507 du fichier classes/Cart.php de

$sql->leftJoin('product_attribute_shop', 'product_attribute_shop', 'product_attribute_shop.id_shop='.$id_shop);

par

$sql->leftJoin('product_attribute_shop', 'product_attribute_shop', 'product_attribute_shop.id_shop='.$id_shop.' AND product_attribute_shop.id_product_attribute = pa.`id_product_attribute`');

ça semble un poil plus futé :)

 

Quelqu'un de chez vous pourrais proposer le patch sur le BT ?

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