Создание сетки связанных продуктов Commerce

Aug 18 2020

Я использую Drupal 7 вместе с Commerce 1.x, и я создал тип контента, который имеет поле ссылки для сущностей Commerce Product.

А теперь я хотел бы отобразить сетку продуктов, на которые есть ссылки, то есть выделенную форму добавления в корзину для каждого продукта на странице узла.

По крайней мере, пока это кажется невыполнимой задачей. Я пробовал использовать представления, переменную настраиваемого шаблона формы и т. Д., Но всегда выдает ошибки, например

Примечание: неопределенный индекс: # параметры в функции form_process_radios () (строка 3188

Параметр должен быть массивом или объектом, который реализует Countable в функции form_process_radios () (rivi 3188

Как-то всегда ожидается радиоэлемент с параметрами (форматирование по умолчанию) для нескольких продуктов. Однако это не то, что я хочу, и я попытался установить его как скрытый элемент. Я тоже могу видеть формы, но хотел бы избавиться от ошибок и создать это «по книге».

<?php
function mymodule_preprocess_entity(&$variables) { $variables['add_to_cart_form'] = '';

  if ($variables['elements']['#entity_type'] == 'commerce_product'){ $item = $variables['elements']['#entity']; if (empty($item->product_id)) {
        return;
      }

      $form_id = commerce_cart_add_to_cart_form_id([$item->product_id]);

      $line_item = commerce_product_line_item_new($item, 1, 0, [], 'custom_owner');
      $line_item->commerce_product = $item->product_id;
      $line_item->data['context']['product_ids'] = array($item->product_id);
      $line_item->data['context']['show_single_product_attributes'] = 1; $product_form = drupal_get_form($form_id, $line_item);

      // Trying to change from radio element to hidden
      $product_form['product_id']['#type'] = 'hidden'; unset($product_form['product_id']['#theme_wrappers']);
      unset($product_form['product_id']['#process']); $form_markup = drupal_render($formp); $variables['add_to_cart_form'] = array('#markup' => $form_markup);


  }

}?>

Ответы

1 RyanSzrama Aug 21 2020 at 01:38

Это возможно прямо из коробки без какого-либо специального кода, только простые представления. Уловка состоит в том, чтобы создать представление на основе содержимого любого типа вашего узла и установить связь между узлом и продуктами, на которые ссылается его поле ссылки на продукт. Когда у вас есть поля продукта, доступные для представления, Commerce 1.x предоставляет поле формы «Добавить в корзину» для каждого варианта, которое будет помещено в представление.

Я создал образец View, который делает это, поместив его в блок на страницах узлов моего типа узла отображения продукта. Он использует контекстный фильтр для определения идентификатора узла из URL-адреса, присоединяется к продуктам через связь, описанную выше, а затем отображает название продукта, цену и форму добавления в корзину в сетке:

Обратите внимание, что отдельные позиции, добавленные через формы «Добавить в корзину», не поддерживают контекст узла; вот почему «Продукт 3» отображается в моей корзине как ссылка, а «Два» и «Один» - нет. Он будет принимать пользовательский код , чтобы обеспечить эти формы имеют соответствующий контекст в этой точке, но это другой вопрос.

Если вы визуально обучаетесь, вот представление, которое я создал для этой работы: