Автор Тема: Prestashop 1.5 : Вывод аттрибутов "цвет" на странице категорий  (Прочитано 15264 раз)

12 Август 2014, 10:57:56
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 22125
  • Репутация: +25303/-1
  • Prestashop - просто и эффективно
    • Просмотр профиля
Проверено на prestashop версии 1.5, должно работать в prestashop 1.6, только нужно изменить шаблон product-list.tpl

1. Переопределяем класс Product.php и сохраняем новый файл в /override/classes/...
Если в этой папке уже есть такой файл, то добавьте новые функции в этот файл.
<?php
class Product extends ProductCore
{

    public static function 
getProductProperties($id_lang$rowContext $context null)
    {
        if (!
$row['id_product'])
            return 
false;

        if (
$context == null)
            
$context Context::getContext();

        
$row['allow_oosp'] = Product::isAvailableWhenOutOfStock($row['out_of_stock']);
        if (
Combination::isFeatureActive() && (!isset($row['id_product_attribute']) || !$row['id_product_attribute'])
            && ((isset(
$row['cache_default_attribute']) && ($ipa_default $row['cache_default_attribute']) !== null)
                || (
$ipa_default Product::getDefaultAttribute($row['id_product'], !$row['allow_oosp']))))
            
$row['id_product_attribute'] = $ipa_default;
        if (!
Combination::isFeatureActive() || !isset($row['id_product_attribute']))
            
$row['id_product_attribute'] = 0;

        
$usetax Tax::excludeTaxeOption();

        
$cache_key $row['id_product'].'-'.$row['id_product_attribute'].'-'.$id_lang.'-'.(int)$usetax;
        if (isset(
$row['id_product_pack']))
            
$cache_key .= '-pack'.$row['id_product_pack'];
        if (isset(
self::$producPropertiesCache[$cache_key]))
            return 
self::$producPropertiesCache[$cache_key];

        
$row['category'] = Category::getLinkRewrite((int)$row['id_category_default'], (int)$id_lang);
        
$row['link'] = $context->link->getProductLink((int)$row['id_product'], $row['link_rewrite'], $row['category'], $row['ean13']);

        
$row['attribute_price'] = 0;
        if (isset(
$row['id_product_attribute']) && $row['id_product_attribute'])
            
$row['attribute_price'] = (float)Product::getProductAttributePrice($row['id_product_attribute']);

        
$row['price_tax_exc'] = Product::getPriceStatic(
            (int)
$row['id_product'],
            
false,
            ((isset(
$row['id_product_attribute']) && !empty($row['id_product_attribute'])) ? (int)$row['id_product_attribute'] : null),
            (
self::$_taxCalculationMethod == PS_TAX_EXC 6)
        );

        if (
self::$_taxCalculationMethod == PS_TAX_EXC)
        {
            
$row['price_tax_exc'] = Tools::ps_round($row['price_tax_exc'], 2);
            
$row['price'] = Product::getPriceStatic((int)$row['id_product'], true,((isset($row['id_product_attribute']) && !empty($row['id_product_attribute'])) ? (int)$row['id_product_attribute'] : null), 6);
            
$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), 2nullfalsefalse);
        }
        else
        {
            
$row['price'] = Tools::ps_roundProduct::getPriceStatic((int)$row['id_product'], true, ((isset($row['id_product_attribute']) && !empty($row['id_product_attribute'])) ?(int)$row['id_product_attribute'] : null), ), );

            
$row['price_without_reduction'] = Product::getPriceStatic((int)$row['id_product'], true, ((isset($row['id_product_attribute']) && !empty($row['id_product_attribute'])) ?(int)$row['id_product_attribute'] : null), 6nullfalsefalse );
        }

        
$row['reduction'] = Product::getPriceStatic((int)$row['id_product'], (bool)$usetax, (int)$row['id_product_attribute'], 6nulltruetrue1truenullnullnull$specific_prices);

        
$row['specific_prices'] = $specific_prices;

        if (
$row['id_product_attribute'])
        {
            
$row['quantity_all_versions'] = $row['quantity'];
            
$row['quantity'] = Product::getQuantity(
                (int)
$row['id_product'],
                
$row['id_product_attribute'],
                isset(
$row['cache_is_pack']) ? $row['cache_is_pack'] : null
            
);
        }
        else
            
