xandeadx.ru Блог музицирующего веб-девелопера

Drupal → Форма "Добавить в корзину" со списком всех вариантов товара

Опубликовано в

Задача — вывести в форме "Добавить в корзину" список всех вариантов товара и дать пользователю возможность заказать любой(ые) из них.

Решение зависит от способа вывода вариантов товара (будет ниже).

Все решения базируются на следующем вьюсе по сущностям product:

Основное тут — связь по полю Commerce Product: Referencing Node и контекстный фильтр по Nid с дефолтным значением Content ID from url. Экспорт вьюхи.

Вьюшка выводится на странице товара любо с помощью блоков, либо с помощью модуля Eva, либо программно в node.tpl.php.

Множество кнопок "Добавить в корзину" с полями "Количество" (или без)

Самый простой вариант. Для решения достаточно добавить в представление поле Commerce Product: Add to Cart form. Поле "Количество" добавляется включением опции "Display a textfield quantity widget on the add to cart form" в настройках поля "Add to Cart form".

Видео урок

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

Решение — установить модуль Commerce Add to Cart Extras и добавить в представление новое поле Commerce Product: Quantity input field (Quantity). Видео.

Замечание: Views формы принудительно кэшируются, что может негативно сказаться на производительности сайта при выводе множества форм на одной странице.

Альтернатива — мой модуль Commerce add to cart multiple formatter (работает на ajax, формы не кэшиурет).

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

Решение:

1. Установить модуль Commerce Add to Cart Extras.

2. Добавить в представление новое поле Commerce Product: Quantity input field.

3. Добавить в представление поле Commerce Product: Product ID с включённой опцией Exclude from display и сделать это поле первым в списке (скриншот).

4. Добавить в представление поле Global: Custom text с текстом [form-item-add-to-cart-state-[product_id]] (скриншот).

5. Добавить в свой модуль или template.php следующий код:

/**
 * Implements hook_form_BASE_FORM_ID_alter(): views_form.
 */
function MODULENAME_form_views_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'VIEWS_FORM_ID') {
    $form['add_to_cart_state'] = array('#tree' => TRUE);
    foreach (element_children($form['add_to_cart_quantity']) as $key) {
      $form['add_to_cart_state'][$key] = array('#type' => 'checkbox');
      $form['#substitutions']['#value'][] = array(
        'placeholder' => '[form-item-add-to-cart-state-' . $form['add_to_cart_quantity'][$key]['#product_id'] . ']',
        'field_name' => 'add_to_cart_state',
        'row_id' => $key,
      );
    }
    array_unshift($form['#submit'], 'MODULENAME_multi_add_to_cart_form_submit');
  }
}
 
/**
 * Custom submit callback for multi_add_to_cart_form.
 */
function MODULENAME_multi_add_to_cart_form_submit($form, &$form_state) {
  foreach ($form_state['values']['add_to_cart_state'] as $key => $state) {
    if (!$state) {
      $form_state['values']['add_to_cart_quantity'][$key] = 0;
    }
  }
}

Заменить VIEWS_FORM_ID на id формы.

6. Сбросить кэш.

Одна кнопка "Добавить в корзину" с множеством чекбоксов

Тут может быть два решения — первое, это сделать всё как в прошлом пункте, установить значение поля "Количество" равным 1 и скрыть его с помощью css; второе, это воспользоваться Commerce VBO Views + Rules.

Основные шаги по второму способу:

1. Создаём в Rules компонент Rule. В компоненте будет один параметр — Commerce product.

2. Добавляем в компоненте действие Добавить в корзину.

3. Добавляем в представление поле VBO и выбираем экшеном ранее созданный компонент.

Как это должно примерно выглядеть.

P.S: если не нужен Views, то можно просто заальтерить форму commerce_cart_add_to_cart_form, изменить дефолтный select и подменить #submit с последующим вызовом commerce_cart_product_add().

Написанное актуально для Commerce 1.x
Похожие записи

Комментарии RSS

Спасибо, пригодится ;)

Очень нужная информация. Спасибо!

Пара вопросов:
Как связать вариант "Одна кнопка "Добавить в корзину" с множеством чекбоксов" с продажей файлов? Нужно ли добавлять поле "файл" во вьюху?

@Екатерина, зависит от того, как реализована продажа файлов

Собираюсь делать через Commerce File.
Должна быть связка:
файл - его размер - цена
(цены на файлы разных размеров отличаются).
На видео http://drupal-tv.ru/video/dopolnitelnye-opcii-tovara-vliyayushchie-na-ce... всё супер, всё понятно - цену можно привязать к размеру. Одно но: как к этому делу привязать конкретный файл, который чело сможет скачать после оплаты?

не знаком с Commerce File, ничего посоветовать не могу

Спасибо, полезная статья, воспользовались способом «Одна кнопка "Добавить в корзину" с множеством чекбоксов и полей "Количество"», не заработало без патча из этого обсуждения: https://www.drupal.org/node/1985340. С патчем все ок

Спасибо, полезная статья, воспользовались способом «Одна кнопка "Добавить в корзину" с множеством полей "Количество"», не заработало без патча из этого обсуждения: https://www.drupal.org/node/1985340. С патчем все ок

А нету ли решения без вьюхи? Через темизацию формы например?

Добрый день,
Давно пользуюсь методом со списком и одной кнопкой Добавить в корзину. Но сейчас добавился еще один тип товара, в отношении которого контролируются запаса модулем Commerce Stock. B вопрос такой - как у товара с запасами 0 деактивировать поле изменения количества.

И второй вопросик - а можно у формы сделать 2 кнопки Добавить в корзину - сверху формы и снизу.

Пока сделал такой костыль - сделал две вьюхи типа eva field. В одной условие фильтрации запасы товара = null, в другой запасы товара больше 0. В тип товара вставил друг за другом эти 2 поля. На странице выводится или одно поле, или другое. Но так наверное не очень правильно.

Использую способ Одна кнопка "Добавить в корзину" с множеством полей "Количество". Все хорошо в этом способе, одно но:

На примере Commerce Kickstart (я его не использую, но пришлось проверить и на нем) при добавлении товара обычным способом, т.е. выбрал товар, количество, добавил в корзину - в этом случае в корзине (Shopping cart form) товары отображаются со ссылкой на продукт (View product), тогда как при добавлении товара способом Одна кнопка "Добавить в корзину" с множеством полей "Количество" с участием модуля Commerce Add to Cart Extras в корзине данная ссылка на продукт (View product) не рабочая, т.е. данный текст уже без ссылки на товар.
Preview
Вопрос: как добавить ссылку к View product в данном способе?

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании