/** * Add information in config array by handle path * * @param string $sKey Ключ * @param mixed $value Значение * @param string $sInstance Название инстанции конфига * @return bool */ public static function Set($sKey, $value, $sInstance = self::DEFAULT_CONFIG_INSTANCE) { $aKeys = explode('.', $sKey); if (isset($value['$root$']) && is_array($value['$root$'])) { $aRoot = $value['$root$']; unset($value['$root$']); foreach ($aRoot as $sRk => $mRv) { self::Set($sRk, self::isExist($sRk) ? func_array_merge_assoc(Config::Get($sRk, $sInstance), $mRv) : $mRv, $sInstance); } } $sEval = 'self::getInstance($sInstance)->aConfig'; foreach ($aKeys as $sK) { $sEval .= '[' . var_export((string) $sK, true) . ']'; } $sEval .= '=$value;'; eval($sEval); return true; }
/** * Возврашает параметры для группы, если каких то параметров в группе нет, то используются дефолтные * * @param string $sName Имя группы * @return array */ public function BuildParams($sName = null) { if (is_null($sName)) { return Config::Get('module.image.default'); } $aDefault = (array) Config::Get('module.image.default'); $aNamed = (array) Config::Get('module.image.' . strtolower($sName)); return func_array_merge_assoc($aDefault, $aNamed); }
/** * Сливает два ассоциативных массива * * @param unknown_type $aArr1 * @param unknown_type $aArr2 * @return unknown */ function func_array_merge_assoc($aArr1, $aArr2) { $aRes = $aArr1; foreach ($aArr2 as $k2 => $v2) { $bIsKeyInt = false; if (is_array($v2)) { foreach ($v2 as $k => $v) { if (is_int($k)) { $bIsKeyInt = true; break; } } } if (is_array($v2) and !$bIsKeyInt and isset($aArr1[$k2])) { $aRes[$k2] = func_array_merge_assoc($aArr1[$k2], $v2); } else { $aRes[$k2] = $v2; } } return $aRes; }
/** * Запрос URL через механизм socket * * @param $sUrl * @param string $aParams * @param string $sMethod * @param array $aOptions * @return string */ public function socketSend($sUrl, $aParams = '', $sMethod = 'GET', $aOptions = array()) { $sParams = self::BuildParamsStr($aParams); $aUrl = parse_url($sUrl); $sMethod = strtoupper($sMethod); if ($sMethod == 'POST') { $aSocketOptions = array('Content-type' => 'application/x-www-form-urlencoded', 'Content-length' => strlen($sParams)); } else { $aSocketOptions = array(); } $aSocketOptions = func_array_merge_assoc($aSocketOptions, $aOptions); $sRequest = "POST {$aUrl['path']} HTTP/1.1\r\n"; $sRequest .= "Host: {$aUrl['host']}\r\n"; foreach ($aSocketOptions as $sKey => $sVal) { if (is_integer($sKey)) { $sRequest .= $sVal . "\r\n"; } else { $sRequest .= $sKey . ':' . $sVal . "\r\n"; } } if ($sMethod == 'POST') { $sRequest .= "\r\n{$sParams}\r\n\r\n"; } // открывает сокет $sh = @fsockopen($aUrl['host'], isset($aUrl['port']) ? $aUrl['port'] : 80, $errno, $errstr, self::$nTimeOut); if (!$sh) { return false; } // передаем данные fputs($sh, $sRequest); $sResponse = ''; while (($sLine = fgets($sh, 4096)) !== false) { $sResponse .= $sLine; } // закрываем сокет fclose($sh); return $sResponse; }
$aPluginsList = array_map('trim', $aPluginsList); foreach ($aPluginsList as $sPlugin) { $aConfigFiles = glob($sPluginsDir . '/' . $sPlugin . '/config/*.php'); if ($aConfigFiles and count($aConfigFiles) > 0) { $aConfig = array(); foreach ($aConfigFiles as $sPath) { $aConfig = (include $sPath); if (!empty($aConfig) && is_array($aConfig)) { // Если конфиг этого плагина пуст, то загружаем массив целиком $sKey = "plugin.{$sPlugin}"; if (!Config::isExist($sKey)) { Config::Set($sKey, $aConfig); } else { // Если уже существую привязанные к плагину ключи, // то сливаем старые и новое значения ассоциативно Config::Set($sKey, func_array_merge_assoc(Config::Get($sKey), $aConfig)); } } } } /** * Подключаем include-файлы */ $aIncludeFiles = glob($sPluginsDir . '/' . $sPlugin . '/include/*.php'); if ($aIncludeFiles and count($aIncludeFiles)) { foreach ($aIncludeFiles as $sPath) { require_once $sPath; } } } }
/** * Добавить к текстовкам массив сообщений * * @param array $aMessages Список текстовок для добавления * @param array|null $aParams Параметры, позволяют хранить текстовки в структурированном виде, например, тестовки плагина "test" получать как Get('plugin.name.test') */ public function AddMessages($aMessages, $aParams = null) { if (is_array($aMessages)) { if (isset($aParams['name'])) { $sMsgs = $aMessages; if (isset($aParams['category'])) { if (isset($this->aLangMsg[$aParams['category']][$aParams['name']])) { $sMsgs = func_array_merge_assoc($this->aLangMsg[$aParams['category']][$aParams['name']], $sMsgs); } $this->aLangMsg[$aParams['category']][$aParams['name']] = $sMsgs; } else { if (isset($this->aLangMsg[$aParams['name']])) { $sMsgs = func_array_merge_assoc($this->aLangMsg[$aParams['name']], $sMsgs); } $this->aLangMsg[$aParams['name']] = $sMsgs; } } else { $this->aLangMsg = func_array_merge_assoc($this->aLangMsg, $aMessages); } } }
protected function EventInfo() { $this->sMenuItemSelect = Router::GetActionEvent(); if ($this->GetParam(0) == 'phpinfo') { $this->EventInfoPhpInfo(1); } elseif ($this->GetParam(0) == 'params') { $this->EventInfoParams(); } else { $this->sMenuSubItemSelect = 'about'; $this->PluginSetTemplate('info_about'); //$this->SetTemplate(HelperPlugin::GetTemplateActionPath('info_about.tpl')); } $aSiteStat = $this->PluginAceadminpanel_Admin_GetSiteStat(); $this->_AddBlock('right', 'admin_info'); $aPlugins = $this->Plugin_GetList(); foreach ($aPlugins as $sPlugin => $aPliginProps) { if (isset($aPliginProps['is_active']) and $aPliginProps['is_active']) { $sPluginClass = 'Plugin' . ucfirst($sPlugin); if (class_exists($sPluginClass) and method_exists($sPluginClass, 'GetUpdateInfo')) { $oPlugin = new $sPluginClass(); $aPlugins[$sPlugin]['update_info'] = $oPlugin->GetUpdateInfo(); } } } // Active plugins insert into top of list $aActivePlugins = $this->Plugin_GetActivePlugins(); $aPluginList = array(); foreach ($aActivePlugins as $sPlugin) { if (isset($aPlugins[$sPlugin])) { $aPluginList[$sPlugin] = $aPlugins[$sPlugin]; unset($aPlugins[$sPlugin]); } } $aPluginList = func_array_merge_assoc($aPluginList, $aPlugins); $this->Viewer_Assign('aSiteStat', $aSiteStat); $this->Viewer_Assign('aPlugins', $aPluginList); }
/** * Возврашает параметры для группы, если каких-то параметров в группе нет, то используются дефолтные * * @param string $sName Имя группы * @return array */ public function BuildParams($sName = null) { $aDefault = func_array_merge_assoc($this->aParamsDefault, (array) Config::Get('module.image.params.default')); if (is_null($sName)) { return $aDefault; } $aNamed = (array) Config::Get('module.image.params.' . strtolower($sName)); return func_array_merge_assoc($aDefault, $aNamed); }
/** * Возвращает json данные компонента с учетом наследования * * @param $aPaths * @return array|mixed */ protected function GetComponentJson(&$aPaths) { /** * Получаем пути в обратном порядке, т.к. будем мержить данные */ $aPaths = array_reverse($aPaths); $aPathsNew = array(); $aJson = array(); foreach ($aPaths as $sPath) { $sFileJson = $sPath . '/component.json'; if (file_exists($sFileJson)) { if ($sContent = @file_get_contents($sFileJson) and $aData = @json_decode($sContent, true)) { if (isset($aData['mode']) and $aData['mode'] == 'delegate') { $aJson = $aData; /** * Удаляем прошлые каталоги */ $aPathsNew = array(); } else { $aJson = func_array_merge_assoc($aJson, $aData); } } } $aPathsNew[] = $sPath; } /** * Подменяем пути */ $aPaths = array_reverse($aPathsNew); return $aJson; }
/** * Подгрузка файла конфигурации для конкретного плагина * * @param string $sPlugin - плагин * @param string $sConfigFile - файл конфигурации */ static function LoadPluginConfig($sPlugin, $sConfigFile) { if (is_file($sConfigFile)) { $sKey = 'plugin.' . $sPlugin; $aPluginConfig = Config::Get($sKey); // переменная $config нужна для того, чтоб ее можно было не определять внутри файла $config = array(); $aResult = (include $sConfigFile); if (!$aResult or !is_array($aResult)) { $aResult = $config; } if ($aResult) { $aPluginConfig = func_array_merge_assoc($aPluginConfig, $aResult); Config::Set($sKey, $aPluginConfig); } } }