[Résolu] Associer deux produits Drupal Commerce

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour,

Je développe actuellement une boutique via le module Drupal Commerce sur la version 7.12 de Drupal.

Mon cahier des charges veut que deux produits distincts soient vendus ensemble.

Voilà la relation que je souhaite mettre en place :

-> des produits
-> des options

Les options peuvent concerner plusieurs produits différents, mais elles ne concerne pas tous les produits. C'est pourquoi je souhaite les considérer comme des produits à part entière (les options pourront être vendues à part, mais pas de souci la dessus).

J'arrive à lier les deux produits via les « références produit » mais lors de l'affichage, j'ai deux boutons distincts « ajouter au panier » alors que je n'en souhaiterai qu'un seul, pour considérer l'ensemble comme une entité.

Connaissez vous des solutions pour gérer ce type de situation sans avoir à gérer pour chaque produit les options possibles ?
La modification d'une option doit se répercuter sur tous les produits offrant cette option, d'où le souhait de créer des produits et des options distinctement.

Tout avis est le bienvenue... :)

Version de Drupal : 

Je suis en train de bosser aussi sur Drupal commerce, ce que je fais c'est un Types de produits avec des options que tu peux (ou pas parfois ) afficher sur le formulaire d'ajout au panier. Si tu n'arrive pas a afficher le module Option set peut t'intéressé, une sorte d'entité référence pour avoir des options (si j'ai bien tout compris ^^). Ensuite tu as t'es produits que tu peux lier. Pour cela tu créé un nouveau noeud node/add/produit et dans les références de produits tu met les produits que tu veux combiner. Après mois je n'ai qu'un bouton ajouter au panier par node.
Mais j'avous me mélanger encore pas mal les pinceaux

Bonjour,

Merci pour cette réponse. :)
Malheureusement je n'arrive pas à aboutir à quelque chose.
Si j'ai bien suivi ta démarche, tu définis des types de produit dans le module Commerce, puis tu crées un node de type « Produit » dans lequel tu définis plusieurs produits (du module Commerce) dans le champ « Produit » du node.

Pour ma part, quand j'exploite cette possibilité, j'arrive à utiliser un produit dans la node, mais quand j'en ajoute un second (pour lier les deux produits), j'ai une erreur.

Warning : array_flip() [function.array-flip]: Can only flip STRING and INTEGER values! dans DrupalDefaultEntityController->load() (ligne 178 dans C:\wamp\www\drupal\includes\entity.inc).

Du coup, la node affiche seulement le premier produit, et refuse de prendre en compte plusieurs produits...
Quand tu déclares les produits dans la node, tu arrives à lui donner plusieurs produits différents ?!
Je vais continuer à creuser dans ce sens.

Lorsque je tente de faire la même manipulation (créer une node "Product Display" qui contient plusieurs produit (issu de la boutique) différents) sous Commerce Kickstart, j'obtiens la même erreur que sous Drupal Commerce...

Warning : array_flip() [function.array-flip]: Can only flip STRING and INTEGER values! dans DrupalDefaultEntityController->load() (ligne 178 dans C:\wamp\www\commerce_kickstart-7.x-1.6-core\commerce_kickstart-7.x-1.6\includes\entity.inc).
Warning : array_flip() [function.array-flip]: Can only flip STRING and INTEGER values! dans DrupalDefaultEntityController->load() (ligne 178 dans C:\wamp\www\commerce_kickstart-7.x-1.6-core\commerce_kickstart-7.x-1.6\includes\entity.inc).

Je sèche complètement :/

Hum, parfois les choses me dépassent.

J'utilise Entity API 7.x-1.0-rc1, j'ai vu que la version 7.x-1.0-rc2 était disponible depuis hier. Entre temps en bidouillant, j'ai eu une erreur provenant du module Product Display. Je l'ai viré et je ne sais pas si c'est grâce à ça ou pas, mais mon erreur a disparue..!

Cependant, je peux donc créer une node d'un type de contenu aillant un champ "référence produit" auquel j'attribue plusieurs produits, mais j'obtiens par défaut une liste de sélection. Drupal me propose de choisir entre les produits que je lui passe dans le champ "référence produit" et je n'arrive pas à obtenir ce que je souhaite : avoir l'affichage des deux produits et qu'un seul bouton "ajout panier" ajoute les deux produits...

Effectivement du coup, pour revenir à la première réponse, je n'ai qu'un seul bouton "Ajout panier" par node, mais ça ne répond pas exactement à ce que je souhaitais.
Je pense que c'est interne au fonctionnement du module Commerce et je doute que ce soit donc possible.. Même avec Views ou quoi que ce soit, je ne vois pas comment faire.

Dilemme, creuser le module Commerce pour voir son fonctionnement, ça fait un peu peur je dois avouer. ^^

Si si ca doit etre possible ca ! il faut vérifie du coté de la node qu'il te génère ce que tu a dans le code.

<?php
 dsm
($node)
?>

