Bonjour,
En effet, le tableau $order->product est utilisé pour mettre à jour la liste des produits d'une commande déjà créée.
Si vous voulez créer une commande tout en fournissant les produits en même temps, vous devez les avoir dans $order->cart->products à la place. HikaShop ajoutera automatiquement l'order_id après que l'entrée de commande a été créée dans la base de données, puis il ajoutera les produits à la base de données.
Un bon exemple de ce qu'il faut faire pour créer une commande avec la fonction save se trouve dans la fonction "createFromCart" dans administrator/components/com_hikashop/classes/order.php.
En fait, vous pourriez simplement créer un panier et y ajouter les produits que vous souhaitez, puis appeler createFromCart avec le cart_id, ce qui générerait la commande pour vous.
Créer un panier est plus simple car vous n'avez pas à vous soucier des prix, taxes, etc. HikaShop calcule tout pour vous en fonction de la situation, donc vous pouvez utiliser la méthode addProduct de la classe.cart.
De plus, assurez-vous de sécuriser les données provenant du post. Vous n'avez pas fourni le code remplissant la variable $post, donc je ne peux pas dire avec certitude s'il y a un problème ou non avec ce que vous avez. Mais en général, nous préférons sécuriser les variables lors de l'écriture des requêtes MySQL. De cette façon, même si le code avant la requête est réorganisé, la requête reste protégée contre les injections SQL.
Par exemple, personnellement, j'écrirais :
$db->setQuery('SELECT price_value FROM #__hikashop_price
WHERE price_users LIKE "%,' . (int)$post['order_user_id'] . ',%"
AND price_product_id = ' . (int)$product_id);
De cette façon, lorsqu'un attaquant injecte du code MySQL dans la valeur POST de order_user_id pour essayer de récupérer des données de votre base de données, cela sera converti en entier et ne perturbera pas la requête MySQL.
Lorsque vous utilisez les fonctions de HikaShop, HikaShop sécurise les attributs de vos objets pour vous, donc vous n'avez pas à le faire. Mais il peut être judicieux de le faire quand même, au cas où nous manquerions quelque chose.
Désolé pour l'Anglais... je viens de réaliser que votre message était en Français ^^;
[Edit:] Traduction refaite dans un second temps.