+7 495 008 8452
  • Загрузка
Выберите ваш цвет
Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.


Источник: http://dev.1c-bitrix.ru/community/webdev/user/71716/blog/8101/

Преобразуем фильтр по цене

Не так давно в компоненте каталог появилась возможность выводить цены в одной валюте. Все работает замечательно.
Но вот фильтрация при таком выводе очень "хромает", фильтр строиться без учета валюты и ее курса.
При использование умного фильтра на входе мы имеем:

$arrFilter = array (
  'OFFERS' => NULL,
  '><CATALOG_PRICE_1' => 
  array (
    0 => '1572',
    1 => '11405',
  ),
); 
Вот код который поможет модифицировать фильтр так чтобы учитывались значений разных валют.

 <?  // Elements dop filter
global ${$arParams["FILTER_NAME"]};
$ardopFilter = &${$arParams["FILTER_NAME"]};
//echo htmlspecialcharsbx(var_export($ardopFilter,1));
foreach ($ardopFilter as $key=>$val){
   $match = array();   
   preg_match_all('/CATALOG_PRICE_(\S+)/msi',$key,$match);
   if(count($match[1][0])>0){
      unset($ardopFilter[$key]);
      $dopFilter = array(
         "LOGIC" => "OR",
      );
      $obCurrency = CCurrency::GetList();         
      while($arCurrency = $obCurrency->Fetch()){
         if($arParams["CURRENCY_ID"] == $arCurrency['CURRENCY']){
            $dopFilter[] = array(
               $key => $val,
               'CATALOG_CURRENCY_'.$match[1][0] => $arCurrency['CURRENCY'],
            );
         }else{
            if(is_array($val))
            $dopFilter[] = array(
               $key => array(
                  CCurrencyRates::ConvertCurrency($val[0],$arParams["CURRENCY_ID"],$arCurrency['CURRENCY']),
                  CCurrencyRates::ConvertCurrency($val[1],$arParams["CURRENCY_ID"],$arCurrency['CURRENCY']),                  
               ),
               'CATALOG_CURRENCY_'.$match[1][0] => $arCurrency['CURRENCY'],
            );
            else 
            $dopFilter[] = array(
               $key => CCurrencyRates::ConvertCurrency($val,$arParams["CURRENCY_ID"],$arCurrency['CURRENCY']),
               'CATALOG_CURRENCY_'.$match[1][0] => $arCurrency['CURRENCY'],
            );
         }
            
      }
   }                            
}
$ardopFilter[] = $dopFilter;
//echo htmlspecialcharsbx(var_export($ardopFilter,1));
?>
Данный код подходит для вызова его после компонента умный фильтр в шаблоне комплексного компонента section.php
И в итоге мы получим следующий фильтр.


$arrFilter = array (
  'OFFERS' => NULL,
  0 => 
  array (
    'LOGIC' => 'OR',
    0 => 
    array (
      '><CATALOG_PRICE_1' => 
      array (
        0 => '1572',
        1 => '11405',
      ),
      'CATALOG_CURRENCY_1' => 'RUB',
    ),
    1 => 
    array (
      '><CATALOG_PRICE_1' => 
      array (
        0 => 51.829871414441,
        1 => 376.03033300363,
      ),
      'CATALOG_CURRENCY_1' => 'USD',
    ),
    2 => 
    array (
      '><CATALOG_PRICE_1' => 
      array (
        0 => 40.328373524885,
        1 => 292.58594150847,
      ),
      'CATALOG_CURRENCY_1' => 'EUR',
    ),
    3 => 
    array (
      '><CATALOG_PRICE_1' => 
      array (
        0 => 416.97612732095,
        1 => 3025.198938992,
      ),
      'CATALOG_CURRENCY_1' => 'UAH',
    ),
  ),
) 
То есть мы считаем, что фильтр у нас задан в валюте, которая указанна в настройках компонента и конвертируем ее значения во все валюты которые у нас есть в системе.

Назад в раздел

Подписаться на новые материалы раздела:
Загрузка...