Автор Тема: Атрибут "цвет" на странице категорий  (Прочитано 1693 раз)

12 Августа 2014, 02:16:26
  • Пользователь
  • **
  • Сообщений: 61
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Подскажите, пожалуйста, как добавить цвета товара на странице категорий, т.е. под фотографией товара полоска с доступными цветами этого товара. Пробовал вставлять код из страницы с товаром, но на странице категорий это не работает. Заранее спасибо!
12 Августа 2014, 10:25:09
Ответ #1
  • Ветеран
  • *****
  • Сообщений: 13147
  • Репутация: +14553/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Пару дней дней назад была такая тема.
 
12 Августа 2014, 10:36:45
Ответ #2
  • Ветеран
  • *****
  • Сообщений: 20838
  • Репутация: +25276/-0
  • Prestashop - просто и эффективно
    • Просмотр профиля
Отображение доступных цветов
Подойдет не только для цвета, но и для других комбинаций.
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!
12 Августа 2014, 11:01:46
Ответ #3
  • Ветеран
  • *****
  • Сообщений: 20838
  • Репутация: +25276/-0
  • Prestashop - просто и эффективно
    • Просмотр профиля
Если нужно выводить аттрибут цвет в каталоге товара и менять изображение товара в зависимости от выбранного цвета, то лучше использовать такой метод
Prestashop 1.5 : Вывод аттрибутов "цвет" на странице категорий
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!
12 Августа 2014, 14:00:31
Ответ #4
  • Пользователь
  • **
  • Сообщений: 61
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Конечно очень странно, но ни один из способов не подошел. Просто ничего не выводится, делал все как по инструкции. Кэш чистил, перекомпиляцию включал. Преста 1.5. Может есть еще какие варианты?
12 Августа 2014, 14:17:59
Ответ #5
  • Ветеран
  • *****
  • Сообщений: 20838
  • Репутация: +25276/-0
  • Prestashop - просто и эффективно
    • Просмотр профиля
Проверял, код рабочий.
Включите показ ошибок, напишите какие ошибки показывает.
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!
12 Августа 2014, 14:30:15
Ответ #6
  • Ветеран
  • *****
  • Сообщений: 20838
  • Репутация: +25276/-0
  • Prestashop - просто и эффективно
    • Просмотр профиля
Prestashop 1.5 : Вывод аттрибутов "цвет" на странице категорий
Попробуйте этот метод.
Только проверьте значение для 2 переменных
$groupcolor = 1;

/* "0" или "1" для показа у товаров количество которых 0 */
$prodquantity = 0;
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!
12 Августа 2014, 14:41:05
Ответ #7
  • Пользователь
  • **
  • Сообщений: 61
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Если нужно выводить аттрибут цвет в каталоге товара и менять изображение товара в зависимости от выбранного цвета, то лучше использовать такой метод
Prestashop 1.5 : Вывод аттрибутов "цвет" на странице категорий

Этот способ заработал, но проблема с выводом картинки самого цвета(он ее берет из /img/co/...jpg, а там только те цвета которые добавлялись непосредственно картинкой, а надо чтобы он брал просто цвет фона).

А вот первый способ все равно не работает. Включил отображение ошибок, но ничего не показывает. Делаю вот так:

1. В шаблон product-list.tpl добавляю вывод атрибутов. У меня после кода

<h3><a class="product_link" href="{$product.link}" title="{$product.name|truncate:51:'...'}">{$product.name|truncate:51:'...'}</a></h3>
вставляю вот этот код:

{if isset($groups)}
<!-- attributes -->
<div id="attributes">
{foreach from=$groups key=id_attribute_group item=group}
{if $group.attributes|@count}
<fieldset class="attribute_fieldset">
<label class="attribute_label" for="group_{$id_attribute_group|intval}">{$group.name} :</label>
{assign var="groupName" value="group_$id_attribute_group"}
<div class="attribute_list">
{if ($group.group_type == 'select')}
<select name="{$groupName}" id="group_{$id_attribute_group|intval}" class="attribute_select" onchange="findCombination();getProductAttribute();{if $colors|@count > 0}$('#wrapResetImages').show('slow');{/if};">
{foreach from=$group.attributes key=id_attribute item=group_attribute}
<option value="{$id_attribute|intval}"{if (isset($smarty.get.$groupName) && $smarty.get.$groupName|intval == $id_attribute) || $group.default == $id_attribute} selected="selected"{/if} title="{$group_attribute}">{$group_attribute}</option>
{/foreach}
</select>
{elseif ($group.group_type == 'color')}
<ul id="color_to_pick_list" class="clearfix">
{assign var="default_colorpicker" value=""}
{foreach from=$group.attributes key=id_attribute item=group_attribute}
<li{if $group.default == $id_attribute} class="selected"{/if}>
<a id="color_{$id_attribute|intval}" class="color_pick{if ($group.default == $id_attribute)} selected{/if}" style="background: {$colors.$id_attribute.value};" title="{$colors.$id_attribute.name}" onclick="colorPickerClick(this);getProductAttribute();{if $colors|@count > 0}$('#wrapResetImages').show('slow');{/if}">
{if file_exists($col_img_dir|cat:$id_attribute|cat:'.jpg')}
<img src="{$img_col_dir}{$id_attribute}.jpg" alt="{$colors.$id_attribute.name}" width="25" height="25" /><br>
{/if}
</a>
</li>
{if ($group.default == $id_attribute)}
{$default_colorpicker = $id_attribute}
{/if}
{/foreach}
</ul>
<input type="hidden" class="color_pick_hidden" name="{$groupName}" value="{$default_colorpicker}" />
{elseif ($group.group_type == 'radio')}
{foreach from=$group.attributes key=id_attribute item=group_attribute}
<div class="list-radio"><input type="radio" class="attribute_radio" name="{$groupName}" value="{$id_attribute}" {if ($group.default == $id_attribute)} checked="checked"{/if} onclick="findCombination();getProductAttribute();{if $colors|@count > 0}$('#wrapResetImages').show('slow');{/if}">
{$group_attribute}</div>
{/foreach}
{/if}
</div>
</fieldset>
{/if}
{/foreach}
</div>
{/if}

