Битрикс не работает ajax catalog

ajax подгрузка каталога через catalog.section

Добрый день.
Помогите с задачей, я в тупике уже.

В общем надо подгружать товары в каталоге. Каталог разбит на категории и используется умный фильтр.

При прокрутке я хочу подгружать через ajax данные следующих страниц.

Сам файл, который должен отдавать каталог через ajax вот тут:

Если подключать только catalog.section, то он отдает часть нефильтрованного каталога.
Но если подключить умный фильтр, которым вроде бы надо отфильтровать этот каталог, то вывода вообще нет. Как будто в это фильтре где-то die() срабатывает.

Подскажите в чем может быть проблема. Или может я вообще не так действую?

После реализации этого вам останется только автоматически нажимать кнопку при прокрутке страницы до нее.

(у меня не получается)

У меня такие траблы:

2 шаг (Универсальная запись для получения ID )

вызывает ошибку
[ArgumentCountError]
Too few arguments to function CAjax::GetComponentID(), 2 passed in .
Насколько я понял, она должна срабатывать без явного указания имени компонента и имени шаблона компонента.

Помогите, пожалуйста, устранить эту ошибку. Судя по тому что метод принял 2 аргумента, но этого мало, то нужен какой-то третий?
Нашел первое упоминание о третьем параметре
http://bxapi.ru/src/?id=167176
Это additionalID
Жду от техподдержки информации о нём. ТП пока молчит.

Пробую установить третий параметр в true или false
Возвращаются разные строки, похожие на хеш (для одной и той же страницы)
при true: c14621aa8ca15f3da29628de69c79ce0
при false: 3a309761109eb8e10fe7903aa273a346

При этом, в html такие id встречаются только у кнопки. В других местах совсем другой код
82b30fe4e12768cb06626896c6887bb7
Причем, не как сказано в руководстве, «Битрикс обрамляет блок компонента в div с айди компонента» — у меня не так.
В компоненте появляется вышеуказанный код у каждого товара, но не в целом у блока.

подозреваю что bx_3966226736_79993 — обрамление но не уверен.

Источник

AJAX — проблемы с JS и CSS компонент

Добрый день!
Есть идея реализации странички с использованием AJAX:
На странице размещается вывоз 3х компонент, вводится переменная (допустим $_GET[«show»]), состояние которой и определяет, какой компонент отображать.
Вот идея и заключается в том, чтобы отображать эти компоненты без перезагрузки страницы.
При работе без ajax (т.е. переходе по ссылкам) проблем нет.

Столкнулся со следующей проблемой:
У меня есть страница /personal/index.php, ее структура аналогична структуре описаной в этом блоге , только компоненты используются

  • bitrix:sale.basket.basket
  • bitrix:subscribe.edit
  • bitrix:main.profile
Читайте также:  Screentoclient c не работает

Проблема в том, что, заходя в раздел, я попадаю на компонент bitrix:sale.basket.basket — все отлично. Когда я перехожу на вкладку с bitrix:main.profile, компонент подгружается, но не работают его JS и CSS.
Если зайти сразу на страницу с профилем /personal/index.php?show=profile, то скрипты и стили работают, но проблема с другими компонентами, загружаемых динамически (остается).
P.S.: ShowHeadStrings()?> и ShowHeadScripts()?> в head’е шаблона сайта есть.
Пробовал вываливать скрипты и стили компонент на страницу, еще до их вызова, т.е. сразу 3х компонент, внезависимости от того, какой потом вызовут.

Кто подскажет как быть, или может другой способ реализации?
(скрипты, подгруженные ajax’ом не доступны — почему?)

Источник

Ajax компонент после запроса отображается на пустой странице без шаблона. Не срабатывает аякс компонент

Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.

История одного бага

Сегодня описывал техподдержке один нетривиальный баг в работе компонентов в режиме ajax, да столько понаписал, что появилось желание посвятить этому багу пост во блоге.

