плагин customSettings 1.0 для Evo. Добавляем свои системные настройки.

Часто хочется добавить в систему какие-то свои системные настройки или просто какие-то данные, которые можно было бы легко редактировать.

Например нам нужно на сайте вывести номер телефона и адрес компании. Можно для этого создать чанки, но редактировать их простому менеджеру сайта будет очень не удобно. Значительно удобнее было бы добавить эти данные в конфигурацию сайта («Инструменты» -> «Конфигурация»). Для этого можно использовать простой плагин.

Вот как это выглядит:


Код плагина:
/**
 * customSettings
 * 
 * Plugin to add your system settings
 *
 * @category    plugin
 * @version     1.0
 * @author      Andchir <andchir@gmaail.com>
 * @internal    @properties &settings=Settings;textarea;Example custom setting~custom_st_example
 * @internal    @events OnSiteSettingsRender
 * @internal    @modx_category
 */

$e = &$modx->Event;
$output = "";

if ($e->name == 'OnSiteSettingsRender'){

$settingsArr = !empty($settings) ? explode('||',$settings) : array('Example custom setting~custom_st_example');

$output .= '<table>';

foreach($settingsArr as $key => $st_row){
    $st_label_arr = explode('~',$st_row);
    $custom_st_label = trim($st_label_arr[0]);
    $custom_st_name = isset($st_label_arr[1]) ? $st_label_arr[1] : 'custom_st';
    $custom_st_value = isset($st_label_arr[1]) && isset($modx->config[$st_label_arr[1]]) ? trim($modx->config[$st_label_arr[1]]) : '';
    $output .= '
      <tr>
        <td nowrap="nowrap" class="warning" width="200">'.$custom_st_label.'</td>
        <td><input type="text" value="'.$custom_st_value.'" name="'.$custom_st_name.'" style="width: 350px;" onchange="documentDirty=true;" /></td>
      </tr>
    ';
}

$output .= '</table>';

}

$e->output($output);


Создаем плагин с названием «customSettings», вешаем его на событие «OnSiteSettingsRender». Конфигурация плагина:
&settings=Settings;textarea;Example custom setting~custom_st_example


В поле «Settings» нужно ввести название параметра и имя поля, разделенные символом "~". Можно несколько через разделитель "||".

Пример:
Номер телефона~company_phone||Адрес компании~company_address


Теперь в шаблонах сайта в любом месте для вывода этих данных можно вставить:

[(company_phone)]
[(company_address)]


А в коде ваших сниппетов или модулей можно выводить так:

$modx->config['company_phone']
$modx->config['company_address']


Обновлено
Цифры в названиях полей (то что после ~) использовать нельзя, т.к. в функции mergeSettingsContent() класса DocumentParser (document.parser.class.inc.php) регулярное выражение их не пропустит.

33 комментария

avatar
Спасибо за полезную информацию.
avatar
Превосходное открытие. Никогда не рыл в этом направлении, но снова Evo нам демонстрирует удивительную гибкость :)
avatar
Эту возможность подсмотрел у плагина TinyMCE. Раньше как-то не обращал внимания как появляются его настройки в конфигурации сайта.
avatar
Спасибо автор.
Вот мой немного доработанный код:
$e = &$modx->Event;
$output = "";
if ($e->name == 'OnSiteSettingsRender'){
$settingsArr = !empty($settings) ? explode('||',$settings) : array('Example custom setting~custom_st_example');
$fname = !empty($pname) ? $pname : 'Дополнительные настройки';
$output .= '</td></tr></table></div><div style="display: block;" class="tab-page" id="tabPage8"><h2 class="tab">'.$fname.'</h2><script type="text/javascript">tpSettings.addTabPage( document.getElementById( "tabPage8" ) );</script><table border="0" cellpadding="3" cellspacing="0"><tbody>';
foreach($settingsArr as $key => $st_row){
    $st_label_arr = explode('~',$st_row);
    $custom_st_label = trim($st_label_arr[0]);
    $custom_st_name = isset($st_label_arr[1]) ? $st_label_arr[1] : 'custom_st';
    $custom_st_value = isset($st_label_arr[1]) && isset($modx->config[$st_label_arr[1]]) ? trim($modx->config[$st_label_arr[1]]) : '';
 $output .= '<tr><td class="warning" nowrap="">'.$custom_st_label.'</td>
        <td><input type="text" value="'.$custom_st_value.'" name="'.$custom_st_name.'" style="width: 350px;" onchange="documentDirty=true;" /></td></tr><tr><td colspan="2"><div class="split"/></td></tr>';
}
$output .= '</tbody></table></div>';
}
$e->output($output);

и новый конфиг плагина
&settings=Settings;textarea;Номер телефона~company_phone||Адрес компании~company_address &pname=Название;text;

Теперь пользовательские поля будут выводиться на отдельной вкладке, название вкладки указываеться в конфиге.

P.S: Плагин ещё можно доработать добавив вожможность выбора тита поля.
avatar
в моём коде есть ошибка из строки
$output .= '</tbody></table></div>';
необходимо удалить последний div.
avatar
Ещё бы возможность удалять ненужные параметры и большего желать нельзя.
Здорово придумано! Спасибо!
avatar
я не понял, сохранение этих настроек происходит прозрачно, «на автомате»?
avatar
Да, достаточно только добавить поля и они автоматически сохранятся. Почти также как в Рево.
avatar
Шикарно =)
avatar
Плагин шикарнейший. Огромный плюс!

