Расширяем количество настроек MODx

Создавая сайт на MODx часто сталкиваешься с задачей добавления нескольких дополнительных пользовательских настроек в систему управления сайтом. Имея возможность дополнить общие настройки MODx своими, администратор сайта смог бы легко управлять такими параметрами, как: количество анонсов на главной странице, телефон организации, валюта по умолчанию и пр.

Наверно идеальным решением было бы написать отдельный модуль для этих целей, но в ходе экспериментов, удалось найти оригинальное и достаточно простое и удобное решение на базе плагина.

Итак, идея возникла следующая: использовать для хранения дополнительных настроек переменные TV. Ведь это очень удобно. Настройки можно создавать практически любых типов, связывать их с содержимым сайта (например при помощи сниппета Quill), а также ограничивать доступ к конкретной настройке.

Как это работает

  1. Создаем шаблон «Настройки сайта»
  2. Создаем неограниченное количество TV (это будут пользовательские настройки сайта) и подключаем их к созданному шаблону
  3. Создаем документ «Настройки» на базе шаблона «Настройки сайта», отключаем публикацию, задаем псевдоним «settings» и для удобства задаем пункт меню 900 (чтобы настройки всегда были в самом низу дерева документов). Для удобства дальнейшей проверки, можно сразу внести значения пользовательских настроек (TV)
  4. Создаем новый плагин «Ini» (код ниже) и вешаем его на событие «OnLoadWebDocument».

Готово. Теперь дополнительные пользовательские настройки можно легко корректировать, назначать к ним необходимый уровень доступа и что самое приятное, использовать в шаблонах, чанках, в теле документов в привычной форме ([setting_name]). Наши настройки идентичны встроенным настройкам MODx и их можно запросто использовать с PHx и передавать в качестве параметров сниппетам.

Для удобства я взял за правило именовать такие параметры ini_name, чтобы они выделялись среди встроенных настроек MODx и прочих параметров TV. В плагине также предусмотрена возможность добавить необходимые константы, для дальнейшего использования в шаблонах и документах.

Код плагина «Ini»

/**
* Name: Ini (MODx Evolution plugin)
* Version: 1.0.1
* Author: Yurik Dertlyan (yurik@unix.am, http://unix.am)
*
* Setup: Create new plugin with name "Ini", paste this code and check OnLoadWebDocument event.
**/

// Set id or alias of document with settings TVs
$iniDoc = 'settings';

// Set static variables
$modx->config['ini_watermark']  = 'assets/images/watermark.png';
// Set current date variable
$modx->config['date'] = mktime();

// Read variables from document with settings TVs
$site_content = $modx->getFullTableName('site_content');
$site_tmplvars = $modx->getFullTableName('site_tmplvars');
$site_tmplvar_contentvalues = $modx->getFullTableName('site_tmplvar_contentvalues');
$sql = 'SELECT tv.name,tvc.value FROM '.$site_tmplvar_contentvalues.' AS tvc
 LEFT JOIN '.$site_tmplvars.' AS tv ON tv.id=tvc.tmplvarid
 LEFT JOIN '.$site_content.' AS c ON c.id=tvc.contentid
 WHERE c.'.(is_numeric($iniDoc) ? 'id' : 'alias').'="'.$iniDoc.'";';
$rs = $modx->db->query($sql);
while($row = $modx->db->getRow($rs)) $modx->config[$row['name']] = $row['value'];
mysql_free_result($rs);

Архив с плагином: скачать «Ini» 1.0.1.

Эволюция плагина Ini → Settings от 2013

Как-то наткнулся на статью Александра (bumkaka), который нашел более оптимальный путь в решении данной задачи - записывать настройки в базу при сохранении документов-настроек.

Данный метод мне понравился и вспомнив о старичке Ini, я решил переписать его. Но т.к. логика работы нового плагина существенно отличалась от Ini, он был переименован в Settings.

Установка проста: создайте плагин Settings (или отредактируйте существующий Ini), отметьте галочкой единственное событие OnDocFormSave, добавьте конфигурацию плагина "&ids=ID ресурсов с настройками;text;100 &prefix=Префикс TV-параметров;text;_". Где 100 - ID одного или нескольких (следующих через запятую) документов с настройками. Укажите ID вашего документа и сохраните плагин. После этого достаточно изменить документ с настройками и все TV-настройки будут доступны аналогично встроенным настройкам MODx.

/**
* Name: Settings (MODx Evolution plugin)
* Version: 0.0.1
* Author: Yurik Dertlyan (yurik@unix.am, http://unix.am)
**/
$e = &$modx->event;
if($e->name == 'OnDocFormSave' && isset($params['id']) && isset($ids) && $ids) {
 $ids = explode(',', $ids);
 if(!in_array($params['id'], $ids)) return;
 $tvs = $modx->getTemplateVars('*', 'name', $params['id'], 'published');
 $settingsTable = $modx->getFullTableName('system_settings');
 $prefix = isset($prefix) && $prefix ? $prefix : '_';
 foreach($tvs as $tv) {
  if(strpos($tv['name'], $prefix) === 0) {
   $sql = "INSERT INTO {$settingsTable} (setting_name, setting_value) VALUES('{$tv[name]}','{$tv[value]}') ON DUPLICATE KEY UPDATE setting_value='{$tv[value]}'";
   $modx->db->query($sql);
  }
 }
}
comments powered by Disqus