et regarde ce que tu a comme infos mais l'ayant deja un peu traficoté je peut déjà te dire que chacun de tes deux produits sont bien séparer dans le code sous forme de [product:ton champ]

Sinon va directement voir dans le forum de drupal commerce ils ont une communauté réactive aussi et plus experte sur le sujet. Quoi qu'il en soit ton probléme m’intéresse fait le moi savoir si tu a une solution.

Tu veux dire exécuter « dsm($node) » dans la node ?
Quand je le fais, il m'affiche : « Notice : Undefined variable: node dans eval() (ligne 2 dans C:\wamp\www\drupal\modules\php\php.module(80) : eval()'d code). »

Et quand je l'exécute via l'exécuteur de code du module Devel il me renvoi :
« Parse error: syntax error, unexpected $end in C:\wamp\www\drupal\sites\all\modules\devel-7.x-1.2\devel\devel.module(1202) : eval()'d code »
Ainsi qu'un gros bloc html.

J'aimerai bien pouvoir retrouver le bout de code qui génère l'affichage !

J'ai quand même laissé un message sur les forums de Drupal Commerce, je donnerai des nouvelles (bonnes j'espère !). :)

mmm bon laisse tombé le dsm node, mais si je te suis bien pourquoi tu fai pas un noeaud par avec UNE référence par produit.
Tu as aussi un module je crois commerce cart extra qui s'interface avec views, tu peut faire une vue avec des quantités et 1 bouton d'ajout. Après tu peux toujours te faire une page custome avec formulaire custom dans ton module custom (c'est ce que j'ai fais au final) mais ça requiert quelques connaissance en dev Drupal; comme le dsm ne ta pas réussis....

Le module Commerce Cart Extra améliore juste la gestion de la quantité.. Pour faire clair, voilà ce que je souhaite moi, avoir un affichage comme ça :

Type produit 1
x produit 1 - 1
x produit 1 - 2
x produit 1 - 3

Quand l'utilisateur choisi un produit de type 1, il s'affiche alors la liste des produits de type 2 correspondant au produit 1 choisi.

Type produit 2
x produit 2 - 1
x produit 2 - 2
x produit 2 - 3

Ajout Panier

Une fois donc le produit 1 choisi, puis le produit 2 choisi, un clic sur le seul bouton "ajout panier" ajouter les deux produits en même temps au panier.
Je ne pense pas que ce soit initialement possible dans Drupal Commerce, parce que j'ai tout essayé. ^^

Quant au dev Drupal je vais devoir m'y mettre si je souhaite parvenir à mes fins.. Auriez vous des conseils pour débuter ? De bons tutos peut être ?

Si je comprend bien tu cherche a faire ce que j'ai mit en Piece jointe ? 3 produit distinct disponible pour 1 seul node et en fonction de celui que je choisit dans ma liste il ajoute le bon produit. Donc 1 node 1 ajouter 3 produit. ( Le dsm n’était pas inutile c'est qu'il y en a des choses dans ses variable $node & $content ... utile ).
Es-que c'est bien ca ?

http://img11.hostingpics.net/pics/809460Sanstitre.png

Non, en fait dans ton cas, le bouton "ajout" n'ajoute au panier que le produit sélectionné.
Moi je voudrais quelque chose comme ça :
http://img11.hostingpics.net/pics/151039Sanstitre.jpg

Un premier produit, et une liste des produits qui peuvent être acheté avec !
Je souhaite à avoir exactement l'affichage que j'ai sur la pièce jointe, sauf que je voudrais un seul bouton "Ajout panier" au lieu des deux, qui ajoute au panier en même temps le premier produit et le second produit (choisis dans la liste)...

Je viens aux nouvelles...

J'ai plus ou moins deux solutions possibles..
La première c'est l'utilisation de Rules. Il faudrait arriver à définir un trigger « Après ajout au panier » qui ajoute automatiquement le second produit. J'ai réussi à le faire sans problème dans le cas général, par contre il faudrait dans mon cas récupérer l'id du second produit sélectionné et le passer en paramètre.. Ça a l'air assez lourd et pas très propre.

La seconde solution, c'est de surcharger la fonction d'ajout au panier...
j'ai trouvé le hook :
function hook_commerce_cart_product_add($order, $product, $quantity, $line_item)

Et la fonction que je pense responsable du bouton :
commerce_cart_add_to_cart_form ($form, &$form_state, $line_item, $show_quantity = FALSE, $context = array())

Par contre, pour la seconde solution, je ne sais pas si c'est possible, et le cas échéant par où commencer...

Amis développeurs pourriez vous me donner votre avis ? C'est possible ?

le hook product add est à creuser, cependant pour la form commerce cart add j'ai essayé de l'utilisé et j'avais des comportement bizarre voir bugué. tu peux toujours faire ton formulaire toi même (ca tu devrais trouver pas mal de tuto dessus) mais ça prend un peut de temps. Sinon tu peux toujours tenter d'ajouter ta fonction de submit via un hook form alter, puis dans ta fonction de submit tu fais ton traitement

