Как распечатать вариант продукта отдельно от кнопки "Отправить/оплатить" в форме "Добавить в корзину"?


Я хочу поместить рассчитанную цену продукта между виджетом "выбор варианта продукта" и кнопкой "оплатить".

В commerce-product.html.twig (мои товары отображают форму добавления в корзину на самом товаре) у меня есть этот код:

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

variation_price является расчетной ценой.

  1. Как называется переменная, содержащая виджет выбора варианта продукта? Ответ: продукт.варианты
  2. Как я могу разместить кнопку отправить/оплатить отдельно из виджета выбора типа вариации? Ответ: ??

Я попытался использовать 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
Author: Patrick Kenny, 2017-11-18

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 }}
 4
Author: Fons Vandamme, 2018-04-06 09:13:30

Поскольку форма "Добавить в корзину" поставляется в комплекте с вариантами продуктов, я использую ее в следующем шаблоне commerce-product.html.twig.

<article{{ attributes }}>
      {{ product.title }}
      {{ product.body }}
      {{ product.variation_price }}
      {{ product.variations }}  // show the add to cart button
</article>
 1
Author: flamesquirrel, 2018-05-21 11:09:19

Я бы также добавил, что если вы добавляете пользовательские атрибуты и хотите получить доступ к этим значениям в 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 }}
 1
Author: vrwired, 2018-09-27 04:06:41

Я не мог понять, как это сделать в шаблоне ветки, но это можно сделать в 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
Author: Patrick Kenny, 2017-12-07 15:48:43