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é.
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
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 }}
É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>
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 }}
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>';
}