Універсальне AJAX підвантаження в 1C Бітрікс
29 Травня 2018
наступна статтяТехнологія AJAX дозволяє робити запити до сервера без перезавантаження сторінки. Використовується для динамічної зміни даних. Перевага цієї технології в тому, що не потрібно перезавантажувати сторінку при зміні її окремих елементів. Як приклад, щохвилинне оновлення кодувань цінних паперів або сповіщення користувача про нові повідомлення в соціальних мережах. У цих випадках використання AJAX виправдано і має перевагу в порівнянні з перезавантаженням сторінки.
На сайтах часто використовується AJAX підвантаження компонентів. Наприклад, підвантаження списку новин при скролі, перемикання між розділами при натисканні на кнопку, перемикання списку контактів при виборі міста і багато іншого. Для цього функціоналу використовуються різні компоненти і шаблони.
Для кожного компонента або навіть шаблону підвантаження пишеться окремий запит, а також окремий PHP файл, який його обробляє. Але це не завжди добре позначається на масштабуванні і повторному використанні коду.
Було б раціонально використовувати універсальний механізм, який застосовує один і той же код для обробки запитів від різних компонентів і шаблонів. Суть компонента AJAX при першому завантаженні полягає в генеруванні унікального ключа, який записується в js-змінну.
Параметри компонента $ arParams зберігаємо в сесії. При виклику події як параметра, передаємо ключ компонента, ім'я шаблону, а також додаткові формати, наприклад, номер сторінки. PHP-код по заданому ключу викличе компонент і поверне його назад на сторінку.
Розіб'ємо процес на етапи:
-
Створимо клас для генерації ідентифікатора, збереження компонента і отримання збережених параметрів;
-
У компоненті викликаємо метод класу, який збереже $ arParams і поверне унікальний ідентифікатор компонента;
-
Створимо файл, який обробляє вхідні запити і повертає компонент;
-
У шаблоні компонента, в js-змінну, запишемо унікальний ідентифікатор і подію яка буде відправляти запит.
Далі розглянемо кілька прикладів роботи з AJAX підвантаженням.
1. Клас для роботи з компонентом:
Метод addComponent приймає об'єкт компонента як параметр, генерує унікальний ключ $ uniqueKey і записує параметри в сесію $_SESSION[__CLASS__][$uniqueKey].
Метод getComponent повертає з сесії параметри компонента по унікальному ключу.
class Ajax { // передаємо об'єкт компонента public static function addComponent(\CBitrixComponent $component, $templateName = '') { $name = $component->__name; $params = $component->arParams; $template = empty($templateName) ? $component->GetTemplateName() : $templateName; foreach ($params as $key => $value) { if (strpos($key, '~') === 0) { unset($params[$key]); } } ksort( $params ); // генеруємо унікальний ключ компонента $uniqueKey = md5($name . $template . serialize( $params )); //записуємо в сесію параметри компонента if ( ! isset($_SESSION[__CLASS__][$uniqueKey])) { $_SESSION[__CLASS__][$uniqueKey] = array( 'NAME' => $name, 'PARAMS' => $params, 'TEMPLATE' => $template ); } //поаертаємо ключ return $uniqueKey; } //повертаємо параметри компонента з сесії public static function getComponent($uniqueKey) { return $_SESSION[__CLASS__][$uniqueKey]; } }
Викликаємо в компоненті функцію яка буде генерувати універсальний ключ.
$arResult['COMPONENT_KEY'] = \Universal\Ajax::addComponent($this);
За цим ключем визначимо, який компонент підвантажувати.
2. Код, який буде обробляти запити:
if(!isset($_REQUEST['key']) && empty($_REQUEST['key'])) echo false; $uniqueKey = htmlspecialchars($_REQUEST['key']); $component = Universal\Ajax::getComponent($uniqueKey); if(empty($component)) echo false; if (isset($_REQUEST['template'])) { $component['TEMPLATE'] = $_REQUEST['template']; } if (isset($_REQUEST['params'])) { $component['PARAMS'] = array_merge($component['PARAMS'], $_REQUEST['params']); } if (isset($_REQUEST['name'])) { $component['NAME'] = $_REQUEST['name']; } global $APPLICATION; ob_start(); $APPLICATION->IncludeComponent($component['NAME'], $component['TEMPLATE'], $component['PARAMS'], false); $result = ob_get_contents(); $APPLICATION->RestartBuffer(); echo $result;
3. Додаткові параметри
Додаткові параметри $_REQUEST['params'] із запиту передаються в масив $component['PARAMS'], в яких можна передати, наприклад, номер сторінки, розділ, а також інші необхідні параметри.
$component['PARAMS'] = array_merge($component['PARAMS'], $_REQUEST['params']);
Є кілька перевірок окремих параметрів запиту, які роблять код більш зручним у використанні. За допомогою них можна вказувати як шаблон, так і ім'я компонента. Зручно, коли на сайті два різних компоненти, які працюють з одним і тим же Інфоблоком.
4. Перемикання розділів AJAX запиту.
Відправляємо запит, в якому вказані ключі, ім'я компонента і шаблону, додаткові параметри list_data [ 'PARAMS']. У ньому вказано код розділу Інфоблоки.
У разі успішної обробки запиту, код буде розміщений на сторінці.
$.ajax({ url: '/ajax/component.php', type: 'post', data: { key: ComponentKey, // ключ компонента name: list_data['NAME'], // ім'я компонента template: list_data['TEMPLATE'], // ім'я шаблону params: list_data['PARAMS'], //додаткові параметри }, success: function(data) { $('#years').after(data); } });
Як приклад гнучкості функціоналу, можна організувати обробку подій на сторінці таким чином, що цей же запит, крім перемикання розділів, буде обробляти пагінацію елементів Інфоблоки по скролу передаючи в params номер сторінки.
У підсумку, ми зможемо стандартизувати підвантаження компонентів, уникнути розростання коду, спростити впровадження нових компонентів з AJAX підвантаженням. У нас більше нема потреби писати код обробки запиту з нуля.
У даній статті описані лише кілька готових варіантів реалізації AJAX підвантаження, які також можуть відрізнятися в залежності від рівня і вподобань розробника.
Ми зв'яжемось з Вами протягом 10 хвилин