вторник, 16 февраля 2021 г.

bitrix Обновление компонента в режиме ajax извне

 Задача у меня стояла связать умный фильтр и вывод списка новостей

в первом компоненте bitrix:catalog.smart.filter

добавляем

"INSTANT_RELOAD" => "Y",//обновлять при выборе

"AJAX_MODE" => "Y",//использовать ajax


во втором компоненте bitrix:news.list

"AJAX_MODE" => "Y",

в шаблоне компонента вверху добавляю id="compare-refresh"

...

$this->setFrameMode(true);

?>

<span id="compare-refresh"></span>

...

и теперь идём в шаблон  bitrix:catalog.smart.filter и открываем script.js, ищем функцию JCSmartFilter.prototype.postHandler = function (result, fromCache) (примерно 160 строка у меня)


после this.cacheKey = ''; перед закрытием функции добавляем

        let componenturl = removeParam('bxajaxid', url);//удаляем из url параметр bxajaxid

let compid = $("#compare-refresh").parent().prop('id');//ищем у второго компонента id там запсан его bxajaxid BX.ajax.insertToNode(componenturl+'&bxajaxid='+compid.replace("comp_", ""), compid);//собственно сам запрос который обновит компонент

и ниже добавляем функцию очистки параметра из url

function removeParam(key, sourceURL) {

  var splitUrl = sourceURL.split('?'),

    rtn = splitUrl[0],

    param,

    params_arr = [],

    queryString = (sourceURL.indexOf("?") !== -1) ? splitUrl[1] : '';

  if (queryString !== '') {

    params_arr = queryString.split('&');

    for (var i = params_arr.length - 1; i >= 0; i -= 1) {

      param = params_arr[i].split('=')[0];

      if (param === key) {

        params_arr.splice(i, 1);

      }

    }

    rtn = rtn + '?' + params_arr.join('&');

  }

  return rtn;

}

вот как выглядит у меня



Комментариев нет:

Отправить комментарий