Итак. Как известно, любой компонент битрикса гипотетически может работать в режиме ajax — для этого лишь надо в параметрах подключения компонента указать AJAX_MODE => Y. При наличии этой опции система сама подменяет нужные ссылки и сабмиты форм на js-вызовы ( документация ).

При клике по ссылке, ведущей на этот же компонент, серверу отправляется асинхронный запрос через XHR. При отправке же данных из формы передача данных происходит через скрытый iframe. Результат запроса в обоих случаях вставляется через innerHTML и, как следствие, js-скрипты при такой вставке не исполняются. Для обхода этого ограничения в битриксе были разработаны специальные методы для отработки javascript в контексте страницы.

Возвращаемся к проблеме. В 10 версии продукта сабмиты форм отлавливались путём добавления атрибута onsubmit к форме ( bitrix/modules/main/ajax_tools.php ):

И всё было прекрасно вне зависимости от набора данных, возвращаемых аякс-запросом.

В 11 версии обработчик на сабмит стал вешаться не через атрибут onsubmit , а байндингом с помощью addEventListener , т.е. подписка на событие происходит путем вызова js-кода. Вроде бы всё ок и в преобладающем большинстве случаев оно работает. Однако, из-за особенностей реализации выполнения js-кода, передаваемого компонентом в ответе, возможна ситуация, когда байндинг не будет происходить после получения ajax-ответа и всё будет ломаться. Вот в такой ситуации и оказались читатели одного интернет-СМИ.

Пользователь открывает страницу, на которой размещён компонент с формой и включенным аяксом. Система генерирует js-код, который навешивает обработчик сабмита формы:

Читайте также:  Как настроить принтер canon pixma mp250

300 миллисекунд, байндинг сабмита не происходит и следующий сабмит формы идёт уже не аяксом, а обычной перезагрузкой страницы, в итоге пользователь видит вывод компонента на пустой странице (т.к. AJAX_CALL=Y ).

По этой проблеме был создан тикет, но был получен отлуп — «У компонента iblock.element.add.form нет ajax режима работы». Формально всё верно, т.к. галочки соответствующей у компонента действительно нет.

Однако, есть документация по работе компонентов в режиме ajax, которая регламентирует аякс-режим работы любого правильно сделанного компонента. Что ж, не будем ничего доказывать, копаем сами. Возникновения подобной проблемы можно добиться на любом стандартном компоненте с долго отдаваемой фотографией. Сделать это очень просто — втыкаем на страницу комплексный компонент catalog со включённым компонентом фильтра. В шаблон каталога производим вставку картинки:

Отключаем временно показ этой картинки. Открываем каталог (ссылка вырезана цензурой:-)), нажимаем кнопку «Сбросить» в фильтре — каталог нормально отображается. Нажимаем ещё раз — всё ок.

Теперь подключаем картинку, проводим те же самые манипуляции. Нажимаем первый раз «Сбросить» — каталог прогрузился, однако, выскочила js-ошибка вида (копипаст из firebug):

При повторном нажатии на «Сбросить» страница уже перегружается и на ней отображается вывод компонента без шаблона сайта. Как раз то, что нужно — неведомый баг, который я отлавливал на протяжении полутора дней. Просто, быстро, но печально.

Стабильная повторяемость бага достигнута, теперь бы надо его пофиксить. Часик поразмышляв над нарисованными в тетради схемами вызовов всех функций, приводящих к багу, родилось два вариант
Из очевидных решений на ум пришло два:

1. Реализация deferred-обработчиков load+ready для ифрэйма с костылем под обычный xhr.

2. Двухстрочный файлов ядра, позволящий сделать исполнение js-кода, выводимого компонентов, всегда после замены вывода компонента, тем самым решая проблема с асинхронностью. Сурово, но иначе никак. Без копания в ядре нижеприведённый патч вам ничего не скажет, но разобрать проблему и не показать решение было бы подло:-)