Но при использовании сразу же наткнулся на грабли. Добавил след. конфиг:
Контактный e-mail~site_mail||Телефон 1~tel1||ICQ~site_icq||Телефон 2~tel2||Телефон 3~tel3
и долго не мог понять, почему же на сайте отлично выводятся мыло и аська, а конструкции с телефонами [(tel1)] — просто игнорируются. Пришлось прилично полазить в document.parser.class.inc.php — оказалось, что парсер обрабатывает настройки, только в том случае, если их названия состоят из строчных латинских букв и знака подчеркивания. Если в названии цифра — настройка просто не проходит регулярное выражение в ф-ции mergeSettingsContent.
avatar
Да, есть такая странность. Цифры в названиях имен полей использовать нельзя. Я забыл об этом упомянуть в топике).
avatar
Мне нравится.

* @author Andchir <andchir@gmaail.com> — поправь свою почту ;)
avatar
Это защита от спама ;)
avatar
Спасибо, замечательный плагин :)
avatar
Большое спасибо. Давно хотел такое сделать, но руки не доходили :)
avatar
А у меня от чего то потом не вызываются на сайте ничего. В смысле пишу [(company_name)], а вместо этого пустота выводится. Странно.
avatar
Поле в конфигурации точно сохранилось? Куда пашите?
avatar
Большое спасибо!!!

А можно-ли как-то выводить вкладку со своими параметрами на главной странице в админке?
avatar
А как создавать другие типы полей ввода? например, textarea или select…
  • dob
  • 0
avatar
Было бы ещё лучше если бы можно было рядом с формой выводить описание. Как что обозначено, чтобы каждый раз не лазить в плагин. Попробую сам накарябать :)
avatar
Чуть переделанный плагин от JO-Cry

$e = &$modx->Event;
$output = "";
if ($e->name == 'OnSiteSettingsRender'){
$settingsArr = !empty($settings) ? explode('||',$settings) : array('Example custom setting~custom_st_example');
$fname = !empty($pname) ? $pname : 'Дополнительно';
$output .= '</td></tr></table></div><div style="display: block;" class="tab-page" id="tabPage8"><h2 class="tab">'.$fname.'</h2><script type="text/javascript">tpSettings.addTabPage( document.getElementById( "tabPage8" ) );</script><table border="0" cellpadding="3" cellspacing="0"><tbody>';
foreach($settingsArr as $key => $st_row){
    $st_label_arr = explode('~',$st_row);
    $custom_st_label = trim($st_label_arr[0]);
    $custom_st_name = isset($st_label_arr[1]) ? $st_label_arr[1] : 'custom_st';
    $custom_st_value = isset($st_label_arr[1]) && isset($modx->config[$st_label_arr[1]]) ? trim($modx->config[$st_label_arr[1]]) : '';
 $output .= '<tr><td class="warning" nowrap="">'.$custom_st_label.'</td>
        <td><input type="text" value="'.$custom_st_value.'" name="'.$custom_st_name.'" style="width: 350px;" onchange="documentDirty=true;" /></td><td>Плейсхолдер для вставки в чанк: [('.$custom_st_name.')]</td></tr><tr><td colspan="2"><div class="split"/></td></tr>';
}
$output .= '</tbody></table>';
}
$e->output($output);


Конфиг плагина:
&settings=Settings;textarea;Контактный e-mail~site_mail||Телефон~site_phone||ICQ~site_icq||Skype~site_skype||Адрес компании~company_address||Индекс~site_index &pname=Название;text;


Кто не понял, добавил в настройках вывод плейсхолдера, чтобы на глазах был. :)
avatar
заметил — что если параметры вынесены в чанк — то вывода не будет :(
avatar
Все параметры у меня по чанкам отлично выводятся. А доработка шикарная, взял на вооружение!
avatar
Много времени прошло, но все же: добавьте htmlspecialchars при выводе значения переменной, а то, как-минимум, с кавычками беда
<td><input type="text" value="'.htmlspecialchars($custom_st_value,ENT_QUOTES,'utf-8').'" name="'.$custom_st_name.'" style="width: 350px;" onchange="documentDirty=true;" /></td>
avatar
Карамба!

Автор, спасибо огромное за вектор, открывающий огромный простор для идей =)
avatar
здравствуйте всем! добавила с помощью плагина новые системные настройки, но не получается вывести в чанке их значения с помощью конструкции [(setting_name)]. это в принципе возможно? спасибо заранее
avatar
Обратите внимание на
Цифры в названиях полей (то что после ~) использовать нельзя, т.к. в функции mergeSettingsContent() класса DocumentParser (document.parser.class.inc.php) регулярное выражение их не пропустит.
Если у вас в названиях есть цифры — тогда [(setting_name)] возвращает пустой результат.
avatar
в названии поля цифр нет (Year_current); в чем еще причина может крыться… именно в чанке должно выводиться?
avatar
Вот регулярка для допустимых символов в названиях системных переменных
'~\[\(([a-z\_]*?)\)\]~'
Уберите заглавную букву: Year_current -> year_current
avatar
спасииибо огромное)))
avatar
Спасибо большое!
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.