Crear una cuadrícula de productos comerciales referenciados

Aug 18 2020

Estoy usando Drupal 7 junto con Commerce 1.xy he creado un tipo de contenido que tiene un campo de referencia para las entidades de productos comerciales.

Y ahora me gustaría representar una cuadrícula de productos referenciados, es decir, un formulario dedicado para agregar al carrito para cada producto en la página del nodo.

Al menos hasta ahora parece una tarea imposible de realizar. Lo intenté con Vistas, variable de plantilla de formulario personalizada, etc. pero siempre da errores como

Aviso: índice no definido: #opciones en la función form_process_radios () (fila 3188

El parámetro debe ser una matriz o un objeto que implemente Countable en la función form_process_radios () (rivi 3188

De alguna manera, siempre se espera un elemento de radio con opciones (que es el formato predeterminado) para múltiples productos. Sin embargo, eso no es lo que quiero y he intentado configurarlo como elemento oculto. También puedo ver los formularios, pero me gustaría deshacerme de los errores y crearlos "siguiendo las instrucciones".

<?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);


  }

}?>

Respuestas

1 RyanSzrama Aug 21 2020 at 01:38

Esto es posible desde el primer momento sin ningún código personalizado, simplemente Vistas. El truco consiste en hacer la Vista basada en el contenido de cualquier tipo de nodo y establecer una relación entre el nodo y los productos a los que hace referencia su campo de referencia de producto. Una vez que tenga los campos de productos disponibles para la Vista, Commerce 1.x proporciona un campo de formulario Agregar al carrito por variación para colocar en la Vista.

Creé una Vista de muestra que hace esto, colocándola en un bloque en las páginas de nodo del tipo de nodo de visualización de mi producto. Utiliza un filtro contextual para determinar el ID de nodo de la URL, se une a los productos a través de la relación que describí anteriormente y luego muestra el título del producto, el precio y el formulario Agregar al carrito en una cuadrícula:

Tenga en cuenta que los artículos de línea agregados a través de los formularios Agregar al carrito del producto no mantienen el contexto del nodo; es por eso que "Producto tres" se representa como un enlace en mi carrito, pero Dos y Uno no. Se podría tener un código personalizado para asegurar esas formas tienen el contexto apropiado en este punto, pero eso es otra cuestión.

En caso de que sea un aprendiz visual, aquí está la vista que construí para que esto funcione: