С версии битрикса 17.5.10 добавился новый функционал по работе с аяксом. Теперь можно вызывать аяксом методы модуля или методы компонента без необходимости выполнения шаблона сайта. То есть по запросу выполнится только немного служебного кода и собственно сам метод.
На клиенте все довольно просто. Мы должны отправить обычный аякс запрос по адресу /bitrix/services/main/ajax.php
В js библиотеке битрикса есть методы которые самостоятельно формируют запрос, запись получается слегка короче, чем при написании запроса другими способами. Я покажу примеры запросов на битриксовой библиотеке и на jquery
Микулич Евгений написал: csrf токен не должен быть привязан к пост запросу, хотя смысла без POST он не имеет, тем не менее
"Ядро (main) Версия 18.0.9 Разработчикам: AJAX-контроллер теперь требует CSRF-токен в том числе для GET-запросов."
Уже сделали Я после этого обновления вообще узнал о новом функционале, в чатик скинули вопрос о чем речь вообще, никто не знал особо, я решил посмотреть.
Шубин Александр, Например запрашиваю я страницу /bitrix - для этого запроса набор посредников, один из которых проверяет авторизацию (то есть права на доступ к этой папке)
Микулич Евгений написал: Простой HTTP запрос - это имеется в виду. НЕ аяксовый
Ну так с точки зрения http протокола аякс и не аякс запросы одинаковые. Никаких отличий между ними нет, те же GET, POST, PUT. Даже в заголовках различие опциональное, битрикс добавляет свой заголовок bx-ajax и jquery тоже что-то типа x-requsted-with добавляет. Просто отдельный заголовок, в остальном там данные идентичные.
Я пытаюсь понять про что ты, то есть хочешь, чтобы не просто на отдельной странице, которая специально для аякса создана, а вообще на всех страницах была возможность выполнения "префильтров" в терминах битрикса?
Я пытаюсь понять про что ты, то есть хочешь, чтобы не просто на отдельной странице, которая специально для аякса создана, а вообще на всех страницах была возможность выполнения "префильтров" в терминах битрикса?
Господа, скажите пожалуйста, как это юзать с result_modifier? Если мне через js надо получить данные, обработанные резалт модифаером? Action в классе компоненте не подрубит его? В шаблоне корзины сделали mutator.php, а как тут быть? Наследовать catalog.section? И ещё вопрос, что делать с компонентами у которых нет классов, или у которых нет экшенов? Пока что я так понимаю это можно юзать только со своими компонентами, или я не прав?
Единственное, чего не увидел тут, а так же не сделал нормально у себя в библиотеке - передача параметров компонентов. Битрикс вроде их в base64 переделывает, но как-то не хочется передавать так параметры для каталога или умного фильтра. Во-первых, утяжеляет страницы сайта, во-вторых утяжеляет запросы к серверу. Была идея все параметры сохранять в базе, чтобы передавать только ID конкретного компонента на странице, но из-за кеширования были проблемы с актуальностью данных.
Гаврилов Евгений, посмотрите табличку b_component_params, там все параметры сохраняются, которые через визуалку настраиваются. Даже где-то штатная мапа есть на нее, вроде в \Bitrix\Main\Component или где-то рядом попадалась.
Сделали единый роутер на ajax - это хорошо. Сделали подключение на классы модуля - великолепно. Вообще вся эта тема с аяксом в битриксе меня запарила еще пару лет назад. В итоге взяли роутер у симфони, прикрутили обертку над ним и зажили счастливо. В роутах указывается либо компонент с экшеном, либо модуль с классом и экшеном, либо просто класс и экшен. Все роуты в 1 - 2-х файлах, всегда понятно что за что отвечает. Передача параметров... а ну их на фиг. Не всегда они они нужны, точнее редко, и если надо запишем в сессию разок при executeComponent().
Дрёмин Станислав написал: В итоге взяли роутер у симфони, прикрутили обертку над ним и зажили счастливо
Да, тоже собственный роутер для аякса использую. В новом аяксе от битрикс больше нравится именно взаимодействие с модулями. Довольно красиво получается, просто новый файл с классом создал и уже можно запросы слать
Сегодня попробовал! Крайне крутая, удобная штука! Но есть ряд вопросов )
На сколько я понял метод экшена не может генерировать ошибку ? Например мне перед выполнением экшена нужно проверить подключен ли модуль. Я написал ActionFilter для префильтра, который проверят/подключает нужные модуль. Это работает, но это не очень удобно в двух местах делать одно и тоже (при обычном запуске компонента и когда компонент запущен в экшен режиме). Может быть я чего не недопонимаю, как мне сгенерировать ошибку внутри экшена, что бы я мог в обоих случаях использовать один и тот же метод для проверки подключения модулей.
Я пробовал в экшене вернуть Main\EventResult ошибочный, но компонент мой ответил status = success
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».