Je vais essayer de faire mon propre formulaire.
Je pense que c'est le plus raisonnable pour moi, en espérant trouver de bons tutos.
Pour ce qui est du temps, j'en ai suffisamment, pas de souci la dessus.

Par contre, j'espère que l'intégration d'un bouton submit d'ajout au panier est prévu dans l'api des formulaires !

Hum, juste pour revenir sur tes propositions, le commentaire de l'API Drupal Commerce concernant le hook_commerce_cart_product_add est : « Rules event hook: allows modules to react to the addition of a product to a shopping cart order. »
Je ne pense qu'il soit possible (ou très difficilement) de récupérer un second produit à ajouter, puis de l'ajouter, étant donné que le hook se déclenche apparemment après l'évènement d'ajout au panier...

Je suis plutôt intéressé par la création d'un module formulaire, mais pourrais-je intégrer un bouton « Ajout au panier » ? J'imagine que ce n'est pas prévu par l'API de Drupal étant donné que Drupal ne dispose pas d'une telle fonction.
Parallèlement, l'API Drupal Commerce ne permet pas de créer de formulaire...
J'avoue être un peu largué, avant de me lancer dans un développement, j'aimerai bien être sur de la possibilité de réussir.

Thomas.emerya :
Étant donné que tu es apparemment parvenu à tes fins, pourrais-tu me résumer par étape ta façon de procéder ?!

En fait je créer mon formulaire normale que je peuple avec ma requête qui va récupérer ce que j'ai besoin (en l'ocurence mes produits) Pour voir comment créer un formulaire, sur Drupal org tout y est : http://drupal.org/node/751826
Si tu est déjà à l'aise avec le concept tu peut te servir de notre générateur de code :
http://www.drupalons.fr/generation-code-drupal/g%C3%A9n%C3%A9rer-un-%C3%... => un peut useless mais car ne fait qu'un champs
http://drupalons.fr/form-builder-example qui est un module plus intéressant que tu peut installer chez toi aussi réalise du code de formulaire via une UI wysiwyg
Ensuite l'ajout au panier je le fais à la main, via les fonctions de drupal commerce notament commerce_cart_product_add_by_id() auquel t'envoi l'id du product. Je te met également quelques fonction que j'ai utiliser et qui peuvent être utile
$order = commerce_cart_order_load($user->uid); => charge la commande d'un user
commerce_cart_order_empty($order); => vide ton panier
commerce_order_save($order);=> sauve ta commande
commerce_line_item_save/load($lineItem); => sauvegarde/charge ta line iteme.

Parfait. J'ai enfin aboutit à quelque chose de concret. Je te remercie.
J'ai créé un module et un formulaire. Prochaine étape : récupérer les données de la base pour alimenter le formulaire dynamiquement.

Je vais me documenter mais si jamais vous avez des liens ou des exemples intéressants, encore une fois je suis preneur. ^_^

Hum, je reviens vers vous pour un problème pour alimenter dynamiquement le formulaire.
J'ai aucun souci pour créer un formulaire riche, pour ajouter des données à la base.. Par contre je n'arrive pas à récupérer les données (les produits que je veut) et à créer un formulaire à partir de ça...

L'idée, c'est récupérer le résultat de ma requête dans une variable, et faire un foreach pour créer autant de case à cocher / boutons radios qu'il y a de résultat dans la variable.
Malheureusement, l'api est très vaste et je me perds entre la doc en anglais et les exemples des utilisateurs, les versions etc... J'ai vu toute sorte de chose (des fetchField etc...) et je ne sais pas quoi utiliser pour que ça fonctionne.

Impossible de trouver un exemple qui fonctionne !

Vous pourriez me montrer un exemple de récupération d'une requête dans une variable puis d'un traitement de la variable dans une boucle pour afficher des case à cocher par exemple ? Ça m'aiderait à avancer, je bloque la dessus, impossible de faire fonctionner ça !

Arf j'ai fini par m'en sortir, même si ce fut difficile.
Je maintiendrais que l'api drupal est pas super super bien foutu, y'a de l'information de partout, qui parfois se contredit... Enfin bref.

Merci beaucoup pour votre aide, je pense que je devrais pouvoir m'en sortir jusqu'au bout.
Il ne me reste qu'à maitriser les fonctions d'ajout comme commerce_cart_product_add_by_id() j'espère que ça posera pas trop de souci. Un grand merci vraiment. :)

Aïe, je crains d'avoir parlé un peu vite...
Impossible de faire l'ajout au panier commerce_cart_product_add_by_id().
J'utilise la fonction dans ma fonction function mymodule_form_submit($form, &$form_state) que j'ai trouvé sur Internet, et je reçois comme erreur quand je submit mon formulaire : "Un choix interdit a été détecté. Veuillez contacter l'administrateur du site."

J'ai pas trouvé de doc sur la fonction _form_submit, c'est bien celle-là qu'il faut utiliser pour valider le formulaire ?