Пост навеян последними раскопками в ядре битрикса (и неработающим кодом после очередных обновлений).
Собственно каюсь, грешен, выпускаю иногда модули для Маркетплейс. В некоторых из них нужны настройки.
После разных мытарств и разбора чужих модулей (в основном из состава продукта) я нашел для себя более-менее оптимальную схему написания страницы настроек. Речь конечно о файле 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, но сами понимаете - ждем у моря погоды.
Вот такая история.
Если у вас есть решение для создания настроек лучше этого (да еще и поддерживающее многосайтовость) - поделитесь в комментариях.