$row['quantity'] = Product::getQuantity((int)$row['id_product']);

        
$row['id_image'] = Product::defineProductImage($row$id_lang);
        
$row['features'] = Product::getFrontFeaturesStatic((int)$id_lang$row['id_product']);

        
$row['attachments'] = array();
        if (!isset(
$row['cache_has_attachments']) || $row['cache_has_attachments'])
            
$row['attachments'] = Product::getAttachmentsStatic((int)$id_lang$row['id_product']);

        
$row['virtual'] = ((!isset($row['is_virtual']) || $row['is_virtual']) ? 0);

        
$colors = array();

          
$groupcolor 1;
          
$prodquantity 0;

          
$attributesGroups Db::getInstance()->ExecuteS('
          SELECT pai.`id_image`, ag.`id_attribute_group`, ag.`is_color_group`, agl.`name` AS group_name, agl.`public_name` AS public_group_name, a.`id_attribute`, al.`name` AS attribute_name,
          a.`color` AS attribute_color, pa.`id_product_attribute`, pa.`quantity`, pa.`price`, pa.`ecotax`, pa.`weight`, pa.`default_on`, pa.`reference`, pa.`unit_price_impact`, pa.`minimal_quantity`
          FROM `' 
_DB_PREFIX_ 'product_attribute` pa
          LEFT JOIN `' 
_DB_PREFIX_ 'product_attribute_combination` pac ON pac.`id_product_attribute` = pa.`id_product_attribute`
          LEFT JOIN `' 
_DB_PREFIX_ 'product_attribute_image` pai ON pai.`id_product_attribute` = pa.`id_product_attribute`
          LEFT JOIN `' 
_DB_PREFIX_ 'attribute` a ON a.`id_attribute` = pac.`id_attribute`
          LEFT JOIN `' 
_DB_PREFIX_ 'attribute_group` ag ON ag.`id_attribute_group` = a.`id_attribute_group`
          LEFT JOIN `' 
_DB_PREFIX_ 'attribute_lang` al ON a.`id_attribute` = al.`id_attribute`
          LEFT JOIN `' 
_DB_PREFIX_ 'attribute_group_lang` agl ON ag.`id_attribute_group` = agl.`id_attribute_group`
          WHERE pa.`id_product` =  '
.(int)$row['id_product'].'
          AND al.`id_lang` =  '
.(int)($id_lang).'
          AND agl.`id_lang` = '
.(int)($id_lang).'
          AND ag.`is_color_group` = '
.$groupcolor.'
          AND pa.quantity >= '
.$prodquantity.'
          GROUP BY id_attribute
          '
);

          if (
Db::getInstance()->numRows())
          {
           foreach (
$attributesGroups AS $k => $rowcolo)
           {
                if (isset(
$rowcolo['attribute_color']) AND $rowcolo['attribute_color'] )
                {
                 
$colors[$rowcolo['id_attribute']]['value'] = $rowcolo['attribute_color'];
                 
$colors[$rowcolo['id_attribute']]['name']  = $rowcolo['attribute_name'];
                 
$colors[$rowcolo['id_attribute']]['id_image']  =(($rowcolo['id_image'] != NULL) ? intval($rowcolo['id_image']) : -1);
                }
           }
          }
        
$row['colors'] = $colors;

        
$row['pack'] = (!isset($row['cache_is_pack']) ? Pack::isPack($row['id_product']) : (int)$row['cache_is_pack']);
        
$row['packItems'] = $row['pack'] ? Pack::getItemTable($row['id_product'], $id_lang) : array();
        
$row['nopackprice'] = $row['pack'] ? Pack::noPackPrice($row['id_product']) : 0;
        if (
$row['pack'] && !Pack::isInStock($row['id_product']))
            
$row['quantity'] = 0;

        
self::$producPropertiesCache[$cache_key] = $row;
        return 
self::$producPropertiesCache[$cache_key];
    }
}
?>


В шаблоне /themes/ваша тема/product-list.tpl замените вывод изображения и добавьте вывод цветов.
Найдите код
<img id="img_{$product.id_product}" src="{$link->getImageLink($product.link_rewrite, $product.id_image)}" alt="{$product.legend|escape:'htmlall':'UTF-8'}" height="{$homeSize.height}" width="{$homeSize.width}" />и замените его на
{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}
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!
12 Август 2014, 13:24:10
Ответ #1
  • Ветеран
  • *****
  • Сообщений: 1285
  • Репутация: +13/-1
  • Сообщество PrestaShop
    • Просмотр профиля
