Skip to content

Commit

Permalink
Переопределение из БД только тех параметров конфигов, которые есть в …
Browse files Browse the repository at this point in the history
…описании схемы для админки
  • Loading branch information
mzhelskiy committed Oct 28, 2014
1 parent 9591f56 commit 474b717
Showing 1 changed file with 85 additions and 7 deletions.
92 changes: 85 additions & 7 deletions classes/modules/settings/Settings.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -141,16 +141,98 @@ private function LoadConfig($sKey)
/*
* ядро
*/

/**
* Получаем схему для фильтрации
*/
$aKeys = array();
$aShemeGroups = (array)Config::Get('$config_groups$');
foreach ($aShemeGroups as $aGroups) {
foreach ((array)$aGroups as $aGroup) {
if (isset($aGroup['allowed_keys'])) {
$aKeys = array_merge($aKeys, $aGroup['allowed_keys']);
}
}
}
$aConfigData = $this->FilterConfigByKeys($aConfigData, $aKeys,
array_keys((array)Config::Get('$config_scheme$')));
$this->LoadRootConfig($aConfigData);
/**
* Удаляем временные конфиги
*/
} else {
/*
* плагин
*/
$this->LoadPluginConfig($this->StripPluginPrefix($sKey), $aConfigData);
$sPlugin = $this->StripPluginPrefix($sKey);
/**
* Получаем схему для фильтрации
*/
$aKeys = array();
$aShemeSections = (array)Config::Get('plugin.' . $sPlugin . '.$config_sections$');
if ($aShemeSections) {
foreach ($aShemeSections as $aSections) {
if (isset($aSections['allowed_keys'])) {
$aKeys = array_merge($aKeys, $aSections['allowed_keys']);
}
}
$aKeysAvailable = array_keys((array)Config::Get('plugin.' . $sPlugin . '.$config_scheme$'));
} else {
/**
* Используем все доступные ключи
*/
$aKeys = array_keys((array)Config::Get('plugin.' . $sPlugin . '.$config_scheme$'));
$aKeysAvailable = array();
}

$aConfigData = $this->FilterConfigByKeys($aConfigData, $aKeys, $aKeysAvailable);
$this->LoadPluginConfig($sPlugin, $aConfigData);
}
}
}

/**
* Фильтрует массив конфига по ключам
*
* @param $aData
* @param $aKeys
* @return array
*/
protected function FilterConfigByKeys($aData, $aKeys, $aKeysAvailable = array())
{
/**
* Создаем временный конфиг для удобного доступа к значениям
*/
Config::getInstance($sInstanceTmp = '__for_filter__' . func_generator(8))->SetConfig($aData);
Config::getInstance($sInstanceResult = '__for_filter_result__' . func_generator(8))->SetConfig(array());

foreach ($aKeys as $sKey) {
if (strpos($sKey, '*') === false) {
if (Config::isExist($sKey, $sInstanceTmp)) {
Config::Set($sKey, Config::Get($sKey, $sInstanceTmp), $sInstanceResult);
}
} else {
/**
* Получаем набор ключей по маске из списка доступных
*/
$sKey = rtrim($sKey, '*');
foreach ($aKeysAvailable as $sKeyAvailable) {
if (strpos($sKeyAvailable, $sKey) !== false) {
if (Config::isExist($sKeyAvailable, $sInstanceTmp)) {
Config::Set($sKeyAvailable, Config::Get($sKeyAvailable, $sInstanceTmp), $sInstanceResult);
}
}
}
}
}
$aData = Config::getInstance($sInstanceResult)->GetConfig();
/**
* Удаляем данные временных конфигов
*/
Config::getInstance($sInstanceTmp)->SetConfig(array());
Config::getInstance($sInstanceResult)->SetConfig(array());
return $aData;
}

/**
* Удалить префикс перед именем плагина
Expand Down Expand Up @@ -408,7 +490,7 @@ private function GetConfigSettings($sConfigName, $aAllowedKeys = array(), $aExcl
*/
if (($mValue = $this->GetConfigKeyValue($sConfigName, $sConfigKey)) === null) {
$this->Message_AddError($this->Lang_Get('plugin.admin.errors.wrong_description_key',
array('key' => $sConfigKey)), $this->Lang_Get('error'));
array('key' => $sConfigKey)), $this->Lang_Get('error'));
continue;
}

Expand Down Expand Up @@ -1030,8 +1112,4 @@ private function FireChangedAtLeastOneParamEvent($sConfigName, $aSettingsInfo)
}
return true;
}


}

?>
}

5 comments on commit 474b717

@psnet
Copy link
Contributor

@psnet psnet commented on 474b717 Oct 28, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

я не понял суть кода вообще. нужно будет пересмотреть

@mzhelskiy
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Берем конфиг из БД и удаляем из него не используемые ключи, которых нет в схеме

@psnet
Copy link
Contributor

@psnet psnet commented on 474b717 Oct 29, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

предлагаю убрать этот код и все таки сделать потом отдельный раздел в утилитах для чистки и записи в бд очищенных данных, т.к. бессмыслено фильтровать постоянно при запуске движка лишние (старые) ключи и не писать результат назад в бд. это как удалить вирус из памяти, но не найти его на диске и не очистить оттуда.
#19

@mzhelskiy
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Замеры на ноутбуке показывают такой результат - на конфиг ядра уходит 0.008 секунды, остальные плагины на порядок меньше. Поэтому этот момент пока не критичен и он всегда обеспечивает актуальность конфига.

А так согласен, утилиту добавить надо + повесить ее функционал на активацию/деактивацию плагинов.

@psnet
Copy link
Contributor

@psnet psnet commented on 474b717 Oct 29, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

тогда #19 не закрывать

Please sign in to comment.