Реализовал загрузку файлов на форме через AJAX-действия, хотелось бы подписаться на прогресс upload'а, но в методе BX.ajax.runComponentAction такой возможности нет. Зато в BX.ajax (который по сути вызывается для Ajax-действия) есть параметр start - можно было бы получить var xhr = BX.ajax.runComponentAction, подписаться на нужные события и после запустить запрос xhr.send. Но параметр start для BX.ajax.runComponentAction отсутствует. Предлагаю добавить такой параметр.
Появилась задача с необходимостью вывода рекомендованных товаров на странице корзины и добавлением этих товаров напрямую в таблицу корзины без перезагрузки всей страницы.
В новой корзине есть только следующие функции (action`ы), поддерживающие AJAX: - изменить количество товара; - удалить товар из корзины; - восстановить удаленный товар; - отложить; - изменить выбранное ТП; - объединить одинаковые товары.
Предлагаю добавить к этим action`ам возможность добавления товара в корзину. Сейчас приходится это делать костылем через action восстановления удаленного товара.
Подскажите, пожалуйста, планируют ли сделать обновление содержимого без обновления страницы задачи? 1) когда добавляешь подзадачу: https://yadi.sk/i/eHwKgZUu3Y4zTE 2) когда добавляется время (после нажатия "Пауза")
Рассмотрим пример стандартного шаблона, компонент catalog.smart.filter. Если выбрать параметр в фильтре, то ajax запрос отправляется на туже самую страницу http://joxi.ru/brR63XKsQBN6Jr
При это происходит загрузка страницы полностью (до компонента), затем весь вывод сбрасывается и отдаётся на ajax запрос необходимые данные.
Минусы такого подхода: - увеличивается время на запроса, после нажатия фильтра приходится ждать от пол секунды и выше; - лишняя нагрузка на сервер, так как отрабатывают все компоненты, которые лежат выше фильтра; - и др.
Необходимо вынести ajax запросы на отдельный файл, желательно в самом шаблоне.
Это касается компонентов в магазине, и др. которые используют ajax запросы на текущую страницу.
Добавить для свойства инфоблока в виде справочника вывод выпадающим список при наборе с ajax-подгрузкой вариантов, чтобы не строился выпадающий список СО ВСЕМИ ВОЗМОЖНЫМИ вариантами значений - это отнимает уйму времени при переходе на страницу редактирования элемента.
Постараюсь описать концепцию кратко, четко и по порядку.
1)Там где есть возможность ajax в файле с шаблоном должен лежать файл ajax.php в котором можно просто подключить компонент, первоначально хотя бы так и перед ним prolog_before естественно 2)Так же в шаблоне должен быть файл ajax.js - в котором будет указываться исполняемый код js при запросе - какие параметры передавать и так далее - параметры разные необходимо передавать в зависимости от компонента 3)Помимо стандартного параметра ajax который подвешивается в Битриксе еще необходимо будет передавать путь к файлу обработчику js(например параметр ajax_path_to_js).
Суть работы - когда осуществляем вызов ajax события, по параметру ajax_path_to_js проверяем что файл существует если нет возвращаем ошибку. Если он существует запускаем этот файл на исполнение - далее уже выполняется сам ajax
Файлы для компонентов можно сформировать вручную либо автоматически. Автоматически суть следующая - при включении в параметрах использования ajax вызывается обработчик который создается файл ajax.js если его не существует - стандартного наполнения в котором содержится только вызов через ajax файла и возврат результата в виде html который вставляется в область с id ajax_area_newslist_default - точки опускаем, формируем из название шаблона и компонента далее можно так же автоматически в файл template.php оборачивать код в данный div(либо не в шаблоне а в верхнем уровне оборачивать компонент в div), если он не был найден, либо в настройках компонента(в параметрах) добавить параметр в которым указывать id области для использования ajax и автоматом подставлять первоначально данное значение. Далее создаем файл ajax.php который изначально так же стандартного содержания включающий в себя - prolog_before и вызов самого компонента Как получить вызов самого компонента - просканировать страницу на наличие названия компонента и его шаблона, а далее все по стандарту копируем - вставляем.
Комплексный компонент стандартно можно точно так же вызывать - все равно это удет быстрее чем перезагружать всю страницу, да и композит будет подгружать данные быстрее и можно по очереди, что первое подгрузилось то первое и заменилось.
Поскольку механизм AJAX от Битрикс универсален подходит для любого компонента, предлагаю включить группу параметров AJAX_MODE во все стандартные компоненты, для удобства интегратора.
Для компонентов корзин он особенно нужен:
- bitrix:sale.basket.basket.line - bitrix:sale.basket.basket - bitrix:catalog.element сейчас приходится его постоянно дописывать вручную.
Раз уж Битриксовский Аякс для компонентов выполняет всю страницу, то было бы хорошо иметь возможность указытьвать несколько компонентов, содержимое которых должно обновиться при выполнении аякс-запроса. А не только одного, текущего.
Например, на странице размещен компонент bitrix:catalog.section, работающий в режиме аякс. Когда у товара нажимаем "добавить в корзину" - то перегенерируется вся страница, и в контейнер данного компонента вставляется результат, все лишнее обрезается. Так раз уж мы выполнили всю страницу, то у нас где-то есть сгенерированный html-код остальных компонентов, осталось только самую малость - не выкидывать (обрезать) его, а вставить результат в контейнеры нужных компоненты (которые указать в параметрах компонента), и обновить таким образом компонент малой корзины.
Аж стыдно, что имея такую мощную аякс-библиотеку, сам Битиркс в своем типовом решении магазина для обновления содержимого малой корзины пользуется библиотекой Jquery (а не своим штатным аяксом).
А то начали очень хорошо, но потом похоже полностью забросили, как буд-то и небыло.
Например, в последнем типовом решении магазина не используется штатный аякс а все на каких-то чудо-костылях с $APPLICATION->RestartBufer() в result_modifier компоннетов для корзины и умного фильтра.
Хорошая же была технология, чуточку доработать под современные нужны, и то что надо.
Часто возникает потребность обновить область страницы, где выводится один компонент, из шаблона другого компонента (например добавление в корзину через AJAX в каталоге требует обновления области малой корзины, добавление комментария к новости - обновления списка новостей в боковой колонке и т.п.). Отсюда и возникла идея. Если уж был в свое время добавлен component_epilog.php, то почему бы не добавить component_prolog.php, который запускался бы всегда независимо от кэша. При его наличии мы могли бы организовывать ajax-взаимодействия компонентов на странице через шаблоны данных компонентов. Например, в шаблоне малой корзины пишем javascript-функцию, которая вызывает текущую страницу с определенным параметром; в component_prolog.php проверяем наличие в запросе данного параметра и, если установлен, делаем $APPLICATION->RestartBuffer(); в component_epilog.php, соответственно, при установленном параметре делаем exit; В шаблонах компонентов, где происходит ajax-добавление в корзину, проверяем наличие упомянутой выше javascript-функции и дергаем ее, если есть. Дешево и сердито.