Пост навеян последними раскопками в ядре битрикса (и неработающим кодом после очередных обновлений).
Собственно каюсь, грешен, выпускаю иногда модули для Маркетплейс. В некоторых из них нужны настройки.
После разных мытарств и разбора чужих модулей (в основном из состава продукта) я нашел для себя более-менее оптимальную схему написания страницы настроек. Речь конечно о файле options.php в модуле.
Хочу поделиться своими наработками, а заодно спросить у Вас, коллеги, как вы делаете настройки для модулей (отпишитесь пожалуйста в комментариях).
[spoiler]
Мой текущий подход весьма прост и позволяет без 10 страниц кода сделать настройки для модуля в 3 шага:
1. Объявляем массив с описанием закладок и опций, которые должны отображаться
2. Обрабатываем POST-запрос при отправке всей этой формы и делаем редирект
3. Отрисовываем те самые закладки
Вот собственно и все. Вполне красиво и лаконично. А все благодаря двум функциям: __AdmSettingsDrawList, __AdmSettingsSaveOptions
Но как и везде - не без ложки дегтя. Не поддерживает многосайтовость. С недавними обновлениями даже хаками обойти это нельзя (и да, мне придется переписывать настройки в 3х модулях как минимум). А если вытаскивать весь нужный код - вместо 100-200 строк в options.php вы получите на порядок больше.
А ведь бывает что настройки должны завязываться на сайты. Да и при отправке в маркетплейс есть отдельный пункт чеклиста - модуль поддерживает многосайтовость.
По поводу этой ложки дегтя написал в поддержку, создали пожелание в отдел разработки за номером 59489, но сами понимаете - ждем у моря погоды.
Вот такая история.
Если у вас есть решение для создания настроек лучше этого (да еще и поддерживающее многосайтовость) - поделитесь в комментариях.
Собственно каюсь, грешен, выпускаю иногда модули для Маркетплейс. В некоторых из них нужны настройки.
После разных мытарств и разбора чужих модулей (в основном из состава продукта) я нашел для себя более-менее оптимальную схему написания страницы настроек. Речь конечно о файле options.php в модуле.
Хочу поделиться своими наработками, а заодно спросить у Вас, коллеги, как вы делаете настройки для модулей (отпишитесь пожалуйста в комментариях).
[spoiler]
Мой текущий подход весьма прост и позволяет без 10 страниц кода сделать настройки для модуля в 3 шага:
1. Объявляем массив с описанием закладок и опций, которые должны отображаться
$aTabs = array( array( 'DIV' => 'my_options', 'TAB' => Loc::getMessage('INTERVOLGA_MY_SECTION_TAB'), 'OPTIONS' => array( Loc::getMessage('INTERVOLGA_MY_SECTION_COMMON'), array('primary_domain', Loc::getMessage('MY_ITEM_PRIMARY_DOMAIN'), null, array('selectbox', array( 'С' => Loc::getMessage('MY_ITEM_PRIMARY_DOMAIN_CURRENT'), 'S' => Loc::getMessage('MY_ITEM_PRIMARY_DOMAIN_SETTINGS'), )), ), array('note' => Loc::getMessage('INTERVOLGA_MY_COMMON_NOTE')), array('default_image', Loc::getMessage('INTERVOLGA_MY_COMMON_DEFAULT_IMAGE'), null, array('text', 52), ), array('site_name', Loc::getMessage('MY_ITEM_SITE_NAME'), null, array('text', 52), ), ) ) ); |
if ($_SERVER['REQUEST_METHOD'] == 'POST' && strlen($_REQUEST['save']) > 0 && check_bitrix_sessid()) { foreach ($aTabs as $aTab) { __AdmSettingsSaveOptions($moduleId, $aTab['OPTIONS']); } LocalRedirect($APPLICATION->GetCurPage() . '?lang=' . LANGUAGE_ID . '&mid_menu=1&mid=' . urlencode($moduleId) . '&tabControl_active_tab=' . urlencode($_REQUEST['tabControl_active_tab']) . '&sid=' . urlencode($siteId)); } |
3. Отрисовываем те самые закладки
$tabControl = new CAdminTabControl('tabControl', $aTabs); ?> <fo rm method='post' action='' name='bootstrap'> <? $tabControl->Begin(); foreach ($aTabs as $aTab) { $tabControl->BeginNextTab(); __AdmSettingsDrawList($moduleId, $aTab['OPTIONS']); } $tabControl->Buttons(array('btnApply' => false, 'btnCancel' => false, 'btnSaveAndAdd' => false)); ?> <?= bitrix_sessid_post(); ?> <? $tabControl->End(); ?> </form> <? |
Вот собственно и все. Вполне красиво и лаконично. А все благодаря двум функциям: __AdmSettingsDrawList, __AdmSettingsSaveOptions
Но как и везде - не без ложки дегтя. Не поддерживает многосайтовость. С недавними обновлениями даже хаками обойти это нельзя (и да, мне придется переписывать настройки в 3х модулях как минимум). А если вытаскивать весь нужный код - вместо 100-200 строк в options.php вы получите на порядок больше.
А ведь бывает что настройки должны завязываться на сайты. Да и при отправке в маркетплейс есть отдельный пункт чеклиста - модуль поддерживает многосайтовость.
По поводу этой ложки дегтя написал в поддержку, создали пожелание в отдел разработки за номером 59489, но сами понимаете - ждем у моря погоды.
Вот такая история.
Если у вас есть решение для создания настроек лучше этого (да еще и поддерживающее многосайтовость) - поделитесь в комментариях.