показать полностью
Пользователь 71716  -> Примеры частных решений
25 Февраль, 2013 14:32
Постраничка как в соц. сетях.
Всем мы знаем эти бесконечные ленты новостей в соц. сетях. И это мне кажется удобно, когда контент подгружаться постепенно и не требуется щелкать на каждую страницу и жать пока она загрузиться.  Вот шаблон компонента bitrix::system.pagenavigation:

Код template.php
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?>
<?CJSCore::Init(array("jquery"));?>
<?
$arResult["NavQueryString"] = str_replace('&','&',$arResult["NavQueryString"]);
$do = preg_match('/.*bxajaxid=(\S+).*/',$arResult["NavQueryString"],$bxajaxid);
?>
<sc ript>
   var ajax_nav = <?=CUtil::PhpToJSObject($arResult)?>;
   var bxajaxid = "<?=$bxajaxid[1]?>";
</sc ript>
<?
if(!$do)
{
   ?>
   <div id ='ajax_nav'>
   </div>
   <sc ript type="text/javascript">
      /* isset for javascript */
      window.isset = function()
      {
         if (arguments.length===0) return false;
         var buff=arguments[0];
         for (var i=0; i<arguments.length; i++)
         {
            if (typeof(buff)==='undefined') return false;
            buff = buff[arguments[i+1]];
         }
         return true;
      }
      BX.ready(
         function()
         {
            $(window).scroll(
               function()
               {
                  if($(window).scrollTop()+$(window).height()>=$('#ajax_nav').offset().top)
                  {
                     if (ajax_nav.NavPageCount > ajax_nav.NavPageNomer )
                     {
                        if(bxajaxid.length == "")
                        {
                           bxajaxid = $('#ajax_nav').parents("div[id*='comp_']").attr('id').replace('comp_','');
                           url = location.pathname+'?PAGEN_'+ajax_nav.NavNum+'='+(parseInt(ajax_nav.NavPageNomer)+1)+'&bxajaxid='+bxajaxid+'&'+ ajax_nav.NavQueryString
                        }
                        else url = location.pathname+'?PAGEN_'+ajax_nav.NavNum+'='+(parseInt(ajax_nav.NavPageNomer)+1)+'&'+ ajax_nav.NavQueryString;
                        if (!isset(window, "ajax_sent")) //&& )
                        {
                           ajax_sent = true;
                           $('#ajax_nav').addClass('bx-core-waitwindow'); 
                           $.get(url,function(data)
                              {
                                 $('#ajax_nav').removeClass('bx-core-waitwindow');
                                 bxajaxid = $('#ajax_nav').before(data);
                                 ajax_sent = false;
                              });

                        }else if (ajax_sent == false)
                        {
                           ajax_sent = true;
                           $('#ajax_nav').addClass('bx-core-waitwindow');
                           $.get(url,function(data)
                              {
                                 $('#ajax_nav').removeClass('bx-core-waitwindow');
                                 bxajaxid = $('#ajax_nav').before(data);
                                 ajax_sent = false;                                 
                              });
                        }
                     }
                  }
               });
         });
   </sc ript>
<?}?> 
Данный шаблон работает только  в ajax режиме, не забудьте включить его для компонента в котором будете использовать.

capture.png

Достаточной распаковать архив шаблона в /bitrix/#Шаблон сайта#/components/bitrix/system.pagenavigation.
И указать его в настройках постраничной навигации.

