Jump to content

Edit History

Janett

Janett

22 hours ago, PtitKev said:

L'erreur se situe dans la classe Cart, méthode duplicate(). La requête SQL remplissant la variable $product_gift est fausse.


SELECT cr.`gift_product`, cr.`gift_product_attribute`
FROM `'._DB_PREFIX_.'cart_rule` cr
LEFT JOIN `'._DB_PREFIX_.'order_cart_rule` ocr ON (ocr.`id_order` = '.(int)$this->id.')
WHERE ocr.`id_cart_rule` = cr.`id_cart_rule`

On peut noter que le LEFT JOIN et le WHERE sont incompatible mais l'erreur vient surtout de la condition de la jointure : "id_order" = "id_cart".

Sachant que dans un objet Cart on je fait jamais référence à une commande, la seule façon de trouver un "id_order" pour la table "order_cart_rule" est de passer par la table "orders".

J'ai donc reconstruit la requête de cette façon :


SELECT cr.`gift_product`, cr.`gift_product_attribute`
FROM `'._DB_PREFIX_.'orders` o
INNER JOIN `'._DB_PREFIX_.'order_cart_rule` ocr ON o.`id_order` = ocr.`id_order`
INNER JOIN `'._DB_PREFIX_.'cart_rule` cr ON ocr.`id_cart_rule` = cr.`id_cart_rule`
WHERE o.`id_cart` = '.(int)$this->id

J'ai constaté que le champ orders.id_cart n'avait pas d'index unique donc cette solution n'est pas, dans l'absolue, la bonne mais vu qu'on valide l’existence d'une commande pour un panier donné je considère qu'elle fera l'affaire :)

Comme disent les anglais : "et voilà !"

Dans la 1.7 cela a apparemment été corrigé : https://github.com/PrestaShop/PrestaShop/pull/8498

Janett

Janett

22 hours ago, PtitKev said:

L'erreur se situe dans la classe Cart, méthode duplicate(). La requête SQL remplissant la variable $product_gift est fausse.


SELECT cr.`gift_product`, cr.`gift_product_attribute`
FROM `'._DB_PREFIX_.'cart_rule` cr
LEFT JOIN `'._DB_PREFIX_.'order_cart_rule` ocr ON (ocr.`id_order` = '.(int)$this->id.')
WHERE ocr.`id_cart_rule` = cr.`id_cart_rule`

On peut noter que le LEFT JOIN et le WHERE sont incompatible mais l'erreur vient surtout de la condition de la jointure : "id_order" = "id_cart".

Sachant que dans un objet Cart on je fait jamais référence à une commande, la seule façon de trouver un "id_order" pour la table "order_cart_rule" est de passer par la table "orders".

J'ai donc reconstruit la requête de cette façon :


SELECT cr.`gift_product`, cr.`gift_product_attribute`
FROM `'._DB_PREFIX_.'orders` o
INNER JOIN `'._DB_PREFIX_.'order_cart_rule` ocr ON o.`id_order` = ocr.`id_order`
INNER JOIN `'._DB_PREFIX_.'cart_rule` cr ON ocr.`id_cart_rule` = cr.`id_cart_rule`
WHERE o.`id_cart` = '.(int)$this->id

J'ai constaté que le champ orders.id_cart n'avait pas d'index unique donc cette solution n'est pas, dans l'absolue, la bonne mais vu qu'on valide l’existence d'une commande pour un panier donné je considère qu'elle fera l'affaire :)

Comme disent les anglais : "et voilà !"

Dans la 1.7 cela a apparemment été corrigé : https://github.com/PrestaShop/PrestaShop/commit/c5bcfff59ce3f3b94afbf609e08daa6179e5d6d9

×
×
  • Create New...