Для начала необходимо добавить вывод аттрибутов на страницу категории. Учитывая, что нужны только аттрибуты и их значения внесем изменения в контроллер и шаблон категории, а так же модель товара. Если на странице товара группы аттрибутов так же не нужны (как в моем случае) - лучше всего убрать лишнее в соответствующей функции, если же нужны - добавить новую.
В первом случае потребуется так же внести изменения в контроллер и шаблон товара.
Файл: /catalog/model/catalog/product.php
Находим функцию: "public function getProductAttributes($product_id) {", далее:
1. Если хотим сохранить разбивку аттрибутов на группы на странице товара - перед ней добавляем новую функцию:
public function getProductAttributesnocat($product_id) {
$product_attribute_data = array();
$product_attribute_query = $this->db->query("SELECT a.attribute_id, ad.name, pa.text FROM " . DB_PREFIX . "product_attribute pa LEFT JOIN " . DB_PREFIX . "attribute a ON (pa.attribute_id = a.attribute_id) LEFT JOIN " . DB_PREFIX . "attribute_description ad ON (a.attribute_id = ad.attribute_id) WHERE pa.product_id = '" . (int)$product_id . "' AND ad.language_id = '" . (int)$this->config->get('config_language_id') . "' AND pa.language_id = '" . (int)$this->config->get('config_language_id') . "' ORDER BY a.sort_order, ad.name");
foreach ($product_attribute_query->rows as $product_attribute) {
$product_attribute_data[] = array(
'attribute_id' => $product_attribute['attribute_id'],
'name' => $product_attribute['name'],
'text' => $product_attribute['text']
);
}
return $product_attribute_data;
}
Если разбивка не нужна, просто заменим содержимое существующей.
Далее - файл /catalog/controller/product/category.php
Находим:
$this->data['products'][] = array(
Если заменили функцию, сразу после добавляем:
'attribute' => $this->model_catalog_product->getProductAttributes($result['product_id']),
Если добавили новую:
'attribute' => $this->model_catalog_product->getProductAttributesnocat($result['product_id']),
Далее файл /catalog/view/theme/default/template/product/category.tpl
Находим:
<?php if ($product['rating']) { ?>
Впереди добавляем:
<?php if ($product['attribute']) { ?>
<?php foreach ($product['attribute'] as $attribute) { ?>
<span><?php echo $attribute['name']; ?>:</span> <?php echo $attribute['text']; ?><br />
<?php } ?>
<?php } ?>
Аттрибуты выведены на страницу категории, теперь нужно оформить вывод товаров в таблицу. Сразу предупрежу, что к моменту написания данного материала шаблон уже изменен, так что кое-что может не совпадать.
Вывод товара на странице категории после добавления аттрибутов, шаблон /catalog/view/theme/default/template/product/category.tpl:
<div class="box-product">
<?php foreach ($products as $product) { ?>
<div class="cat">
<?php if ($product['thumb']) { ?>
<div class="image"><a href="<?php echo $product['href']; ?>"><img src="<?php echo $product['thumb']; ?>" title="<?php echo $product['name']; ?>" alt="<?php echo $product['name']; ?>" /></a></div>
<?php } ?>
<div class="name"><a href="<?php echo $product['href']; ?>"><?php echo $product['name']; ?></a></div>
<div class="abs">
<?php if ($product['price']) { ?>
<div class="price">
<?php if (!$product['special']) { ?>
<?php echo $product['price']; ?>
<?php } else { ?>
<span class="price-old"><?php echo $product['price']; ?></span> <span class="price-new"><?php echo $product['special']; ?></span>
<?php } ?>
</div>
<?php } ?>
<?php if ($product['rating']) { ?>
<div class="rating"><img src="catalog/view/theme/default/image/stars-<?php echo $product['rating']; ?>.png" alt="<?php echo $product['reviews']; ?>" /></div>
<?php } ?>
<?php if ($product['attribute_groups']) { ?>
<?php foreach ($product['attribute'] as $attribute) { ?>
<span><?php echo $attribute['name']; ?>:</span> <?php echo $attribute['text']; ?><br />
<?php } ?>
<?php } ?>
<div class="cart">
<input type="button" value="<?php echo $button_cart; ?>" onclick="addToCart('<?php echo $product['product_id']; ?>');" class="button" />
</div>
</div>
</div>
<?php } ?>
</div>
Теперь немного переделаем. Набор аттрибутов у товаров может отличаться, нужно вывести только отдельные аттрибуты в определенные ячейки (заголовки столбцов будут прописаны в шаблон). Предварительно нужно узнать id выводимых аттрибутов.
Для аттрибутов будет 5 столбцов:
Объем (id=62)
Тип (id=63)
Направление (id=58)
Сторона (id=59)
Тип кузова (id=60)
Вывод значения отдельного аттрибута будет выглядеть так:
<?php foreach ($product['attribute'] as $attribute) { ?>
<?php if ($attribute['attribute_id'] == 62) { ?>
<?php echo $attribute['text']; ?>
<?php }?>
<?php }?>
А вывод товаров в целом:
<table border="1" >
<thead>
<tr>
<td>Изображение</td>
<td>Имя</td>
<td>Объем</td>
<td>Тип</td>
<td>Направление</td>
<td>Сторона</td>
<td>Тип кузова</td>
<td>Цена</td>
<td>Рейтинг</td>
<td>Корзина</td>
</tr>
</thead>
<tbody>
<?php foreach ($products as $product) { ?>
<tr>
<td> <?php if ($product['thumb']) { ?>
<div class="image"><a href="<?php echo $product['href']; ?>"><img src="<?php echo $product['thumb']; ?>" title="<?php echo $product['name']; ?>" alt="<?php echo $product['name']; ?>" /></a></div>
<?php } else { ?>-<?php }?></td>
<td><a href="<?php echo $product['href']; ?>"><?php echo $product['name']; ?></a></td>
<?php if ($product['attribute']) { ?>
<td>
<?php foreach ($product['attribute'] as $attribute) { ?>
<?php if ($attribute['attribute_id'] == 62) { ?>
<?php echo $attribute['text']; ?>
<?php }?>
<?php }?>
</td>
<td>
<?php foreach ($product['attribute'] as $attribute) { ?>
<?php if ($attribute['attribute_id'] == 63) { ?>
<?php echo $attribute['text']; ?>
<?php }?>
<?php }?>
</td>
<td>
<?php foreach ($product['attribute'] as $attribute) { ?>
<?php if ($attribute['attribute_id'] == 58) { ?>
<?php echo $attribute['text']; ?>
<?php }?>
<?php }?>
</td>
<td>
<?php foreach ($product['attribute'] as $attribute) { ?>
<?php if ($attribute['attribute_id'] == 59) { ?>
<?php echo $attribute['text']; ?>
<?php }?>
<?php }?>
</td>
<td>
<?php foreach ($product['attribute'] as $attribute) { ?>
<?php if ($attribute['attribute_id'] == 60) { ?>
<?php echo $attribute['text']; ?>
<?php }?>
<?php } ?>
</td>
<?php } ?>
<td> <?php if ($product['price']) { ?>
<?php if (!$product['special']) { ?>
<?php echo $product['price']; ?>
<?php } else { ?>
<span class="price-old"><?php echo $product['price']; ?></span> <span class="price-new"><?php echo $product['special']; ?></span>
<?php } ?>
<?php } ?></td>
<td> <?php if ($product['rating']) { ?>
<img src="catalog/view/theme/default/image/stars-<?php echo $product['rating']; ?>.png" alt="<?php echo $product['reviews']; ?>" />
<?php } ?></td>
<td><input type="button" value="<?php echo $button_cart; ?>" onclick="addToCart('<?php echo $product['product_id']; ?>');" class="button" /></td>
</tr>
<?php } ?>
</tbody>
</table>
Если вносили изменения в существующую функцию, не забываем внести изменения в контроллер и шаблон вывода товара:
Файл: /catalog/controller/product/product.php
Находим:
$this->data['attribute_groups'] = $this->model_catalog_product->getProductAttributes($this->request->get['product_id']);
Меняем на:
$this->data['attributes'] = $this->model_catalog_product->getProductAttributes($this->request->get['product_id']);
Файл: /catalog/view/theme/default/template/product/product.tpl (изменения для стандартного шаблона)
Находим:
<?php if ($attribute_groups) { ?>
<a href="#tab-attribute"><?php echo $tab_attribute; ?></a>
<?php } ?>
Меняем на:
<?php if ($attributes) { ?>
<a href="#tab-attribute"><?php echo $tab_attribute; ?></a>
<?php } ?>
Находим:
<?php if ($attribute_groups) { ?>
<div id="tab-attribute" class="tab-content">
<table class="attribute">
<?php foreach ($attribute_groups as $attribute_group) { ?>
<thead>
<tr>
<td colspan="2"><?php echo $attribute_group['name']; ?></td>
</tr>
</thead>
<tbody>
<?php foreach ($attribute_group['attribute'] as $attribute) { ?>
<tr>
<td><?php echo $attribute['name']; ?></td>
<td><?php echo $attribute['text']; ?></td>
</tr>
<?php } ?>
</tbody>
<?php } ?>
</table>
</div>
<?php } ?>
Меняем на:
<?php if ($attributes) { ?>
<div id="tab-attribute" class="tab-content">
<table class="attribute">
<tbody>
<?php foreach ($attributes as $attribute) { ?>
<tr>
<td><?php echo $attribute['name']; ?></td>
<td><?php echo $attribute['text']; ?></td>
</tr>
<?php } ?>
</tbody>
</table>
</div>
<?php } ?>
А как реализовать на Opencart 3.0.2?
Подскажите, пожалуйста, как сделать то же, но для opencart 2.0. А то пишет:
Notice: Undefined index: attribute in .../catalog/view/theme/coloring/template/product/category.tpl on line 127
Но я все изменяла не в дефолтной теме, а в своей (но она не меняет системных файлов)
здрасти, жаль, что нет скриншотов, чтобы увидеть, как это должно выглядеть в итоге. вроде понятно зачем и подходит мне, но не уверен. правильно ли я понимаю, что это вывод товаров по таким де атриьутам, что и выбранный товар или нет?
Нет… это вывод атрибутов товара на странице категории