• Как сделать, чтобы меню не закрывалось?

    @PetrPo
    Не понятно, о каких счетчиках идет речь и как stopPropagation их может блокировать? Приведи пример
  • Как сделать, чтобы меню не закрывалось?

    @PetrPo
    Чем же тебе так e.stopPropagation() не угодил?
    Ты спросил как сделать, я тебе написал. Хочешь костыли городить, тебе в первом ответе человек подсказывает как это сделать.
  • Вывод нужного количества элементов на странице Битрикс?

    @PetrPo
    И плюсани уже ответ, мы уже вышли за рамки вопроса)
  • Вывод нужного количества элементов на странице Битрикс?

    @PetrPo
    Я тут подумал, в использовании битриксового $APPLICATION->IncludeFile есть свои плюсы. Конечно придется сделать return $pageElementCount, но зато ты, как путевый программист получаешь возможность гибкого переиспользования кода. Конечно при таком малом объеме кода польза от этого мало ощутима, но все равно круто..
    .
    Вот, что я имею ввиду:
    Допустим ты решил сделать под своим catalog.section вывод новостей с той же логикой отображения количества товара, но количество должно быть не 18, 36, 54, 72, а к примеру 5,10,15. Сейчас получается, что ты будешь делать - скопируешь свой include файлик изменишь в нем $arAvailableCounts и подключишь его перед компонентом новостей.

    Что можно сделать используя $APPLICATION->IncludeFile. Вторым параметром в эту функцию можно передавать массив параметров, которые будут доступны внутри файла в массиве $arParams, тогда можно сделать что-то вроде такого:
    $pageElementCount = $APPLICATION->IncludeFile(SITE_DIR."/include/inc_sort_include.php", Array('COUNTS' => array(18, 36, 54, 72), 'DEFAULT_COUNT' => 10), Array("MODE" => "php", "NAME" => ""));

    А внутри файла:
    <?
    $arAvailableCounts = $arParams['COUNTS'];
    
    $pageElementCount = isset($_COOKIE['showBy']) && intval($_COOKIE['showBy']) ? $_COOKIE['showBy'] : $arParams['DEFAULT_COUNT'];
    
    if(isset($_GET['showBy']) && $_GET['showBy'] && in_array($_GET['showBy'], $arAvailableCounts)) {
      $pageElementCount = $_GET['showBy'];
      setcookie('showBy', $_GET['showBy'], 0, SITE_DIR);
    }
    ?>
    <div class="text-right">
      <span class="show_title">Показать по </span>
      <span class="number_list">
        <?foreach($arAvailableCounts as $value):?>
          <a class="<?=($value == $pageElementCount ? 'current' : '');?>" href="<?=$APPLICATION->GetCurPageParam('showBy='.$value, array('showBy'));?>" rel="nofollow"><span><?=$value;?></span></a>
        <?endforeach;?>
      </span>
    </div>
    
    <?return $pageElementCount;?>

    Тогда для новостей достаточно просто вызвать $APPLICATION->IncludeFile со своими параметрами
    $pageElementCount = $APPLICATION->IncludeFile(SITE_DIR."/include/inc_sort_include.php", Array('COUNTS' => array(5, 10, 15), 'DEFAULT_COUNT' => 10), Array("MODE" => "php", "NAME" => ""));
  • Как сюда добавить анимацию?

    @PetrPo
    В чем вопрос-то? там же готовый код
  • Вывод нужного количества элементов на странице Битрикс?

    @PetrPo
    Ну так все правильно ты сделал, либо require либо include, в твоем случае без разницы какую функцию использовать. В примере выше, я хотел простой пример показать, почему у тебя не работает. Область видимости всех переменных, которые ты объявляешь и используешь внутри функции, находится внутри функции (если переменные конечно не глобальные), в отличии от php include и require joxi.ru/l2ZW1d3tz0MWxA
    То есть при использовании битриксового IncludeFile твоя переменная $pageElementCount находится внутри, а снаружи ее нет и в компонент catalog.section ты передаешь пустоту, поэтому и товаров ноль
  • Как выполнить функции по очереди?

    @PetrPo
    Поправил код выше, не помогло?
  • Как выполнить функции по очереди?

    @PetrPo
    ага, не правильно. Попробуй так, если не поможет, выложи код на codepen
    $('.sortable-ui').sortable({
    	items: ".order_box:not(.nosort)",
    	connectWith: '.sortable-ui',
    	update: async function(event, ui) {
    		await (function() {
    			var id = ui.item.closest('.order_list').data('column');
    			ui.item.attr('data-column-item', id).addClass('updated');
    		})();
    		
    		await $(this).children().each(function (index){
    			if ($(this).attr('data-position') != (index+1)) {
    				$(this).attr('data-position', (index+1)).addClass('updated'); // подставляю класс updated если изменилась позиция
    			}
    		});
    		
    		saveNewPositions(); // это поиск классов $('.updated').each(function () {...}
    	}
    }).disableSelection();

    И думаю в этой строке parent() лишнее
    var id = ui.item.parent().closest('.order_list').data('column');
  • Как выполнить функции по очереди?

    @PetrPo
    То есть у тебя вот этот код не успевает выполниться?
    var id = ui.item.parent().closest('.order_list').data('column');
        ui.item.attr('data-column-item', id).addClass('updated');
  • Как выполнить функции по очереди?

    @PetrPo
    Или я вопрос не правильно понял... нужно дождаться окончания цикла each затем выполнить saveNewPositions() ?
  • Как выполнить функции по очереди?

    @PetrPo
    Вообще щас модно использовать async await, попробуй так
    $('.sortable-ui').sortable({
    	items: ".order_box:not(.nosort)",
    	connectWith: '.sortable-ui',
    	update: async function(event, ui) {
    		var id = ui.item.parent().closest('.order_list').data('column');
    		ui.item.attr('data-column-item', id).addClass('updated'); // подставляю класс updated если изменилась колонка
    		await $(this).children().each(function (index){
    			if ($(this).attr('data-position') != (index+1)) {
    				$(this).attr('data-position', (index+1)).addClass('updated'); // подставляю класс updated если изменилась позиция
    			}
    		});
    		saveNewPositions(); // это поиск классов $('.updated').each(function () {...}
    	}
    }).disableSelection();
  • Как выполнить функции по очереди?

    @PetrPo
    Если на первую вешаю то вторая не успевает отработать...

    не понял

    Выполни в консоли, такой простой пример, увидишь, что работает
    var arr = [];
    
    for(let i = 0; i < 5000; i++) {
    	arr[i] = Math.floor(Math.random() * 300);
    }
    
    $(arr).each(function(index) {
    	console.log('each');
    }).promise().done(function() {
    	console.log('stop');
    });
  • Вывод нужного количества элементов на странице Битрикс?

    @PetrPo
    Ты сделал не по моему совету, а сам додумал...
    Хочу тебе че-нить пафосное написать, типа... проблема в том, что ты ищешь проблему там где ее нет)) Ну да, ладно, то что делаешь, на пальцах выглядит так:
    - первый вариант
    function a() {
    	$a = 1;
    }
    
    $a = a();
    echo 'a = '.$a;

    - второй вариант
    function a() {
    	return $a = 1;
    }
    
    $a = a();
    echo 'a = '.$a;

    Надеюсь, смысл понятен, если нет сюда

    Мой вариант просто использовать incude
  • Вывод количества найденных товаров в умном фильтре не работает?

    @PetrPo
    Дело в параметре умного фильтра SAVE_IN_SESSION = Y, допиши
    var mark = ajaxURL.indexOf('?') !== -1 ? '&' : '?';
    this.bindUrlToButton('del_filter', ajaxURL + mark + 'del_filter=Y');
  • Вывод количества найденных товаров в умном фильтре не работает?

    @PetrPo
    пиши console.log(ajaxURL) смотри что приходит, по всей видимости ничего... в template.php ищешь где вызывается JCSmartFilter смотришь что в него передается, должен быть arResult['FORM_ACTION'] если все так. смотри что в этом самом FORM_ACTION... вообщем дебаж, я не экстрасенс, чтобы угадывать почему у тебя не работает
  • Вывод количества найденных товаров в умном фильтре не работает?

    @PetrPo
    С ЧПУ для комплексного компонента как раз первый мой код и нужен был.
    Без комплексного компонента (как у тебя на главной странице) для ЧПУ надо будет дописывать... новый битрикс))
  • Вывод количества найденных товаров в умном фильтре не работает?

    @PetrPo
    В resullt_modifier не надо ничего добавлять это лишнее, в $arResult['FORM_ACTION'] уже и так все это есть оказывается

    Полностью первая функция
    function JCSmartFilter(ajaxURL, viewMode, params)
    {
    	this.ajaxURL = ajaxURL;
    	this.form = null;
    	this.timer = null;
    	this.cacheKey = '';
    	this.cache = [];
    	this.popups = [];
    	this.inputsPrice = {};
    	this.viewMode = viewMode;
    
    	if (params && params.SEF_SET_FILTER_URL) {
    		this.bindUrlToButton('set_filter', params.SEF_SET_FILTER_URL);
    		this.sef = true;
    	}
    	else {
    		this.bindUrlToButton('set_filter', window.location.href);
    	}
    	
    	if (params && params.SEF_DEL_FILTER_URL) {
    		this.bindUrlToButton('del_filter', params.SEF_DEL_FILTER_URL);
    	}
    	else {
    		this.bindUrlToButton('del_filter', ajaxURL);
    	}
    }

    Вот первый параметр передаваемый в эту функцию и в this.bindUrlToButton('del_filter', ajaxURL) должны одинаково называться ajaxURL
  • Вывод количества найденных товаров в умном фильтре не работает?

    @PetrPo
    Вообщем, если у тебя фильтр без ЧПУ, придется еще кастомить
    В script.js function JCSmartFilter где if-ки идут замени их
    if (params && params.SEF_SET_FILTER_URL) {
    	this.bindUrlToButton('set_filter', params.SEF_SET_FILTER_URL);
    	this.sef = true;
    }
    else {
    	this.bindUrlToButton('set_filter', window.location.href);
    }
    
    if (params && params.SEF_DEL_FILTER_URL) {
    	this.bindUrlToButton('del_filter', params.SEF_DEL_FILTER_URL);
    }
    else {
    	this.bindUrlToButton('del_filter', ajaxURL);
    }

    В функции JCSmartFilter.prototype.postHandler проверка if (result.SEF_SET_FILTER_URL) после нее добавь
    else {
    	this.bindUrlToButton('set_filter', BX.util.htmlspecialcharsback(result.FILTER_URL));
    }

    В файле result_modifier.php в самом конце
    $arHiddens = array();
    foreach($arResult['HIDDEN'] as $arHidden) {
    	$arHiddens[] = $arHidden['CONTROL_NAME'].'='.$arHidden['HTML_VALUE'];
    }
    
    if($arHiddens) {
    	$arResult['FORM_ACTION'] = $arResult['FORM_ACTION'].'?'.implode('&', $arHiddens);
    }
  • Вывод количества найденных товаров в умном фильтре не работает?

    @PetrPo
    Да, блин, че-то полемика затягивается. Ты data-price проставил в template.php? его в 4 местах надо поставить (2 для min и 2 для max), без него естественно у тебя в фильтр попадут значения ползунков даже если ты их не трогал, value в input проставлен ведь! Проверь, поставь где надо этот параметр, так сказать абстрагируйся от того, что он data-price называется, нужен он не только для цены, но и для других ползунков тоже.
    Конечно, я соглашусь, что тупо называть все опираясь на price, если это используется не только для цены, просто если посмотреть шаблон и script.js все функции, классы и прочее называется с использованием price, вот я и решил от общей картины не отходить, думал так будет понятнее
  • Вывод количества найденных товаров в умном фильтре не работает?

    @PetrPo
    У меня все норм, что должно быть открыто - открывается, что должно быть закрыто - закрывается.
    Что там может быть не так, если ты конечно не накостомил чего-то. В массиве есть DISPLAY_EXPANDED, формируется в component.php, там есть проверка типа если в $_GET есть свойство тогда жестко задается DISPLAY_EXPANDED = Y в template.php по этому флагу добавляется класс bx-active, от него в css ставится display:block