logo

Сайты / Разработка / 
Opencart 2.x - аттрибуты в категорию

08 декабрь, 2017 286 0
В магазине на движке Opencart 2.x у товаров есть аттрибут "Состояние", значений всего два: "Б/у" и "Новый". Давно стоит задача вывести этот аттриут в категории, в акции, в поиск и в сравнение. Модов я не нашёл, да и не сильно искал, проще самому сделать, ведь вопрос в полюбому паре строк))

Порыскав в контроллере вывода карточки товара, нашёл несколько строк, отвечающих за вывод аттрибутов в описание. Итак.. 
 
Редактируем по очереди файлики контроллеров
catalog\controller\product\category.php, compare.php, manufacturer.php, search.php, special.php
$data['products'][] = array(
...
'description' => utf8_substr(strip_tags(html_entity_decode($result['description'], ENT_QUOTES, 'UTF-8')), 0, $this->config->get('config_product_description_length')) . '..',
//добавляем запрос аттрибутов после description
'attribute_groups' => $this->model_catalog_product->getProductAttributes($result['product_id']),
...

Идём в соответствующие файлы шаблоны
catalog\view\theme\*\template\product\category.tpl, compare.tpl, manufacturer_info.tpl, search.tpl,  special.tpl

Мне удобней выводить аттрибуты по id, по аналогии можно и по имени, и по имени группы и т.п.
Выбираем нужное место для вывода и добавляем:
<!-- =====================Stickers ==================== -->     
   <?php if($product['attribute_groups']) { ?>
      <?php foreach($product['attribute_groups'] as $attribute_group) { ?>
         <?php foreach ($attribute_group['attribute'] as $attribute) { ?>
            <?php if ($attribute['attribute_id'] == '19') { ?>
               <div class="product_sticker"><?php echo html_entity_decode($attribute['text']); ?></div>
            <?php } ?>
         <?php } ?>
      <?php } ?>
    <?php } ?>
<!-- =====================Stickers End==================== -->

Я задумывал вывод аттрибута под id == 19 как ярлычок или стикер, задал класс и прописал простенький стиль в catalog/view/theme/default/stylesheet/, с тенью, всё по феншую :p
Кстати, чтоб не прописывать тень вручную, пользую CSSmatic - отличная штука :)

/* Stickers */
.product_sticker {
    position: absolute;
    top: 14px;
    left: 5px;
    background: #f38a22;
    max-width: 70px;
    line-height: 20px;
    border-radius: 2px;
    color: #fff;
    font-weight: bold;
    text-indent: 10px;
    padding: 2px 16px 2px 3px;
    text-transform: capitalize;
    z-index:2;
    -webkit-box-shadow: 2px 2px 4px -2px rgba(0,0,0,0.6);
    -moz-box-shadow: 2px 2px 4px -2px rgba(0,0,0,0.6);
    box-shadow: 2px 2px 4px -2px rgba(0,0,0,0.6);
}

Если хотим вывести в ещё каком-то модуле, типа хиты продаж и популярное, то в топ добавляем
$this->load->model('catalog/product');
и дальше по аналогии.

Времени потрачено пару часов с разбирательствами, а вышло в итоге как-то так:


--
Дополнение от 29.12.17


В контроллере карточки товара product.php уже есть все необходимые запросы и команды, все что нужно - немного видоизменить вывод в шаблоне product.tpl
<!-- =====================Stickers ==================== -->     
    <?php if ($attribute_groups) { ?>
        <?php foreach ($attribute_groups as $attribute_group) { ?>
            <?php foreach ($attribute_group['attribute'] as $attribute) { ?>
                <?php if ($attribute['attribute_id'] == '19') { ?>
                    <div class="product_sticker"><?php echo html_entity_decode($attribute['text']); ?></div>
                <?php } ?>
            <?php } ?>
        <?php } ?>
    <?php } ?>
<!-- =====================Stickers End==================== -->    

А вообще, было бы неплохо оформить всё это в модуль ocmod и устанавливать через админку, выбирая нужные категории. Но я ленивый и до сих пор не разобрался с конструкциями ocmod'а, хотя выглядит все очень просто - найти код, вставить после строки))) Но быть может когда-нибудь)
Теги:
opencart attributes
Прокомментировать
Введите код с картинки:*
Кликните на изображение чтобы обновить код, если он неразборчив
все шаблоны для dle на сайте newtemplates.ru скачать