Задача: дать возможность пользователю интернет-магазина выбрать валюту, в которой он хотел бы видеть цены товаров в каталоге[spoiler]. Пока штатного решения нет, но реализуется довольно просто, для этого требуется кастомизация компонента каталога и его шаблона. Покажу вариант реализации на примере компонента catalog.element.
1. Копируем компонент bitrix:catalog.element в свою папку, например /bitrix/components/supercomponents/
2.Открываем на редактирование файл /bitrix/components/supercomponents/catalog.element/component.php и ищем строку строку, где вызывается метод CIBlockPriceTools::GetItemPrices(). Сразу же после этой строки вставляем следующий код:
Здесь осуществляется запись выбраной валюты в сессию и конвертирование цен продукта в выбранную валюту. Как вариант можно писАть идентификатор в куки.
На этом кастомизация компонента закончена.
3. Открываем на редактирование файл шаблона /bitrix/components/supercomponents/catalog.element/.default/template.php и в самоми начале после строчки '<div class="catalog-element">' (хотя это на ваше усмотрение) добавляем следующее код:
Это форма со списком валют сайта. Пользователь может выбрать валюту, нажать на "Выбрать", в сессию записывается идентификатор валюты, в компоненте цены конвертируется в эту валюту.
Результат:



Всё действия, которые выполнялись в component.php можно выполнят в файле result_modifier.php. В этом случае, понадобится только кастомизация шаблона стандартного компонента. Шаблон компонента нужно скопировать в шаблон сайта, в папке шаблона создать файл result_modifier.php и изменить $arResult аналогично описанному выше.
Компонент
1. Копируем компонент bitrix:catalog.element в свою папку, например /bitrix/components/supercomponents/
2.Открываем на редактирование файл /bitrix/components/supercomponents/catalog.element/component.php и ищем строку строку, где вызывается метод CIBlockPriceTools::GetItemPrices(). Сразу же после этой строки вставляем следующий код:
if (@($_REQUEST['change_c']=="Y")&&(@$_REQUEST['cur']))
$_SESSION['BX_USER_CURRENCY']=$_REQUEST['cur'];
$arResult['CUR_LIST']=Array();
$lcur = CCurrency::GetList(($b="name"), ($order1="asc"), LANGUAGE_ID);
while($lcur_res = $lcur->Fetch())
{
$cur=Array();
$cur["CURRENCY"]=$lcur_res["CURRENCY"];
$cur["FULL_NAME"]=$lcur_res["FULL_NAME"];
$arResult['CUR_LIST'][]=$cur;
}
if (isset($_SESSION['BX_USER_CURRENCY'])&&(CCurrency::GetByID($_SESSION['BX_USER_CURRENCY'])))
{
foreach($arResult["PRICES"] as $key1=>$PRICE)
{
foreach($PRICE as $key2=>$value)
{
if (!in_array($key2,Array('CAN_ACCESS','CAN_BUY','CURRENCY','ID','VALUE_NOVAT','VALUE_VAT',
'VATRATE_VALUE','DISCOUNT_VALUE_NOVAT','DISCOUNT_VALUE_VAT','DISCOUNT_VATRATE_VALUE',
'VALUE','DISCOUNT_VALUE')))
$ModPRICE[$key1][$key2]=CurrencyFormat(CCurrencyRates::ConvertCurrency(doubleval($value), $PRICE['CURRENCY'], $_SESSION['BX_USER_CURRENCY']),$_SESSION['BX_USER_CURRENCY']);
elseif (in_array($key2,Array('VALUE_NOVAT','VALUE_VAT','VATRATE_VALUE','DISCOUNT_VALUE_NOVAT',
'DISCOUNT_VALUE_VAT','DISCOUNT_VATRATE_VALUE','VALUE','DISCOUNT_VALUE')))
$ModPRICE[$key1][$key2]=round(CCurrencyRates::ConvertCurrency(doubleval($value), $PRICE['CURRENCY'], $_SESSION['BX_USER_CURRENCY']),2);
elseif ($key2=='CURRENCY') $ModPRICE[$key1][$key2]=$_SESSION['BX_USER_CURRENCY'];
else $ModPRICE[$key1][$key2]=$value;
}
}
$arResult["PRICES"]=$ModPRICE;
}
|
Здесь осуществляется запись выбраной валюты в сессию и конвертирование цен продукта в выбранную валюту. Как вариант можно писАть идентификатор в куки.
На этом кастомизация компонента закончена.
3. Открываем на редактирование файл шаблона /bitrix/components/supercomponents/catalog.element/.default/template.php и в самоми начале после строчки '<div class="catalog-element">' (хотя это на ваше усмотрение) добавляем следующее код:
<form action="" method="post"> <select name='cur'> <?if(!$_SESSION['BX_USER_CURRENCY']||!$_SESSION['BX_USER_CURRENCY']=='default')?> <option selected value="default">по умолчанию</option> <? foreach($arResult['CUR_LIST'] as $currency):?> <option <?if($_SESSION['BX_USER_CURRENCY']==$currency['CURRENCY']) echo "selected";?> value='<?=$currency['CURRENCY'];?>'><?=$currency['FULL_NAME'];?></option> <?endforeach;?> </select> <input type=hidden name="change_c" value="Y"> <input type="submit" value="Выбрать" name="ok"> </form> |
Это форма со списком валют сайта. Пользователь может выбрать валюту, нажать на "Выбрать", в сессию записывается идентификатор валюты, в компоненте цены конвертируется в эту валюту.
Результат:



Всё действия, которые выполнялись в component.php можно выполнят в файле result_modifier.php. В этом случае, понадобится только кастомизация шаблона стандартного компонента. Шаблон компонента нужно скопировать в шаблон сайта, в папке шаблона создать файл result_modifier.php и изменить $arResult аналогично описанному выше.
Компонент