Добавить комментарий

При работе над одним из сайтов встала задача сделать сетку цвет/размер, с помощью которой отображаются доступные варианты товара и нужные добавляются в корзину. Для этого я использовал модули Commerce Fancy Attributes и Commerce Add to Cart Extras.

Commerce Fancy Attributes преобразует hex код в цветную иконку, про этот модуль я писал здесь.

Модуль Commerce Add to Cart Extras создает таблицу со списком вариантом товара и возможностью добавления любого из них в корзину. В этой статье я рассказывал про него подробнее. При этом с помощью views создается блок с необходимыми полями, все это гибко настраивается и вообще удобно.

По сути, мне осталось только переделать шаблон для вывода данной вьюхи, чтобы вместо простого перечисления списка товаров выводилась сетка цвет/размер.

Настройки вьюхи у меня такие:

В тему я добавил кастомный шаблон для данной вьюхи с названием «views-view-table--add-to-cart.tpl.php», поскольку машинное имя вьюхи было «add-to-cart». Посмотреть шаблон, который используется, можно в настройках вьюса, кликнув на «theme:information».

Сам код в шаблоне приобрел такой вид:

<?php

/**
* @file
* Template to display a view as a table.
*
* - $title : The title of this group of rows.  May be empty.
* - $header: An array of header labels keyed by field id.
* - $caption: The caption for this table. May be empty.
* - $header_classes: An array of header classes keyed by field id.
* - $fields: An array of CSS IDs to use for each field id.
* - $classes: A class or classes to apply to the table, based on settings.
* - $row_classes: An array of classes to apply to each row, indexed by row
*   number. This matches the index in $rows.
* - $rows: An array of row items. Each row is an array of content.
*   $rows are keyed by row number, fields within rows are keyed by field ID.
* - $field_classes: An array of classes to apply to each field, indexed by
*   field id, then row number. This matches the index in $rows.
* @ingroup views_templates
*/
?>

<?php

// название полей товара, содержащих цвета и размеры
$field_size = 'field_product_sizes';      // размер
$field_color = 'field_product_colors';    // цвет
$field_quantity = 'add_to_cart_quantity'; // поле ввода количества

// компoнуем доступные данные (цвета, размеры и поле ввода количества) для последующего использования
foreach($rows as $row) {
  
$sizes[$row[$field_size]] = $row[$field_size];
  
$colors[$row[$field_color]] = $row[$field_color];
  
$qty[$row[$field_size]][$row[$field_color]] = $row[$field_quantity];
}

// получаем отрендеренный термин цвета
$color_values = array();
foreach(
$colors as $color) {
  
$term = taxonomy_term_load($color);
  
$color_values[$color] = render(taxonomy_term_view($term, 'add_to_cart_form'));
}

// формируем заголовок таблицы
unset($header);
$header['Size'] = ' ';
foreach(
$colors as $color) {
  
$header[$color] = $color_values[$color];
}

// формируем содержание таблицы
$nrows = array();
$i = 0;
foreach(
$sizes as $size) {
  
$nrows[$i]['Size'] = $size;
   foreach(
$colors as $color) {
      if(isset(
$qty[$size][$color])) {
        
$nrows[$i][$color] = $qty[$size][$color];
      }
      else {
        
$nrows[$i][$color] = t(' – ');
      }
   }
  
$i++;
}

$rows = $nrows;

?>

<table <?php if ($classes) { print 'class="'. $classes . '" '; } ?><?php print $attributes; ?>>
   <?php if (!empty($title) || !empty($caption)) : ?>
     <caption><?php print $caption . $title; ?></caption>
  <?php endif; ?>
  <?php if (!empty($header)) : ?>
    <thead>
      <tr>
        <?php foreach ($header as $field => $label): ?>
          <th>
            <?php print $label; ?>
          </th>
        <?php endforeach; ?>
      </tr>
    </thead>
  <?php endif; ?>
  <tbody>
    <?php foreach ($rows as $row_count => $row): ?>
      <tr <?php if ($row_classes[$row_count]) { print 'class="' . implode(' ', $row_classes[$row_count]) .'"';  } ?>>
        <?php foreach ($row as $field => $content): ?>
          <td>
            <?php print $content; ?>
          </td>
        <?php endforeach; ?>
      </tr>
    <?php endforeach; ?>
  </tbody>
</table>

Filtered HTML

  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешённые HTML-теги: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и параграфы переносятся автоматически.

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.