capture_2.png
P.S: В шаблоне списка могут быть элементы вывод, которых требуется только 1 раз. Например - фильтр, или ссылка на подключения к  RSS -каналу.
То вывод данных элементов я бы посетовал заключить в условие.
if(!isset($_REQUEST['bxajaxid'])){
   #Часть кода которая должна отработать однократно на страницы.#
} 
ajax_infinity_list.zip (2.1 КБ)
Mashkov Alex
Максим Месилов  Нет в адресную строку я не чего не подставляю, но если все таки данный параметр будет передан, то он откроется корректно и продолжит пагинацию от туда.
0 Ещё
Сазонов Станислав
Alex Mashkov, У меня траблы( догружает только до 6ой страницы( и все... Что не так?(
0 Ещё
Mashkov Alex
Сазонов Станислав, Проблема еще актуальна?
0 Ещё
показать полностью
Пользователь 71716  -> Примеры частных решений
25 Октябрь, 2013 11:30
Типовая задача
Часто сталкиваюсь с тем, что пользователям  требуется решить задачу вставки описания раздела в список товаров. Хочу отметить что эти данные уже есть в результирующем массива компонента ( $arResult['DESCRIPTION'] ).
Вот пошаговая инструкция.
Шаг 1.
592_myagkaya_mebel_divany_krovati_1514_bitrixlabs_ru_catalog_upholstered_bitrix_include_areas_y_clear_cache_y.png
Шаг 2.
593_myagkaya_mebel_divany_krovati_1514_bitrixlabs_ru_catalog_upholstered_bitrix_include_areas_y_clear_cache_y.png
Код:
<?=$arResult['DESCRIPTION']?> 
Результат.
594_myagkaya_mebel_divany_krovati_1514_bitrixlabs_ru_catalog_upholstered_bitrix_include_areas_y_clear_cache_y.png

Усложним задачу, а что если нам нужно выводить часть перед и часть после списка товаров. Есть два способа решения.
1. Создать пользовательской поле раздела с типом html/text, и выводить его содержимое в шаблоне компонента.
2. Использовать в описание раздела зарание предусмотренный разделитель. Разделителем может быть любой порядок символов.
Минусом первого решения является отсутствие визуального редактора для поля типа html/text. По этому расскажу как сделать по второму способу.

В качестве разделителя будем использовать html тег разрыва станицы.
<BREAK /> 
Его можно вставить в текст описания раздела через визуальный редактор, при редактирование в административной части сайта.

596_produktsiya_razdel_redaktirovanie_internet_magazin_1197_bitrixlabs_ru_bitrix_admin_iblock_section_edit_php_id_6_type_catalog_lang_ru_iblock_id_3_find_section_section_0.png

Код в шаблоне компонента измениться.
Для верхней части описания.
597_myagkaya_mebel_divany_krovati_1197_bitrixlabs_ru_catalog_upholstered_bitrix_include_areas_y_clear_cache_y.png
Код:
<?
$arDESCRIPTION = split('<BREAK />',$arResult['DESCRIPTION']);
//Проверяем разбилось ли описание на две части 
if(count($arDESCRIPTION) == 2){
   echo $arDESCRIPTION[0];
}else{
   //иначе выводим описание полностью в верхней части сайта. 
   echo $arResult['DESCRIPTION'];
}
?> 
Для нижней части.
598_myagkaya_mebel_divany_krovati_1197_bitrixlabs_ru_catalog_upholstered_bitrix_include_areas_y_clear_cache_y.png
Код:
<?
if(count($arDESCRIPTION) == 2){
echo $arDESCRIPTION[1];
}
?> 
Результат.
599_myagkaya_mebel_divany_krovati_1197_bitrixlabs_ru_catalog_upholstered_bitrix_include_areas_y_clear_cache_y.png
Межнин Дмитрий
Добрый день, Алексей!
Функцию split использовать не рекомендуется

Function split() is deprecated
 
0 Ещё
Mashkov Alex
Межнин Дмитрий,  
$arDESCRIPTION = preg_split("/[\s<BREAK \/>]+/", $arResult['DESCRIPTION']");
1 Ещё
показать полностью
Пользователь 71716  -> Примеры частных решений
22 Декабрь, 2013 13:33
Контролер сайтов в обратную сторону.
Контроллер сайтов это мало используемый функционал, но он обладает широким  спектром возможностей. http://www.1c-bitrix.ru/products/cms/...tures-link

Для исполнения кода на клиенте есть  созданный функционал - http://dev.1c-bitrix.ru/learning/cour....4546.2891.

Но есть и не документированная возможность вызова зарание написанной функции на контроллер по событию с клиента.
Для этого на контролере создается обработчик события.

 AddEventHandler("controller", "OnSomeEvent", "notifyControllerOnSomeEvent");
function notifyControllerOnSomeEvent($arClient, $param1, $param2 ......)
{
}

Клиентский код:
$eventParams[] = $param1; 
$eventParams[] = $param2;  
CControllerClient::ExecuteEvent("OnSomeEvent", $eventParams); 

Это можно использовать для синхронизации данных в обе стороны.
Долганин Антон
Ого, круто. Спасибо большое.
0 Ещё
Левый Иван
Интересно
0 Ещё
показать полностью
Пользователь 71716  -> Примеры частных решений
23 Июль, 2013 18:45
Синхронизация остатков на складе торгового предложения и товара.
В 12 версии БУС появился интересный компонент bitrix:catalog.store.amount. Он позволяет отобразить остатки по складам для данного товара. Но не умеет учитывать остатки указанные в торговых предложениях.
Вот код обработчика который позволит синхронизировать остатки. То есть в момент редактирования количества на складе для торгового предложения мы подсчитываем все остатки по остальным предложениям и сохраняем их у товара.

<?
AddEventHandler("catalog", "OnStoreProductUpdate","MyOnStoreProductSave");
AddEventHandler("catalog", "OnStoreProductAdd","MyOnStoreProductSave");
define("LOG_FILENAME", $_SERVER["DOCUMENT_ROOT"]."/log.txt");
function MyOnStoreProductSave($id, $arFields){   
   $allAmount = $arFields['AMOUNT'];
   if(CModule::IncludeModule('catalog') & CModule::IncludeModule('iblock')){
      //Получаем информацию о товаре привязанном к данному приложения, вмести с этим проверяем не является ли это товаром.      
      $arProductInfo = CCatalogSKU::GetProductInfo($arFields['PRODUCT_ID']);            
      if(is_array($arProductInfo)){
         //Получаем данные о инфоблоке Торговых предложений
         $arOffersInfo = CCatalogSKU::GetInfoByProductIBlock($arProductInfo['IBLOCK_ID']);         
         $arFilter = Array(
            'IBLOCK_ID'=>$arOffersInfo['IBLOCK_ID'],
            "PROPERTY_".$arOffersInfo['SKU_PROPERTY_ID']=>$arProductInfo['ID'],
            "!ID"=>$arFields['PRODUCT_ID']
         );
         //Получаем список торговых предложений.
         $obOffersList = CIBlockElement::GetList(Array("SORT"=>"ASC"),$arFilter,false,false,array());
         $arOffers = array();
         while($arOffers = $obOffersList->Fetch()){
            //Получаем данные об остатках на складе для торгового предложения.
            $obStoreOffer = CCatalogStoreProduct::GetList(array(), array('STORE_ID'=>$arFields['STORE_ID'], 'PRODUCT_ID' =>$arOffers['ID']), false,false,array());
            while($arStore = $obStoreOffer->Fetch()){
               $arAllStore[] = $arStore;
               $allAmount = $allAmount + $arStore['AMOUNT']; 
            }               
         }   
         //Получаем данные о складе товара и формируем массив для обновления данных.
         $obStoreProduct = CCatalogStoreProduct::GetList(array(), array('STORE_ID'=>$arFields['STORE_ID'], 'PRODUCT_ID' =>$arProductInfo['ID']), false,false,array());         
         $arFieldsProduct = array (
             'PRODUCT_ID' => $arProductInfo['ID'],
             'STORE_ID' => $arFields['STORE_ID'],
             'AMOUNT' => $allAmount,
           );
       $result = FALSE;
         if($arStoreProduct = $obStoreProduct->Fetch()){            
           $result = CCatalogStoreProduct::Update($arStoreProduct["ID"],$arFieldsProduct);                  
         }else{
           $result = CCatalogStoreProduct::Add($arFieldsProduct);         
         }       
       if($result){          
          $obStoreProduct = CCatalogStoreProduct::GetList(array(), array('PRODUCT_ID' =>$arProductInfo['ID']), false,false,array());
            while($arStoreProduct = $obStoreProduct->Fetch()){
               $allAmountProduct = $allAmountProduct + $arStoreProduct['AMOUNT'];         
             }                     
          $arFieldsProduct = array(
            "QUANTITY" => $allAmountProduct,
         ); 
          CCatalogProduct::Update ($arProductInfo['ID'],$arFieldsProduct);
       }
      }   
   }   
}
?>
Mashkov Alex
Поправил код теперь после подсчета остатков обновляется и доступное количество как сумма всех остатков на складе товара.
0 Ещё
показать полностью
Пользователь 71716  -> Примеры частных решений
25 Ноябрь, 2013 20:12
Используем JS код с PHP в собственных шаблонах веб форм.
Иногда требуется  внести данные в поля веб формы из других источников, из сессии, из глобальных переменных, из параметров переданных на страницу, из произвольного кода. И все это можно сделать не кастомизируя шаблон компонента.
Во первых нужно правильно подключить наш файл скрипта в шаблоне веб формы.

686_forma_zayavki_54_229_163_199_services_requests_form_php_web_form_id_it_troubleshooting_s1.png

Во вторых весь требуемый нам js и php код будем реализовывать в подключенном файле. Не нужно не каких дополнительных запросов для получения данных о веб форме, вопросах и полях делать не нужно они уже все есть в объекте, по этому наш скрипт начнем с формирования нескольких объектов.

<?if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();?>
<script>
    var arParams = <?=CUtil::PhpToJSObject($FORM->arParams)?>;
    var arForm = <?=CUtil::PhpToJSObject($FORM->arForm)?>;
    var arQuestions = <?=CUtil::PhpToJSObject($FORM->arQuestions)?>;
    var arAnswers = <?=CUtil::PhpToJSObject($FORM->arAnswers)?>;
    var arDropDown = <?=CUtil::PhpToJSObject($FORM->arDropDown)?>;
    var arMultiSelect = <?=CUtil::PhpToJSObject($FORM->arMultiSelect)?>; 
Поиск конкретного  поля для указания его значения следует использовать правила формирования имен HTML полей веб-форм (http://dev.1c-bitrix.ru/api_help/form...lnames.php).

Вот пример кода формирования для поля с типом текст.

function SetValue(Question,value){
    switch (arQuestions[Question].TITLE_TYPE) {
        case 'text':
            //form_text_answer_id
            for(var index in arAnswers[Question]) {
                document.getElementsByName('form_'+arQuestions[Question].TITLE_TYPE+'_'+arAnswers[Question][index].ID)[0].value = value;
            }
            break;
        case 'textarea':
            //form_textarea_answer_id
            break;
        case 'password':
            //form_password_answer_id
            break;
        case 'date':
            //form_date_answer_id
            break;
        case 'radio':
            //form_radio_question_sid
            break;
        case 'dropdown':
            //form_dropdown_question_sid
            break;
        case 'checkbox':
            //form_checkbox_question_sid[]
            break;
        case 'multiselect':
            //form_multiselect_question_sid[]
            break;
        case 'hidden':
            //form_hidden_answer_id
            break;
    }
}
</script> 
123.php (1.52 КБ)
Малков Евгений
Лучше б виз. редактор  не зарезает js?
Никогда не использовал визуальные шаблоны из-за их ограниченности.
По моему проще сделать через шаблон компонента.
2 Ещё
Левый Иван
да, я тоже обычно это через шаблон компонента делаю, в нем больше возможностей
хотя начинал делать веб-формы когда-то в своё время тоже через этот механизм, но после дня ковыряний решил отказаться от этого подхода.
0 Ещё
Малков Евгений
Иван Левый , ну я когда начинал, еще не этого механизма не было не компонентов 2.0 :)
1 Ещё
показать полностью
Пользователь 71716  -> Примеры частных решений
28 Октябрь, 2013 9:32
Еще типовая задача или добавляем видео в курс
Описание курса это html сформированный визуальным редактором. Визуальный редактор предполагает возможность использования роликов, для этого даже есть кнопка вставить Flash - ролик. Но это именно флеш ролик, а что делать если видео в форма avi, flv, mp4 или звуковой файл mp3. Для этого можно использовать зарание созданный html объект ролика. Поможет в этом стандартный компонент "Медиа проигрыватель" ( http://dev.1c-bitrix.ru/user_help/con...player.php ).
И так:
1) Создаем новую станицу и размещаем компонент bitrix:player.

607_arkhiv_video_54_229_163_199_about_media_php_bitrix_include_areas_n_clear_cache_y.png
608_arkhiv_video_54_229_163_199_about_media_php_bitrix_include_areas_n_clear_cache_y.png
2) Проверяем, что видео проигрывается так как нужно.

3) Теперь можем скопировать содержимое данного тега.

Правой кнопкой возле плеера, и выбираемым "Исследовать элемент" (в разных браузерах может называться по разному.).

609.png
В структуре документа находим заранее установленный нами тег, и копируем его содержимое.

610.png
4) Переходим к курсу в котором требуется использовать данный видео материал. Открываем форму редактирования урока и в режиме кода вставляем содержимое буфера обмена.

610_adaptatsiya_rabotnika_v_novom_kollektive_54_229_163_199_services_learning_course_php_course_id_1_lesson_id_4_lesson_path_1_4_clear_cache_y.png
Теперь ролик проигрывается и на странице курса.

611_adaptatsiya_rabotnika_v_novom_kollektive_54_229_163_199_services_learning_course_php_course_id_1_lesson_id_4_lesson_path_1_4_clear_cache_y.png

Как обещают разработчик в новой версии визуального редактора подобный функционал будет реализован.
показать полностью
Пользователь 71716  -> Примеры частных решений
23 Октябрь, 2013 19:04
Документация по REST API в твоем Б24
Опубликовано приложение "Документация по REST API" (http://www.bitrix24.ru/marketplace/?a...ix.restapi), которое может весьма помочь в разработке и тестировании. Приложение представляет собой документацию по API (http://dev.1c-bitrix.ru/rest_help/) с интегрированной консолью Firebug Lite, позволяющей работать с API вручную или запускать примеры из документации.

1.png
Данное решение поможет в разработки приложений 1-го типа (https://dev.1c-bitrix.ru/learning/cour....5377.5378). По сути, каким оно и является.

2.png
В приложение нет ограничений для доступа только администратору так, что работу методов можно проверить для пользователей с разными правами.
Так же хотелось бы отметить, что в не которых примерах нет возможности выполнить код сразу. Это сделано специально в связи с особенностью данных методов.

Буду рад если оно поможет Вам.



 
показать полностью
Пользователь 71716  -> Примеры частных решений
29 Октябрь, 2012 18:23
Автоматическое изменение картинок при написании новости или статьи.
Скрипт, который я хочу вам предложить, может помочь при написании статей или новостей на сайте.  Он позволит не тратить время на изменения размеров изображения анонса или детального описания.
Скрип является  обработчиком создания и сохранения элемента инфоблока.  Он получает настройки инфоблока и на основании их осуществляет имение размеров картинок, находящихся в описание.
Код (/bitrix/php_interface/init.php)

   AddEventHandler("iblock", "OnBeforeIBlockElementAdd", Array("IblockClass", "OnBeforeIBlockElementSaveHandler"));
   AddEventHandler("iblock", "OnBeforeIBlockElementUpdate", Array("IblockClass", "OnBeforeIBlockElementSaveHandler"));
   class IblockClass
   {    
   
   function OnBeforeIBlockElementSaveHandler(&$arFields)
   {
      $arIblockFields = CIBlock::GetFields($arFields["IBLOCK_ID"]); //Получение параметров инфоблока 
      $arPole array ("PREVIEW_PICTURE","DETAIL_PICTURE"); 
      foreach ($arPole as $pole)
      {//Формируем массив размера изображения
      $arSize = array(
      "width" => $arIblockFields[$pole][DEFAULT_VALUE][WIDTH],
      "height" => $arIblockFields[$pole][DEFAULT_VALUE][HEIGHT]
      );    
      if ($arFields[$pole.'_TYPE'] == 'html')
      {
         $text = &$arFields['DETAIL_TEXT'];
         //осуществляем поиск тегов img
         preg_match_all('/<img[^>]+src=["\']([^"\']+)["\'][^>]*>/msi',$text,$regs);   
         foreach($regs[0] as $k => $v)
         {
         if (strpos($v, 'scaled') !== false)
            continue;
         $ar = split('/',$regs[1][$k]);   
         //формируем массив описывающйи файл
         $arFileGMS = getimagesize($_SERVER['DOCUMENT_ROOT'].$regs[1][$k]);          
         $arFile["FILE_NAME"] = end($ar);
         $arFile["SUBDIR"] = '';
         $arFile["WIDTH"] = $arFileGMS[0];
         $arFile["HEIGHT"] = $arFileGMS[1];
         foreach($ar as $kpath=>$vpath)
         {
            if($vpath and !($vpath == 'upload'))
            {
            if($kpath < (count($ar)-2))   $arFile["SUBDIR"] .= $vpath.'/';
            elseif($kpath < (count($ar)-1)) $arFile["SUBDIR"] .= $vpath;
            }
         }
         $arFile[CONTENT_TYPE]= $arFileGMS['mime'];
         //изменяем размер.
         //BX_RESIZE_IMAGE_EXACT - масштабирует в прямоугольник $arSize без сохранения пропорций
         //BX_RESIZE_IMAGE_PROPORTIONAL - масштабирует с сохранением пропорций, размер ограничивается $arSize
         //BX_RESIZE_IMAGE_PROPORTIONAL_ALT - масштабирует с сохранением пропорций, размер ограничивается $arSize, улучшена обработка вертикальных картинок
         $arFF = CFile::ResizeImageGet($arFile, $arSize, BX_RESIZE_IMAGE_PROPORTIONAL, FALSE);          
         //подменяем параметры изображения в тексте описания.
         $v_new = preg_r eplace('/src=["\'][^"\']+["\']/msi','\0 scaled="Y"',$v); 
         $v_new = preg_r eplace('/src=["\']?[^"\']+["\']?/msi','src="'.$arFF['src'].'"',$v_new);      
         $v_new = preg_r eplace('/width=["\']?[^"\']+["\']?/msi','width="'.$arSize["width"].'"',$v_new);
         $v_new = preg_r eplace('/height=["\']?[^"\']+["\']?/msi','height="'.$arSize["height"].'"',$v_new);
         $text = str_r eplace($v, $v_new, $text);
         }
      }
      }
   }
   } 

Также можно автоматически добавлять водяной знак к данным изображениям.  Для этого следует задать 5-ый параметр $arFilter метода CFile::ResizeImageGet. Использование его описано в комментариях к данному методу документации разработчиков (http://dev.1c-bitrix.ru/api_help/main...geget.php).
До нажатия кнопки "Применить".
do_nazhatiya_primenit.png
После нажатия "Применить".
posle_nazhatiya_primenit.png
Kriachek Mikhail
это будет работать только если изображение находится в директории /upload/
0 Ещё
Левый Иван
Классная идея, спасибо!
0 Ещё
Лисицкий Денис
Спасибо, воспользовался идеей в своей задаче
1 Ещё
показать полностью
Пользователь 71716  -> Примеры частных решений
29 Июль, 2013 9:48
Преобразуем фильтр по цене
Не так давно в компоненте каталог появилась возможность выводить цены в одной валюте. Все работает замечательно.
Но вот фильтрация при таком выводе очень "хромает", фильтр строиться без учета валюты и ее курса.
При использование умного фильтра на входе мы имеем:

$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',
    ),
  ),
) 
То есть мы считаем, что фильтр у нас задан в валюте, которая указанна в настройках компонента и конвертируем ее значения во все валюты которые у нас есть в системе.
Жуков Евгений
Алексей, пост рассчитан на ситуацию, когда магазин имеет различных поставщиков и цены у него в разных валютах. Продажа идет, как и положено, в одной валюте, заданной в настройках Интернет-магазина, с конвертацией по курсу. Что же касается законодательства в сфере торговли - это к юристам.
1 Ещё
Забродин Роман
С ходу, у нашего программиста, код не завелся. Возможно что это он что-то не так сделал. Позже выделим время и будем пробовать еще  раз..
0 Ещё
Mashkov Alex
Роман Забродин Скрипт писался в стандартном решение eshop и работает если вставить между умным фильтром и компонентом списка.
1 Ещё
показать полностью
Пользователь 71716  -> Примеры частных решений
20 Февраль, 2013 11:52
Поиск всегда под рукой.

В ходе одного обсуждения с моими коллегами. Родилась идея создать опцию поиска информации по сайту, «из под руки». Суть идее в том, что когда мы встречаем в тексте не понятную нам терминологии или сочетание фраз, выделив данный текст мы бы сразу получили запрос к поисковой системе.  В итоге получился следующий js скрипт.


$('body').mouseup(f unction (e){    if (wind ow.getSelection) selection = wind ow.getSelection();     else selection = docu ment.selection.createRange().text;    q_str = ''+selection+'';     if ((q_str.length<50)&&(q_str.length <3))    {        $('#selection-search').addClass('bx-core-waitwindow');        $('#selection-search').css('display','block');        $('#selection-search').css('left', e.pageX);        $('#selection-search').css('top', e.pageY);        a lert (q_str.length);        $.ajax({            type: 'POST',            url: docu ment.location.href,            dat a: {INPUT_ID:'title-search-input', // Имя тега INPUT, для сайтов по умолчанию 'title-search-input', для КП 'search-textbox-input'                ajax_call: 'y',                q: q_str },            success: f unction(data)            {                $('#selection-search').removeClass('bx-core-waitwindow');                $('#selection-search').css('border', '1px solid red');                $('#selection-search').html(data);            }            ,        });    }});$('body').append("<div id=\"selection-search\"></div>")    $('#selection-search').css('display','none');$('#selection-search').css('position', 'absolute');$('#selection-search').mouseleave(f unction (){    $('#selection-search').css('display','none');});


P.S. скрип на писан на совместимой с  Битрикс js библиотеке jquery.
skrin.png
Долганин Антон
Прикольно :) но из разряда "побоаловаться, но в сайт не включать". Выделение никогда не должно вести к действию, ибо подавляющее большинство людей, читая, выделяет текст/слова, и после 3-го внезапного popup уйдет с сайта.
2 Ещё
Mashkov Alex
Антон Долганин
Я все таки немого ограничил
if ((q_str.length<50)&&(q_str.length <3)
Все зависит от дизайна сайта можно выводить как сваливающее область сбоку или снизу
0 Ещё
Шевчик Игорь
Самое место такому функционалу в хелпе API или в модуле обучения. Единствнно доработать поиск еще и по сожержанию. Ну и BX js прикрутить ;)
0 Ещё

Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».