Оценок: 1

Вывод атрибутов на страницу категории и оформление товаров в таблицу

Для начала необходимо добавить вывод аттрибутов на страницу категории. Учитывая, что нужны только аттрибуты и их значения внесем изменения в контроллер и шаблон категории, а так же модель товара. Если на странице товара группы аттрибутов так же не нужны (как в моем случае) - лучше всего убрать лишнее в соответствующей функции, если же нужны - добавить новую.

В первом случае потребуется так же внести изменения в контроллер и шаблон товара.

Файл: /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 } ?>
Оценок: 1

Комментарии (4)

  1. А как реализовать на Opencart 3.0.2?

    Андрей Лящевский 14 мая 2020, 19:10 0
    • Подскажите, пожалуйста, как сделать то же, но для opencart 2.0. А то пишет:
      Notice: Undefined index: attribute in .../catalog/view/theme/coloring/template/product/category.tpl on line 127

      Но я все изменяла не в дефолтной теме, а в своей (но она не меняет системных файлов)

      Александра 05 октября 2015, 10:55 0
      • здрасти, жаль, что нет скриншотов, чтобы увидеть, как это должно выглядеть в итоге. вроде понятно зачем и подходит мне, но не уверен. правильно ли я понимаю, что это вывод товаров по таким де атриьутам, что и выбранный товар или нет?

        Георгий 15 августа 2015, 22:21 0
        • Нет… это вывод атрибутов товара на странице категории

          Вова Ленский 16 августа 2015, 06:28 0
        Надежный хостинг VPS серверов
        • Свои ISO образы
        • VDS с оплатой раз и навсегда
        • Аренда VDS на любой срок, с оплатой по дням
        • Большое разнообразие конфигураций
        • Дата-центры в ЕС и России
        + скидка 10%