В Prestashop 1.6 в дефолтной теме есть вывод цвета в списке товаров.
12 Август 2014, 13:57:26
Ответ #2
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 22125
  • Репутация: +25303/-1
  • Prestashop - просто и эффективно
    • Просмотр профиля
Это если использовать тему где нет показа цветов.
Многие устанавливают бесплатные темы для prestashop 1.6 и в них не показанны атрибуты на странице категории.
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!
15 Август 2014, 15:39:10
Ответ #3
  • Новичок
  • *
  • Сообщений: 4
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
подскажите, а как вывести вместо дотсупного цвета одну из картинок, корая к нему в комбинации привязана? (1.6)
15 Август 2014, 16:39:51
Ответ #4
  • Ветеран
  • *****
  • Сообщений: 16670
  • Репутация: +14630/-5
  • Сообщество PrestaShop
    • Просмотр профиля
15 Август 2014, 16:45:08
Ответ #5
  • Новичок
  • *
  • Сообщений: 4
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Спасибо, но имелось в виду, что нужно показывать изображение непосредственно товара.
одно из тех, что в добавлении комбинаций отмечается чекбоксами, как те, что относятся к какому-то цвету/размеру.
нигде не могу найти как к ним получить доступ... вижу ид комбинации, название комбинации, но никак не могу понять, где же информация о тех картинках, которые к это комбинации привязаны :((
15 Август 2014, 16:48:02
Ответ #6
  • Ветеран
  • *****
  • Сообщений: 16670
  • Репутация: +14630/-5
  • Сообщество PrestaShop
    • Просмотр профиля
В теме, что я дал ссылку было такое, как показать изображения товара вместо цветов.
Там же несколько способов описано.
15 Август 2014, 17:43:45
Ответ #7
  • Новичок
  • *
  • Сообщений: 4
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
К сожалению, там выводится не изображение товара, а текстура вместо цвета.
А нужно именно изображение товара :(
01 Сентябрь 2014, 00:19:41
Ответ #8
  • Фрилансер
  • *
  • Сообщений: 105
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
В Prestashop 1.6 в дефолтной теме есть вывод цвета в списке товаров.

Где это включается, не подскажите?
01 Сентябрь 2014, 09:52:53
Ответ #9
  • Ветеран
  • *****
  • Сообщений: 1285
  • Репутация: +13/-1
  • Сообщество PrestaShop
    • Просмотр профиля
В prestashop 1.6 в стандарной теме ничего не нужно включать. Там цвета показывает и так. У категорий, в модулях, везде должны быть показанны.
01 Сентябрь 2014, 10:25:57
Ответ #10
  • Фрилансер
  • *
  • Сообщений: 105
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Вы имеете ввиду, что по умолчанию должны отображаться цвета при просмотре категории, как на скриншоте?
01 Сентябрь 2014, 11:11:00
Ответ #11
  • Ветеран
  • *****
  • Сообщений: 16670
  • Репутация: +14630/-5
  • Сообщество PrestaShop
    • Просмотр профиля
Все правильно, так и должно быть показано в списке товаров. У вас они не позываются?
01 Сентябрь 2014, 11:17:21
Ответ #12
  • Фрилансер
  • *
  • Сообщений: 105
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Все правильно, так и должно быть показано в списке товаров. У вас они не позываются?
Нет, почему то не показываются.
Хотя, даже в демо-версии на офф. сайте показываются.
Prestashop 1.6.0.9, стандартный шаблон.
Странно как-то.
Они по умолчанию должны отображаться, или это надо где-то включить?
01 Сентябрь 2014, 12:08:22
Ответ #13
  • Ветеран
  • *****
  • Сообщений: 16670
  • Репутация: +14630/-5
  • Сообщество PrestaShop
    • Просмотр профиля
Показываюся по-умолчанию. Может у вас шаблоны изменены? product-list.tpl не меняли?
01 Сентябрь 2014, 12:12:56
Ответ #14
  • Фрилансер
  • *
  • Сообщений: 105
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Вроде не менял.

Попробую подсунуть из офф. версии, может поможет.

UPD: Подсунул оригинальную версию product-list.tpl и product-list-colors.tpl - без изменений.
Что еще может влиять не отображение цветов?