Как сэкономить на запросах и сделать ajax-формы
- Очередной компонент… а зачем?
- Так что же он делает?
- Хм, а как же он это делает?
- И что теперь с этим делать?
Очередной компонент… а зачем?
Каждый
Рассмотрим две ситуации. Первая — оголтелая оптимизация страниц и наличие форм на странице. В чем проблема большинства форм (
Вторая проблемная ситуация —
В обоих случаях вставала одна и так же проблема — формы, запросы, в том числе и капча. Нужно было убрать форму авторизации со страницы, в то же время оставив ее доступной для пользователя.
Так что же он делает?
Решать проблему начали с малого — с формы авторизации. Пусть, мол, на странице в шапке будет ссылка, при нажатии на которую будет по AJAX’у подгружаться настоящая форма входа на сайт. И это действительно хорошее предложение — мы избавимся от одного, пусть и не самого тяжелого компонента при загрузке страницы, а получать его будет только тот, кому действительно надо авторизоваться. О деталях реализации будет сказано ниже, сейчас же только покажем наглядно, что вытворяет компонент intervolga:ajax.component.
Посмотрим на процесс загрузки отдельно взятой страницы отдельно взятым пользователем.
UML
«Других компонентов» на странице может быть с добрый десяток, поэтому все они диаграмме представлены одной линией жизни. Знатоки Битрикса скажут: «есть же еще и агенты, события при выполнении страницы, шаблон,
Как можно увидеть, загрузка страницы происходит синхронно, каждый компонент по очереди подключается, выполняет свои запросы, формирует HTML и возвращает его на страницу. Когда проход закончен, после выполнения эпилога, Битрикс показывает страницу пользователю.
Теперь посмотрим на ту же страницу, но с компонентом intervolga:ajax.component, настроенным на работу с формой авторизации.
UML
Наш компонент не делает запросов к БД при загрузке страницы — только выводит ссылку с текстом «Войти» ну или каким укажете в настройках.
За счет этого страница стала легче, делает меньше запросов, и подключает меньше javascript’а (все помнят про форму авторизации через социальные сети?). Красота, одним словом.
Но компонент не пропал — он загрузится при клике на ссылке. Пойдет
Идея оказалась настолько захватывающей, что компонент сразу проектировался универсальным — на месте авторизации может быть любой компонент 2.0 продукта
Ниже вы можете увидеть другие компоненты, получаемые аналогичным образом по AJAX.
Форма обратной связи
Список новостей
Детальное описание новости
Подводя итог, можно смело заявить: разработанный компонент intervolga:ajax.component позволяет убрать со страницы запросы любого компонента, сделав его доступным во всплывающем окне.
Хм, а как же он это делает?
Реализация — самая интересная часть компонента, даже интереснее, чем идея. Изначально (напоминаю, задача сводилась только к авторизации во всплывающем окне) возникла дилемма — как выводить ссылку «Войти» ? Было несколько вариантов.
- Вывести ссылку в шаблоне сайта, javascript вынести в скрипты шаблона сайта и не мучиться. Нехороший вариант, неуниверсальный, хоть и самый быстрый.
- Создать альтернативный шаблон компонента bitrix:system.auth.form, который выводил бы ссылку для получения настоящего компонента. Но тогда выполнялся бы component.php, а с ним и запросы. Нет, не надо так.
- Создать свой компонент авторизации, который в одном случае бы выводил ссылку, а в другом — делал запросы прямо как настоящая форма, использовали бы копипаст из bitrix:system.auth.form. Но хотелось универсальности, чтобы можно было «зааджаксить» любой компонент.
Остановились на промежуточном решении, которое объединяет
Итак, медленно и
Требовалось по нажатию на ссылку делать
В ссылке, по которой происходит переход, зашивается ID нашего компонента (мы же не хотим, нажав на кнопку «Войти» увидеть на сайте форму «Оставьте отзыв». Название параметра, в котором передается ID, можно настраивать в компоненте.
Запрос делается на ту же самую страницу, но с дополнительным параметром, например AJAX_IID=bitrixsystemauthform. Компонент проверяет этот параметр, а так же заголовок HTTP_X_REQUESTED_WITH. И это не очень безопасно, факт остается фактом. Заголовки чудесно подделываются. Но этот вариант ничем не хуже, чем решение передавать секретный ключ в запросе в другой реализации
Убедившись, что идет
Как ни странно, едва ли не большую часть времени заняла разработка не самого компонента (файла class.php —
На помощь пришло недокументированное API. Использовались такие методы, как:
- CComponentUtil:GetComponentsTree() — чтобы получить разделы и подразделы компонентов, а так же сами компоненты;
- CComponentUtil:GetTemplatesList() — чтобы получить список шаблонов выбранного компонента;
- CComponentUtil:GetComponentProps() — чтобы получить настройки компонента;
- CComponentUtil:GetTemplateProps() — чтобы получить дополнительные настройки шаблона компонента.
В результате, удалось сделать полноценную обертку — при настройке intervolga:ajax.component вы выбираете любой компонент и настраиваете его тут же. Более наглядно — на скриншоте ниже.
А так выглядит код, вызывающий intervolga:ajax.component.
Чтобы не путать настройки нашего intervolga:ajax.component с теми, которые будут переданы во внутренний компонент — к параметрам внутреннего добавили префикс «INNER_».
Таким образом мы умудрились не накопипастить, и создать
Второй проблемой на пути к реализации стали стили и скрипты. Внутренний компонент может как иметь файлы script.js и styles.css в папке с шаблоном (тогда Битрикс подтягивает их автоматически), так и подключать их самостоятельно с помощью $APPLICATION->SetAdditionalCSS() и $APPLICATION->AddHeadScript() в component_epilog.php.
Изначальный вариант — подключать script.js, styles.css и component_epilog.php внутреннего компонента был не очень успешен. Тогда сделали проще — печать стилей и скриптов перенесли из head в область сразу за кодом внутреннего компонента, то есть стили шли одной порцией вместе с кодом, который должны были стилизовать. Очень удобно.
И что теперь с этим делать?
Теперь, получив в свои руки такой мощный инструмент, можно пересмотреть многие элементы сайта, изначально проектировать их
Статьи по теме
- аренда команды (от 2 человек, не менее 3 месяцев);
- итерации с фиксированной ценой (1-3 месяца длительностью).
- регулярные онлайн-планерки с заказчиком;
- квалифицированных специалистов;
- организованную команду (находятся в одном помещении, что упрощает решение рабочих вопросов);
- полную прозрачность и регулярность отчетов о результатах.
- нагруженный интернет-магазин;
- личный кабинет;
- оптовые продажи — B2B-платформа;
- маркетплейс;
- технический аудит сайта;
- Битрикс24 — корпоративные HR-порталы;
- Битрикс24 — построение CRM-системы;
- Битрикс24 — личные кабинеты сотрудников;
- Битрикс24 — аудит портала;
- 1С — интеграция с другими системами;
- 1С — доработка системы;
- маркетинг — комплексное интернет-продвижение;
- маркетинг — продвижение для B2B.