get($cacheString); $cached = is_array($settingsMetadata); if (!$cached) { $settingsMetadata = $cache->get(self::ALL); if (empty($settingsMetadata)) { global $civicrm_root; $metaDataFolders = array($civicrm_root . '/settings'); \CRM_Utils_Hook::alterSettingsFolders($metaDataFolders); $settingsMetadata = self::loadSettingsMetaDataFolders($metaDataFolders); $cache->set(self::ALL, $settingsMetadata); } } \CRM_Utils_Hook::alterSettingsMetaData($settingsMetadata, $domainID, NULL); if (!$cached) { $cache->set($cacheString, $settingsMetadata); } self::_filterSettingsSpecification($filters, $settingsMetadata); return $settingsMetadata; } /** * Load the settings files defined in a series of folders. * @param array $metaDataFolders * List of folder paths. * @return array */ protected static function loadSettingsMetaDataFolders($metaDataFolders) { $settingsMetadata = array(); $loadedFolders = array(); foreach ($metaDataFolders as $metaDataFolder) { $realFolder = realpath($metaDataFolder); if (is_dir($realFolder) && !isset($loadedFolders[$realFolder])) { $loadedFolders[$realFolder] = TRUE; $settingsMetadata = $settingsMetadata + self::loadSettingsMetadata($metaDataFolder); } } return $settingsMetadata; } /** * Load up settings metadata from files. * * @param array $metaDataFolder * * @return array */ protected static function loadSettingsMetadata($metaDataFolder) { $settingMetaData = array(); $settingsFiles = \CRM_Utils_File::findFiles($metaDataFolder, '*.setting.php'); foreach ($settingsFiles as $file) { $settings = include $file; $settingMetaData = array_merge($settingMetaData, $settings); } return $settingMetaData; } /** * Filter the settings metadata according to filters passed in. This is a convenience filter * and allows selective reverting / filling of settings * * @param array $filters * Filters to match against data. * @param array $settingSpec * Metadata to filter. */ protected static function _filterSettingsSpecification($filters, &$settingSpec) { if (empty($filters)) { return; } elseif (array_keys($filters) == array('name')) { $settingSpec = array($filters['name'] => \CRM_Utils_Array::value($filters['name'], $settingSpec, '')); return; } else { foreach ($settingSpec as $field => $fieldValues) { if (array_intersect_assoc($fieldValues, $filters) != $filters) { unset($settingSpec[$field]); } } return; } } }