Créer une grille de produits Commerce référencés
J'utilise Drupal 7 avec Commerce 1.x et j'ai créé un type de contenu avec un champ de référence pour les entités Commerce Product.
Et maintenant, je voudrais rendre une grille de produits référencés, c'est-à-dire un formulaire d'ajout au panier dédié pour chaque produit sur la page du nœud.
Au moins jusqu'à présent, cela semble être une tâche impossible à faire. J'ai essayé avec Views, une variable de modèle de formulaire personnalisé, etc. mais cela donne toujours des erreurs comme
Remarque: index non défini: #options dans la fonction form_process_radios () (ligne 3188
Le paramètre doit être un tableau ou un objet qui implémente Countable dans la fonction form_process_radios () (rivi 3188
D'une manière ou d'une autre, il attend toujours un élément radio avec des options (qui est le formatage par défaut) pour plusieurs produits. Cependant, ce n'est pas ce que je veux et j'ai essayé de le définir comme élément caché. Je peux aussi voir les formulaires mais je voudrais me débarrasser des erreurs et créer ceci "par le livre".
<?php
function mymodule_preprocess_entity(&$variables) { $variables['add_to_cart_form'] = '';
if ($variables['elements']['#entity_type'] == 'commerce_product'){ $item = $variables['elements']['#entity']; if (empty($item->product_id)) {
return;
}
$form_id = commerce_cart_add_to_cart_form_id([$item->product_id]);
$line_item = commerce_product_line_item_new($item, 1, 0, [], 'custom_owner');
$line_item->commerce_product = $item->product_id;
$line_item->data['context']['product_ids'] = array($item->product_id);
$line_item->data['context']['show_single_product_attributes'] = 1; $product_form = drupal_get_form($form_id, $line_item);
// Trying to change from radio element to hidden
$product_form['product_id']['#type'] = 'hidden'; unset($product_form['product_id']['#theme_wrappers']);
unset($product_form['product_id']['#process']); $form_markup = drupal_render($formp); $variables['add_to_cart_form'] = array('#markup' => $form_markup);
}
}?>
Réponses
Ceci est possible dès la sortie de la boîte sans aucun code personnalisé, juste des vues simples. L'astuce consiste à créer la vue en fonction du contenu de votre type de nœud et à définir une relation entre le nœud et les produits référencés par son champ de référence de produit. Une fois que vous avez des champs de produit disponibles pour la vue, Commerce 1.x fournit un champ de formulaire Ajouter au panier par variante à déposer dans la vue.
J'ai créé un exemple de vue qui fait cela, en le plaçant dans un bloc sur les pages de nœuds du type de nœud d'affichage de mon produit. Il utilise un filtre contextuel pour déterminer l'ID de nœud à partir de l'URL, se joint aux produits via la relation que j'ai décrite ci-dessus, puis affiche le titre du produit, le prix et le formulaire Ajouter au panier dans une grille:
Notez que les éléments de ligne ajoutés via les formulaires Ajouter au panier du produit ne conservent pas le contexte du nœud; c'est pourquoi "Product Three" est rendu sous forme de lien dans mon panier, mais Two and One ne le sont pas. Il faudrait un code personnalisé pour s'assurer que ces formulaires ont le contexte approprié à ce stade, mais c'est une autre question.
Si vous êtes un apprenant visuel, voici la vue que j'ai construite pour que cela fonctionne: