Проверено на 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, $row, Context $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 ? 2 : 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), 2, null, false, false);
}
else
{
$row['price'] = Tools::ps_round( Product::getPriceStatic((int)$row['id_product'], true, ((isset($row['id_product_attribute']) && !empty($row['id_product_attribute'])) ?(int)$row['id_product_attribute'] : null), 2 ), 2 );
$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), 6, null, false, false );
}
$row['reduction'] = Product::getPriceStatic((int)$row['id_product'], (bool)$usetax, (int)$row['id_product_attribute'], 6, null, true, true, 1, true, null, null, null, $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']) ? 1 : 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}