計算された商品価格を「商品バリエーション」選択ウィジェットと「支払い」ボタンの間に入れたいのですが。
commerce-product.html.twig
(私の製品には、製品自体にカートへの追加フォームが表示されます)、次のコードがあります。
<article{{ attributes }}>
<h2>{{ product.title }}</h2>
{{ product|without('title', 'variation_price' }}
{{ product.variation_price }}
</article>
variation_price
は計算された価格です。
私は デバッグに少し似ていますが、私のサイトを壊しました (そして、このサイトの人々はそれを修正する方法を親切に説明しました。)それで、バリエーションを示すウィジェットを含む変数の名前がproduct.variations、これは実際には「カートに追加」フォームです(UIで表示ウィジェットを設定しているため)。
したがって、「カートに追加」フォームを2回印刷する必要があると思います。1つのインスタンスでは送信ボタンを表示し、もう1つのインスタンスでは選択ウィジェットを表示します...しかし、どうすればよいですか?
twigデバッグテーマの提案を確認しましたが、「カートに追加」フォームのテンプレートが表示されません。
<!-- 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
これは私がこの問題を修正した方法です:
この前処理関数を.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();
}
私のtwigファイルに、次のように価格を出力します:
{{ price|commerce_price_format }}
「カートに追加」フォームは製品バリエーションにバンドルされているので、commerce-product.html.twigテンプレートで以下を使用して機能させています。
<article{{ attributes }}>
{{ product.title }}
{{ product.body }}
{{ product.variation_price }}
{{ product.variations }} // show the add to cart button
</article>
カスタム属性を追加していて、twigでそれらの値にアクセスする場合は、受け入れられた回答に従い、theme/module_preprocess_templateから次のようなkintでデバッグすることをさらに追加します。
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()");
次に、変数への値の割り当てに進みます。
$variables['my_target_attribute'] = $product->getVariations()[0]->getAttributeValue('my_target_attribute')->getName();
その後、twig/templateでmy_target_attributeを次のように印刷できます。
{{ my_target_attribute }}
twigテンプレートでこれを行う方法を理解できませんでしたが、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>';
}