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

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

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

Файл: /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 } ?>

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

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

  1. Александра 05 октября 2015, 10:55(Комментарий был изменён)
    0 #

    Подскажите, пожалуйста, как сделать то же, но для opencart 2.0. А то пишет:
    Notice: Undefined index: attribute in .../catalog/view/theme/coloring/template/product/category.tpl on line 127

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

    1. Георгий 15 августа 2015, 22:21
      0 #

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

      1. Вова Ленский 16 августа 2015, 06:28
        0 #

        Нет… это вывод атрибутов товара на странице категории