web-dev-qa-db-fra.com

Comment imprimer la variante du produit séparément du bouton Soumettre / Payer dans un formulaire Commerce Ajouter au panier?

Je veux mettre le prix calculé du produit entre le widget de sélection "variation de produit" et le bouton "payer".

Dans commerce-product.html.twig (mes produits affichent un formulaire d'ajout au panier sur le produit lui-même), j'ai ce code:

<article{{ attributes }}>
  <h2>{{ product.title }}</h2>
  {{ product|without('title', 'variation_price' }}
  {{ product.variation_price }}
</article>

variation_price est le prix calculé.

  1. Quel est le nom de la variable qui contient le widget de sélection de variation de produit? Réponse: variations.produit
  2. Comment puis-je placer le bouton soumettre/payer séparément du widget de sélection du type de variation? Réponse: ??

J'ai essayé d'utiliser kint pour déboguer mais cela a cassé mon site. (Et puis les gens sur ce site ont gentiment expliqué comment le réparer.) Donc je comprends maintenant que la variable contenant le widget qui montre les variations est nommée product.variations , et c'est en fait le formulaire "Ajouter au panier" (puisque c'est à cela que je règle le widget d'affichage dans l'interface utilisateur).

Donc, je suppose que je dois imprimer le formulaire "Ajouter au panier" deux fois, et dans un cas afficher le bouton soumettre, et dans l'autre exemple afficher le widget de sélection ... Mais comment dois-je faire?

J'ai regardé le twig suggestions de thème de débogage mais elles ne me donnent pas de modèle pour le formulaire "Ajouter au panier":

<!-- FILE NAME SUGGESTIONS:
   * field--commerce-product--variations--contenttype.html.twig
   * field--commerce-product--variations.html.twig
   * field--commerce-product--contenttype.html.twig
   * field--variations.html.twig
   * field--entity-reference.html.twig
   x field.html.twig
3
Patrick Kenny

Voici comment j'ai résolu ce problème:

Ajout de cette fonction de prétraitement dans mon fichier .theme

function YOURTHEME_preprocess_commerce_product(&$variables) {

   // Get the commerce product.
   $product = $variables['elements']['#commerce_product'];
   // Pass the price.
   $variables['price'] = $product->variations->entity->getPrice();
}

Et dans mon fichier twig j'imprime le prix comme ceci:

{{ price|commerce_price_format }}
4
Fons Vandamme

Étant donné que le formulaire d'ajout au panier est fourni avec les variantes de produit, je le fais fonctionner en utilisant les éléments suivants dans mon modèle commerce-product.html.twig.

<article{{ attributes }}>
      {{ product.title }}
      {{ product.body }}
      {{ product.variation_price }}
      {{ product.variations }}  // show the add to cart button
</article>
1
flamesquirrel

J'ajouterais en outre que si vous ajoutez des attributs personnalisés et souhaitez accéder à ces valeurs dans twig, suivez la réponse acceptée et déboguez avec kint comme ceci depuis votre thème/module_preprocess_template:

  ksm($product,'shows that we have one product to examine - notice array (1)');
  ksm($product->getVariationIds(),'this is $product->getVariationIds()');
  ksm($product->getVariations()[0]->getAttributeValues(),'this is $product->getVariations()[0]->getAttributeValues()'); 
  ksm($product->getVariations()[0]->getAttributeFieldNames(),' this is $product->getVariations()[0]->getAttributeFieldNames()'); 
  ksm($product->getVariations()[0]->getAttributeValue('my_target_attribute')->getName(),"found value at \$product->getVariations)[0]->getAttributeValue('my_target_attribute')->getName()");

Procédez ensuite à l'attribution d'une valeur aux variables:

$variables['my_target_attribute'] = $product->getVariations()[0]->getAttributeValue('my_target_attribute')->getName();

Vous seriez alors en mesure d'imprimer my_target_attribute dans votre brindille/modèle en tant que:

{{ my_target_attribute }}
1
vrwired

Je ne pouvais pas comprendre comment faire cela dans un modèle twig, mais cela peut être fait dans hook_form_alter():

/**
 * Implements hook_form_FORM_ID_alter().
 * If necessary, you can target specific products like this:
 * (product with ID of 2)
 * function MYMODULE_form_commerce_order_item_add_to_cart_form_commerce_product_2_alter(array &$form, FormStateInterface $form_state, $form_id) {
 */
function MYMODULE_form_commerce_order_item_add_to_cart_form_alter(array &$form, FormStateInterface $form_state, $form_id) {
  // Text shown between variations widget and submit buttons.
  $form['placeholder']['#markup'] = '<p>' . t('This is my message.') . '</p>';
}
0
Patrick Kenny