Готовые тиражные решения на 1С-Битрикс
Техническая поддержка:
+7-908-208-1965
Отдел продаж, с 7:00 до 18:00 (по Москве)
Звонок по России бесплатный
Вы также можете заказать звонок

Технические особенности решений ROMZA (ТОРР): Обновление мастером, Ajax обработчики, сохранение параметров romza_settings

26
Декабря
2016
#ajax #core #romza_settings #yenisite.bitronic2 #yenisite.furniture #yenisite.soft #yenisite.stroymag #торр
Для сокращения рисков при внедрении для партнеров и программистов и для повышения качества внедрений наших продуктов, мы начинаем цикл статей под общим названием
Технические особенности решений ROMZA или ТОРР.

0b7929268f7a7caa5ed53f0892625579.jpg


Обновление типовых решений ROMZA:

Во всех мастерах наших типовых решений есть специальный режим обновления.
Режим обновления станет доступен для определенного сайта (SITE_ID) в том случае если была завершена установка этого мастера в режиме установки, при этом на последнем шаге установки происходит установка Опции "wizard_installed" = "Y" для нужного сайта:
COption::SetOptionString($wizard->GetVar('solutionName'), 'wizard_installed', 'Y', false, $siteID);
// $wizard->GetVar('solutionName') = код типового решения, например yenisite.bitronic2
// $siteID = ID сайта для которого произведена установка
Соответственно режим обновления появится только в том случае — если для выбранного сайта опция "wizard_installed" установлена в "Y".

Режим обновления работает следующим образом:
1. Создается папка
/bitrix/templates/romza_#КОД_МОДУЛЯ_БЕЗ_YENISITE#_#НОМЕР_ВЕРСИИ#
Например для решения Битроник2 версии 2.20.0 это будет такая папка:
/bitrix/templates/romza_bitronic2_2.20.0
в эту папку копируется шаблон решения таким какой он есть в эталонной версии.
Если вносились изменения в шаблон, то все ваши изменения останутся на месте в папке с предыдущим номером версии.
Например
/bitrix/templates/romza_bitronic2_2.19.1
Этот шаблон можно вернуть в любой момент выбрав его в настройках сайта

2. В созданную на предыдущем шаге папку копируется файл для кастомизации стилей.
Из текущего шаблона в новый копируется файл template_styles.css если таковой имеется.
Он автоматически подключается последним из стилей и может быть использован для кастомизации и перезаписи CSS правил для решения.

3. Происходит обновление публичной части.
Алгоритм обновления такой:
Если для файла публичной части необходимо обновление то сначала создается копия файла с текущей датой (датой обновления мастером), затем в этом файле производятся необходимые манипуляции.

Пример:
был файл index.php в корне сайта, после обновления от 26 декабря 2016 года в 13-05 его содержимое будет доступно в файле index-2016_12_26-13_05_00.php который будет лежать в той же папке.
При этом содержимое index.php изменится по нужному алгоритму.

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

4. Копируется папка ajax из папки мастера с заменой файлов.
При этом если были какие-то изменения в ajax обработчиках в таких файлах — то они потеряются.
Копии в ajax папке не создаются!
Как правило, в AJAX обработчиках не должно быть изменений из вне. Поэтому имейте ввиду что изменения потеряются.

AJAX обработчики типовых решений

все Ajax обработчики в наших типовых решениях всегда находятся в публичной части сайта в папке ajax (SITE_DIR/ajax/)
Если нужно поменять содержимое какого либо обработчиков, то нужно скопировать нужный файл в другую папку (напр. ajax_new)
и сделать 302 редирект либо через .htaccess либо через urlrewrite.php Битрикса (только если включен mod_rewrite для Apache2) либо через настройку ngnix.
В дальнейшем планируется расширить кастомизацию AJAX обработчиков через события.

На данный момент в решениях:
  • Битроник2 (yenisite.bitronic2, yenisite.bitronic2pro, yenisite.bitronic2lite);
  • Soft (yenisite.soft);
  • Monarch (yenisite.furniture);
  • Centurion (yenisite.stroymag);
для ajax обработчика каталога /ajax/catalog.php поддерживается кастомизация через подключение файла (если он есть) custom_ext_filter.php, который должен находится в той же папке.


Сохранение параметров компонентов в папку romza_settings и их получение для ajax

в модуле "Служебные инструменты ROMZA" (yenisite.core) есть класс \Yenisite\Core\Ajax при помощи которого мы можем сохранять и загружать нужные данные по определенному ключу.
Чтобы сохранить параметры нужного компонента надо после всех манипуляций с $arParams выполнить следующий код, либо в конце файла result_modifier.php либо в начале выполнения шаблона template.php
\Yenisite\Core\Ajax::saveParams($this, $arParams, $ID);
// Где $this объект класса CBitrixComponentTemplate или CBitrixComponent или строка с именем компонента как в IncludeComponent, например — "bitrix:catalog.section"
// $arParams — массив сохраняемых параметров
// $ID (необязательно) — произвольный ключ определяющий уникальность параметров (например у нас два одинаковых компонента с разными шаблонами на странице)
Для удобства передачи нужных параметров через JavaScript существует метод который выводит необходимые для получения параметров данные:
\Yenisite\Core\Ajax::printAjaxDataAttr($ComponentTemplate, $ID);
// $ComponentTemplate — объект класса CBitrixComponentTemplate 
// $ID (необязательно) — произвольный ключ определяющий уникальность параметров 

Этот метод кодирует необходимые данные в Base64 и выводит их в data атрибуте data-ajax.
В нем закодирован массив:
array(
   'CMP' => 'bitrix:catalog.section', // имя компонента для которого сохраняется параметры
   'PAGE' => '/catalog/', // путь к текущей страницы без служебный параметров, нужно для fallback режима
   'TMPL' => '.default', // имя текущего шаблона
   'ID' => 'main_section'; // произвольный ключ определяющий уникальность параметров (необязательно)
}

Теперь мы можем получить эти параметры в Ajax обработчике, для этого используем следующий код:
// GetDecodedArParams декодирует Base64 если необходимо конвертирует кодировку в UTF-8, возвращает массив
$arAjax = \Yenisite\Core\Tools::GetDecodedArParams($_REQUEST['ajax']); 
// из этих данных получаем нужные нам параметры
$arParams = \Yenisite\Core\Ajax::getParams($arAjax['CMP'], $arAjax['ID'], $arAjax['PAGE']);
Тут $arAjax['PAGE'] нужен для fallback режима.

Дело в том что если физически удалить папку bitrix/romza_settings и при этом выполнить ajax к нужному обработчику, без открытия страницы где они сохраняются то параметров не будет.
Чтобы предотвратить такой кейс, метод getParams попробует получить параметры, если он их не найдет в первый раз будет сделан get запрос к целевой странице, чтобы параметры сохранились, затем обработчик попробует получить параметры еще 1 раз.

Это была первая статья в цикле статей по документации и работе наших модулей и типовых решений, про что бы вы хотели еще узнать? напишите в комментариях!