Хотелось бы добить эту тему. Проблема с отображением нескольких цен при наличии дополнительных характеристик вызвана ява скриптом product_detailed.tpl.html и product_brief.tpl.html
<script type="text/javascript">
function GetCurrentCurrency()
{
{/literal}
_selectionCount={$select_counter_var};
_sum = {$product_info.PriceWithOutUnit};
{counter name='select_counter2' start=1 skip=1 print=false assign='select_counter_var2'}
{section name=i loop=$product_extra}
{section name=k loop=$product_extra[i].option_show_times}
_value =
document.MainForm.option_select_{$select_counter_var2}.value;
price_surplus = ( _value.split(":") )[0];
_sum += new Number( price_surplus );
variantID = ( _value.split(":") )[1];
document.HiddenFieldsForm.option_select_hidden_{$select_counter_var2}.value = variantID;
{counter name=select_counter2}
{/section}
{/section}
_sum = Math.round(_sum*100)/100;
_sumStr = new String(_sum);
_commaIndex = _sumStr.indexOf(".");
if ( _commaIndex == -1 )
_sumStr = _sum;
else
_sumStr = _sumStr.substr(0, _commaIndex + 3);
{php}
echo("locationPriceUnit=".getLocationPriceUnit().";\n");
echo("priceUnit='".getPriceUnit()."';\n");
{/php}
_sumStr = _formatPrice( _sumStr, {$currency_roundval});
if ( locationPriceUnit )
document.getElementById('optionPrice').innerHTML = _sumStr + document.MainForm.priceUnit.value;
else
document.getElementById('optionPrice').innerHTML = document.MainForm.priceUnit.value + _sumStr;
{literal}
}
{/literal}
GetCurrentCurrency();
</script>
Как вариант решения, если дополнительные характеристики не меняют цену товара то просто убрать из шаблона код id="optionPrice_{$product_info.productID}". Но такое решение не очень удачное.
Альтернативный способ (удобен возможностью выводить любое количество цен, путем перечисления прямо в шаблоне)
Вывести две и более цены (можно всех) выглядит так:
В папке
core\smarty\plugins создаем файл
function.price.php со следующим содержимим (вместо префикс_вашей_базы указываем префикс своей базы)
function smarty_function_price( $params, &$smarty )
{
$disp='';
$sql='SELECT Price FROM префикс_вашей_базы_products WHERE productID="'.$params['pid'].'"';
if($r=mysql_query($sql)){
$res=mysql_fetch_assoc($r);
$price=$res['Price'];
}
$curr=explode(',',$params['curr']);
$curc=$params['curc'];
$a=1;
foreach ($curr as $d){
if ($d != $curc){
$sql='SELECT * FROM префикс_вашей_базы_currency_types WHERE CID="'.$d.'"';
if($r=mysql_query($sql)){
$res=mysql_fetch_assoc($r);
$curs=$res['currency_value'];
$nprice=round($curs*$price,$res['roundval']);
$nprice=number_format($nprice,'2','.',' ');
if ($res['where2show']) $nprice.=' '.$res['code'];
else $nprice=$res['code'].$nprice;
$disp.=''.$nprice.'
';
}
}
$a++;
}
return $disp;
}
?>
в файлах product_brief.tpl.html и product_detailed.tpl.html (и других где требуется вывод в несколких ценах) добавляем вызов плагина {price pid=`$product_info.productID` curr='1,3,5' curc=$current_currency},
там где выводится цена - переменная Smarty
{$product_info.PriceWithUnit}
<td class="price" id="optionPrice_{$product_info.productID}">{if $currencies_count ne 0}{if $product_info.Price <= 0}{$smarty.const.STRING_NOPRODUCT_IN}{else}{$product_info.PriceWithUnit}{price pid=`$product_info.productID` curr='1,3,5' curc=$current_currency}{/if}{/if}</td>
где
pid – это ID продукта; curr – перечень CID валют, разделенный запятыми; curc - текущая валюта (если параметр будет отсутствовать будут выведены все цены с CID перечисленными в curr='1,3,5'. Полезно если удалить стандартный вывод цены {$product_info.PriceWithUnit}) .
curr – перечень CID валют - смотрим в базе данных (например через phpmyadmin - таблица currency_types), у меня например так
1 Доллары США
3 Рубли
5 Гривна
Добавив стили для .cena1, .cena2 ... получим разное оформлениие для каждой цены. Опять же при дополнительых характеристиках будет только одна цена.