Как распечатать вариант продукта отдельно от кнопки "Отправить/оплатить" в форме "Добавить в корзину"?
Я хочу поместить рассчитанную цену продукта между виджетом "выбор варианта продукта" и кнопкой "оплатить".
В commerce-product.html.twig
(мои товары отображают форму добавления в корзину на самом товаре) у меня есть этот код:
<article{{ attributes }}>
<h2>{{ product.title }}</h2>
{{ product|without('title', 'variation_price' }}
{{ product.variation_price }}
</article>
variation_price
является расчетной ценой.
- Как называется переменная, содержащая виджет выбора варианта продукта? Ответ: продукт.варианты
- Как я могу разместить кнопку отправить/оплатить отдельно из виджета выбора типа вариации? Ответ: ??
Я попытался использовать kint для отладки, но он сломал мой сайт. (А затем люди на этом сайте любезно объяснили, как это исправить.) Поэтому теперь я понимаю, что переменная, содержащая виджет, который показывает варианты, называется product.variations, и это на самом деле форма "Добавить в корзину" (так как я установил виджет отображения в пользовательском интерфейсе).
Поэтому, я думаю, мне нужно распечатать "Добавить в корзину" сформируйте форму дважды, и в одном случае отобразите кнопку "Отправить", а в другом - виджет "Выбрать"... Но как мне это сделать?
Я просмотрел предложения по теме отладки 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
4 answers
Вот как я исправил эту проблему:
Добавлена эта функция предварительной обработки в мой файл .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, следуйте принятому ответу и отлаживайте с помощью kint, как это, из вашей темы/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()");
Затем перейдите к присвоению значений переменным:
$variables['my_target_attribute'] = $product->getVariations()[0]->getAttributeValue('my_target_attribute')->getName();
Затем вы сможете распечатать атрибут my_target_attribute в своей ветке/шаблоне следующим образом:
{{ my_target_attribute }}
Я не мог понять, как это сделать в шаблоне ветки, но это можно сделать в 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>';
}