./bitrix/modules/main/classes/general/component_ajax.php, __prepareScripts().
Исходная строка:
setTimeout(‘top.BX.ajax.__runOnload();’, 300);
Модифицированная строка:
top === self ? setTimeout(‘top.BX.ajax.__runOnload();’, 300) : null;

./bitrix/js/main/core/core_ajax.js, BX.ajax.submitComponentForm().
Исходная строка:
obForm.BXFormCallback = function(d) ;
Модифицированная строка:
obForm.BXFormCallback = function(d) ;

Как ни странно, столь развёрнутый разбор проблемы не вызвал никаких возражений со стороны саппорта, поэтому тикет погулял по нескольким ответственным и направился в отдел разработки. Бага признана незначительной, однако надеюсь, что фикс выйдет действительно в ближайших обновлениях системы, а не в далёком и туманном будущем

Источник

Почему в Битриксе не работает smart filter?

Столкнулся с проблемой: перестал работать смарт-фильтр каталога Битрикс (ajax-запрос возвращает пустой ответ, см. скриншот)
То есть после прощёлкивания опций/ ползунков фильтра происходит запрос к ajax, но не отрисовывается всплывающая подсказка «Выбрано 12» рядом с фильтром. Также после нажатия кнопки «Применить» ничего не происходит.

Пробовал менять флаг «AJAX_FILTER_CATALOG» и на «N», и на » Y», перетирал кэш, перестраивал фасетный индекс — ничего не помогло.
Даже обращался к инструкции https://aspro.ru/kb/article/33/ — тоже безрезультатно.

Фрагмент настроек модуля «Каталог» /catalog/index.php

Подскажите, куда смотреть? Возможно, что-то с ajax-обработчиком (не могу найти сам файл-обработчик)

  • Вопрос задан 28 нояб. 2020
  • 527 просмотров

Средний 2 комментария

происходит запрос к ajax, но не отрисовывается всплывающая подсказка «Выбрано 12» рядом с фильтром.

Ну так при ajax она и не должна отрисовываться

Пробовал менять флаг «AJAX_FILTER_CATALOG» и на «N», и на » Y»

Ни о чем не говорт, нестандартный параметр, обращайся к разработчикам этого костыля

Возможно, что-то с ajax-обработчиком (не могу найти сам файл-обработчик)

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

Для правильной работы фильтра в ajax режиме, должны быть указаны 2 параметра

Источник

Компонент в режиме AJAX_MODE внутри шаблона другого компонента

Добрый день. Есть очень непонятная проблема.
По порядку:
1. Есть структура шаблона для примера:

2. Есть страница со стандартным комплексным компонентом bitrix:catalog
В шаблоне элемента компонента bitrix:catalog.element (template.php) вставлен код компонента добавления результата веб формы bitrix:form.result.new .

Форма отлично работает.

Теперь проблема:
При переключении компонента bitrix:form.result.new в режим AJAX. (параметр AJAX_MODE=’Y’) едет верстка!

Должно быть так:

Т.е. весь основной контент сайта попадает в header. А теги в которых должен быть контент вставляются куда-нибудь между кодом компонента работающего в режиме AJAX.

Кто встречался с таким? Очень прошу помощи.

Пробовал такие варианты:
1. В основном файле шаблона (template.php) компонента bitrix:catalog.element убирал весь код который есть, оставлял только код компонента bitrix:form.result.new. — ПРОБЛЕМА СОХРАНЯЕТСЯ.
2. Вставлял код bitrix:form.result.new в файл element.php комплексного компонента catalog вместо всего что там есть (вместо вызова шаблона элемента) — ПРОБЛЕМА ИСЧЕЗАЕТ.
3. Просто ставил вызов компонента bitrix:form.result.new на чистую страницу с хедером и футтером. — ПРОБЛЕМЫ НЕТ

Т.е. проблема именно при размещении AJAX компонента в шаблоне другого компонента.
Нашел похожую тему, там был совет что подобный косяк с версткой может быть если где то в шаблонах компонентов используются отложенные функции. Но в данном случае ничего не нашел.

Источник

Оцените статью