Пробовал сюда же после этого кода вставлять это(пробовал и по отдельности каждый):

{foreach from=$combinations key=k item=comb}
    {* because the array key are id_product, we can separate the product combinations in here
       with if/else statement compared with the id_product from the foreach loop of products-list *}
    {if $k = $product.id_product}
        {* The attribute Group Name *}
        <p class="title">{$comb.group_name}</p>
        {* List of attribute values inside the attribute Group for current product *}
        <select>
        {foreach from=$comb item=attr}
            <option value="{$attr.id_attribute}">{$attr.attribute_name} {convertPrice price=$attr.unit_price_impact}</option>
        {/foreach}
        </select>
    {/if}
{/foreach}

2. Добавляю в CategoryController.php

public function getProductAttributeCombinations($products) {
    $combinations = array();

    foreach($products as $product)
    {
        // load product object
        $product = new Product ($product['id_product'], $this->context->language->id);

        // get the product combinations data
        // create array combinations with key = id_product
        $combinations[$product->id] = $product->getAttributeCombinations($this->context->language->id);
    }

    return $combinations;
}


public function initContent()
{
    parent::initContent();
    $products = $this->category->getProducts($this->context->language->id, (int)$this->p, (int)$this->n, $this->orderBy, $this->orderWay);
    $combinations = $this->getProductAttributeCombinations($products);
    $this->context->smarty->assign('combinations', $combinations);
}

Функция public function initContent() у меня уже была, так что добавил внутрь нее нужный код.

В результате ничего не происходит и ошибок не выводит. Думаю легче будет разобраться с первым способом, благо он почти заработал, надо лишь подкорректировать фот цветов.
12 Августа 2014, 14:51:06
Ответ #8
  • Ветеран
  • *****
  • Сообщений: 13147
  • Репутация: +14553/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Поменяйте:
{if isset($product.colors) && $product.colors}
        <div>
                    {foreach from=$product.colors key='id_attribute' item='color'}
                            <a id="{$product.id_product}-{$color.id_image}" class="color_pick" onclick="document.getElementById('img_{$product.id_product}').src='{$img_prod_dir}{$product.id_product}-{$color.id_image}.jpg'">
                                    <img src="{$img_col_dir}{$id_attribute}.jpg" alt="{$color.name}" />
                             </a>
                     {/foreach}
        </div>
{/if}
на
{if isset($product.colors) && $product.colors}
<ul class="colors">
{foreach from=$product.colors key='id_attribute' item='color'}
    <li><a style="background: {$color.value};" title="{$color.name}" class="color_pick"></a></li>
{/foreach}
</ul>
{/if}
12 Августа 2014, 14:55:24
Ответ #9
  • Ветеран
  • *****
  • Сообщений: 13147
  • Репутация: +14553/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Первый способ для prestashop 1.4.
Для prestashop 1.5 второй.
Если нужно показать только палитру цветов, то измените шаблон, как написано выше.
12 Августа 2014, 14:56:06
Ответ #10
  • Пользователь
  • **
  • Сообщений: 61
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Да цвета стали появлятся, только вот еще один "прикол:  почему то на многих товарах выводятся те цвета, которых нет в товаре и самое интересное, что чем дальше по товарам, тем больше появляется цветов. Т.е. у первого товара 4 правильных цвета, у следующего 5 цветов(хотя должно быть 2), у следующего 6 и постоянно остаются первые 4 цвета и добавляются новые и так далее, у поcледнего вообще все возможные цвета. Проверял отдельно товары и никакой связи ненужных цветов с товаром нет.
12 Августа 2014, 15:10:47
Ответ #11
  • Ветеран
  • *****
  • Сообщений: 13147
  • Репутация: +14553/-0
  • Сообщество PrestaShop
    • Просмотр профиля
12 Августа 2014, 15:24:17
Ответ #12
  • Пользователь
  • **
  • Сообщений: 61
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Кэширование и не было включено. Всякие cache manager удалены, сам кэш чистил, перекомпиляция включена, кэш отключен.

Теперь пишет ошибку:
Parse error: syntax error, unexpected ')' in .../override/classes/Product.php on line 47
Видимо в этой строчки
$row['price_without_reduction'] = Product::getPriceStatic((int)$row['id_product'], false, ((isset($row['id_product_attribute']) && !empty($row['id_product_attribute'])) ? int)$row['id_product_attribute'] : null), 2, null, false, false);
12 Августа 2014, 15:32:00
Ответ #13
  • Ветеран
  • *****
  • Сообщений: 13147
  • Репутация: +14553/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Включите режим отладки и скиньте значение переменной $product.
12 Августа 2014, 15:41:47
Ответ #14
  • Пользователь
  • **
  • Сообщений: 61
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Ошибку перестал выводить(там надо было скобку одну поставить). Режим отладки включен, ошибок не выдает, а вот про значение переменной $product не понял, откуда его взять?