/** * The constructor method. * * @return OX_Maintenance_Statistics_Task_MigrateBucketData */ function OX_Maintenance_Statistics_Task_MigrateBucketData() { parent::OX_Maintenance_Statistics_Task(); // Locate all plugins (packages) that have been installed $oPluginManager = new OX_PluginManager(); $this->aPackages = $oPluginManager->getPackagesList(); }
/** * The constructor method. * * @return OX_Maintenance_Statistics_Task_MigrateBucketData */ function __construct() { parent::__construct(); // Locate all plugins (packages) that have been installed $oPluginManager = new OX_PluginManager(); $this->aPackages = $oPluginManager->getPackagesList(); }
function __construct() { // Get a connection to the datbase $this->oDbh =& OA_DB::singleton(); // Locate all plugins (packages) that have been installed $oPluginManager = new OX_PluginManager(); $this->aPackages = $oPluginManager->getPackagesList(); }
function test_Enabled() { $oManager = new OX_PluginManager(); $GLOBALS['_MAX']['CONF']['plugins']['foo'] = 0; $this->assertFalse($oManager->isEnabled('foo')); $GLOBALS['_MAX']['CONF']['plugins']['foo'] = 1; $this->assertTrue($oManager->isEnabled('foo')); unset($GLOBALS['_MAX']['CONF']['plugins']['foo']); }
/** * Prepare urls to run install plugin tasks * * @param string $baseInstalUrl Base install URL (prepared by * OX_Admin_UI_Controller_Request::getBaseUrl) * @return array Array of arrays of 'id', name' and 'url' strings */ static function getTasksUrls($baseInstallUrl) { $aUrls = array(); $aPluginZips = array(); // Collect all plugin files present in the etc/plugins folder... $PLUGINS_DIR = opendir(MAX_PATH . '/etc/plugins'); while ($file = readdir($PLUGINS_DIR)) { if (substr($file, 0, 1) == '.' || substr($file, strrpos($file, '.')) != '.zip') { continue; } $name = substr($file, 0, strrpos($file, '.')); $aPluginZips[$name] = array('id' => 'plugin:' . $name, 'name' => $GLOBALS['strPluginTaskChecking'] . ': <br/> ' . OX_Upgrade_InstallPlugin_Controller::openxToRevivePluginName($name), 'url' => $baseInstallUrl . 'install-plugin.php?status=0&plugin=' . $name . '&disabled=1'); } closedir($PLUGINS_DIR); // Get installed plugins if upgrade $oStorage = OX_Admin_UI_Install_InstallUtils::getSessionStorage(); $oStatus = $oStorage->get('installStatus'); if (isset($oStatus) && $oStatus->isUpgrade()) { foreach ($GLOBALS['_MAX']['CONF']['plugins'] as $name => $enabled) { if (in_array($name, self::$DEPRECATED_PLUGINS)) { $status = '2'; // Remove plugin; deprecated } else { $status = '1'; // Install or migrate } $displayName = $name; $oPluginManager = new OX_PluginManager(); $aPackageInfo = $oPluginManager->getPackageInfo($name); if ($aPackageInfo['displayname']) { $displayName = $aPackageInfo['displayname']; } $aUrls[] = array('id' => 'plugin:' . $name, 'name' => $GLOBALS['strPluginTaskChecking'] . ': <br/> ' . OX_Upgrade_InstallPlugin_Controller::openxToRevivePluginName($displayName), 'url' => $baseInstallUrl . 'install-plugin.php?status=' . $status . '&plugin=' . $name); unset($aPluginZips[$name]); } } // Get the list of bundled plugins, retain order include MAX_PATH . '/etc/default_plugins.php'; if ($aDefaultPlugins) { foreach ($aDefaultPlugins as $idx => $aPlugin) { if (!array_key_exists($aPlugin['name'], $GLOBALS['_MAX']['CONF']['plugins'])) { $url = $baseInstallUrl . 'install-plugin.php?status=0&plugin=' . $aPlugin['name']; if (!empty($aPlugin['disabled'])) { $url .= '&disabled=1'; } $aUrls[] = array('id' => 'plugin:' . $aPlugin['name'], 'name' => $GLOBALS['strPluginTaskInstalling'] . ': <br/> ' . OX_Upgrade_InstallPlugin_Controller::openxToRevivePluginName($aPlugin['name']), 'url' => $url); unset($aPluginZips[$aPlugin['name']]); } } } // Anything left in the $aPluginsZip array are unknown plugins, should be installed but disabled foreach ($aPluginZips as $pluginName => $pluginArray) { $aUrls[] = $pluginArray; } return $aUrls; }
function test_upgradeConfig() { $oPkgMgr = new OX_PluginManager(); $zipFile = $this->aUpload['tmp_name']; // version 2 package should be installed // put the version 3 package in place $this->_switchFiles(3); $this->assertTrue($oPkgMgr->_checkPackageContents($this->packageName . '.xml', $zipFile, true)); $aPlugin = $oPkgMgr->aParse['plugins'][1]; $this->assertEqual($aPlugin['version'], '0.0.3'); // Test 2 : upgrade to version 0.0.3 ; this involves 0 upgrade or schema packages, just a version stamp $oUpgrader = new OX_Plugin_UpgradeComponentGroup($aPlugin, $oPkgMgr); $this->assertTrue($oUpgrader->canUpgrade()); $this->assertEqual($oUpgrader->existing_installation_status, OA_STATUS_CAN_UPGRADE); // decompress the zip file, 2nd param indicates overwrite previous files $oPkgMgr->_unpack($this->aUpload, true); // now that the files are in place, the upgrader can do a schema integrity check $this->assertTrue($oUpgrader->canUpgrade()); $this->assertEqual($oUpgrader->existing_installation_status, OA_STATUS_CAN_UPGRADE); $this->assertEqual(count($oUpgrader->aPackageList), 0); $aConf =& $GLOBALS['_MAX']['CONF'][$aPlugin['name']]; // _upgradeConfig calls _upgradeSettings() and _upgradePreferences // Test 1 Settings // set non-default settings $aConf['setting1'] = 'testval1'; $aConf['setting2'] = 'testval2'; $aConf['setting3'] = 'testval3'; $this->assertTrue($oUpgrader->_upgradeSettings()); // old settings should have original values // new setting should have default value // deprecated setting should no longer exist $aConf =& $GLOBALS['_MAX']['CONF'][$aPlugin['name']]; $this->assertEqual(count($aConf), 3); $this->assertEqual($aConf['setting1'], 'testval1'); $this->assertEqual($aConf['setting2'], 'testval2'); $this->assertFalse(isset($aConf['setting3'])); $this->assertEqual($aConf['setting4'], 'setval4'); // Test 2 Preferences $oDbh = OA_DB::singleton(); $qryPrefs = 'preference_name LIKE ' . $oDbh->quote('%' . $prefix . '%'); $prefix = $aPlugin['name'] . '_'; $doPreferences = OA_Dal::factoryDO('preferences'); $doPreferences->whereAdd($qryPrefs); $doPreferences->find(); while ($doPreferences->fetch()) { $doAccount_Preference_Assoc = OA_Dal::factoryDO('account_preference_assoc'); $doAccount_Preference_Assoc->whereAdd('preference_id = ' . $doPreferences->preference_id); $aPrefsOld[$doPreferences->preference_name] = array('permission' => $doPreferences->account_type, 'id' => $doPreferences->preference_id, 'acct_assoc' => $doAccount_Preference_Assoc->getAll()); } $this->assertEqual(count($aPrefsOld), 2); $this->assertFalse(isset($aPrefsOld[$prefix . 'preference3'])); $this->assertTrue(isset($aPrefsOld[$prefix . 'preference1'])); $this->assertTrue(isset($aPrefsOld[$prefix . 'preference2'])); $this->assertEqual($aPrefsOld[$prefix . 'preference1']['permission'], 'MANAGER'); $this->assertEqual($aPrefsOld[$prefix . 'preference2']['permission'], 'ADMIN'); $this->assertTrue(isset($aPrefsOld[$prefix . 'preference1']['acct_assoc'])); $this->assertTrue(isset($aPrefsOld[$prefix . 'preference2']['acct_assoc'])); $this->assertEqual($aPrefsOld[$prefix . 'preference1']['acct_assoc'][0]['account_id'], '0'); $this->assertEqual($aPrefsOld[$prefix . 'preference2']['acct_assoc'][0]['account_id'], '0'); $this->assertTrue($oUpgrader->_upgradePreferences()); $doPreferences = OA_Dal::factoryDO('preferences'); $doPreferences->whereAdd($qryPrefs); $doPreferences->find(); while ($doPreferences->fetch()) { $doAccount_Preference_Assoc = OA_Dal::factoryDO('account_preference_assoc'); $doAccount_Preference_Assoc->whereAdd('preference_id = ' . $doPreferences->preference_id); $aPrefsNew[$doPreferences->preference_name] = array('permission' => $doPreferences->account_type, 'id' => $doPreferences->preference_id, 'acct_assoc' => $doAccount_Preference_Assoc->getAll()); } $this->assertEqual(count($aPrefsNew), 2); $this->assertFalse(isset($aPrefsNew[$prefix . 'preference2'])); $this->assertTrue(isset($aPrefsNew[$prefix . 'preference1'])); $this->assertTrue(isset($aPrefsNew[$prefix . 'preference3'])); $this->assertEqual($aPrefsNew[$prefix . 'preference1']['permission'], 'MANAGER'); $this->assertEqual($aPrefsNew[$prefix . 'preference3']['permission'], 'ADMIN'); $this->assertTrue(isset($aPrefsNew[$prefix . 'preference1']['acct_assoc'])); $this->assertTrue(isset($aPrefsNew[$prefix . 'preference3']['acct_assoc'])); $this->assertEqual($aPrefsNew[$prefix . 'preference1']['acct_assoc'][0]['account_id'], '0'); $this->assertEqual($aPrefsNew[$prefix . 'preference3']['acct_assoc'][0]['account_id'], '0'); $doAccount_Preference_Assoc = OA_Dal::factoryDO('account_preference_assoc'); $doAccount_Preference_Assoc->preference_id = $aPrefsOld['testPlugin_preference2']['id']; $this->assertFalse($doAccount_Preference_Assoc->find()); $oPkgMgr->uninstallPackage($this->packageName); }
function getComponentsHookCache() { if (!isset($GLOBALS['_MAX']['ComponentHooks'])) { $oCache = new OA_Cache('Plugins', 'ComponentHooks'); $oCache->setFileNameProtection(false); $GLOBALS['_MAX']['ComponentHooks'] = $oCache->load(true); if ($GLOBALS['_MAX']['ComponentHooks'] === false) { require_once LIB_PATH . '/Plugin/PluginManager.php'; $oPluginManager = new OX_PluginManager(); $GLOBALS['_MAX']['ComponentHooks'] = $oPluginManager->getComponentHooks(); $oCache->save($GLOBALS['_MAX']['ComponentHooks']); } } return $GLOBALS['_MAX']['ComponentHooks']; }
| | | You should have received a copy of the GNU General Public License | | along with this program; if not, write to the Free Software | | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | +---------------------------------------------------------------------------+ $Id: plugin-index.php 37157 2009-05-28 12:31:10Z andrew.hill $ */ // Require the initialisation file require_once '../../init.php'; // Required files require_once MAX_PATH . '/www/admin/config.php'; require_once LIB_PATH . '/Plugin/PluginManager.php'; require_once LIB_PATH . '/Plugin/ComponentGroupManager.php'; // Security check OA_Permission::enforceAccount(OA_ACCOUNT_ADMIN); $oPluginManager = new OX_PluginManager(); $oComponentGroupManager = new OX_Plugin_ComponentGroupManager(); $action = $_REQUEST['action']; $plugin = $_REQUEST['package']; $group = $_REQUEST['group']; $parent = $_REQUEST['parent']; //install if (array_key_exists('install', $_POST)) { if (array_key_exists('filename', $_FILES)) { $oPluginManager->installPackage($_FILES['filename']); } } else { if (array_key_exists('import', $_POST)) { if (array_key_exists('filename', $_FILES)) { $oPluginManager->installPackageCodeOnly($_FILES['filename']); }
function test_getPackageDiagnostics() { $oPkgMgr = new OX_PluginManager(); $file = MAX_PATH . $this->testpathData . 'zipDiagnosticTest/testPluginPackage.zip'; unset($GLOBALS['_MAX']['CONF']['plugins']['testPluginPackage']); unset($GLOBALS['_MAX']['CONF']['pluginGroupComponents']['testPlugin001']); //install $this->assertTrue($oPkgMgr->installPackage(array('tmp_name' => $file, 'name' => 'testPluginPackage.zip'))); if (count($oPkgMgr->aErrors)) { foreach ($oPkgMgr->aErrors as $error) { $this->fail($error); } } $aResultGood = $oPkgMgr->getPackageDiagnostics('testPluginPackage'); $this->assertFalse($aResultGood['plugin']['error']); unlink(MAX_PATH . $oPkgMgr->pathPluginsAdmin . 'testPlugin001/' . 'testPlugin-common.php'); $oPkgMgr->_unregisterSettings('testPlugin001', false); unset($GLOBALS['_MAX']['CONF']['testPlugin001']); unset($GLOBALS['_MAX']['CONF']['testPlugin001']['setting1']); $oPkgMgr->_unregisterPluginVersion('testPlugin001'); $oPkgMgr->_unregisterSchemaVersion('testPlugin001'); $oPkgMgr->_unregisterPreferences('testPlugin001', $aResultGood['groups'][0]['install']['config']['preferences']); $oPkgMgr->_dropTables('testPlugin', $aResultGood['groups'][0]['install']['database']['mdb2schema']); $aResultBad = $oPkgMgr->getPackageDiagnostics('testPluginPackage'); $this->assertTrue($aResultBad['groups'][1]['error']); //uninstall $this->assertTrue($oPkgMgr->uninstallPackage('testPluginPackage')); TestEnv::restoreConfig(); }
function checkPlugin($pluginName) { $aErrors = array(); $aResult = array('name' => $pluginName, 'status' => '', 'errors' => &$aErrors); require_once LIB_PATH . '/Plugin/PluginManager.php'; $oPluginManager = new OX_PluginManager(); // if plugin definition is not found in situ // try to import plugin code from the previous installation if (!file_exists(MAX_PATH . $GLOBALS['_MAX']['CONF']['pluginPaths']['packages'] . $pluginName . '.xml')) { if (isset($GLOBALS['_MAX']['CONF']['pluginPaths']['export'])) { $file = $GLOBALS['_MAX']['CONF']['pluginPaths']['export'] . $pluginName . '.zip'; if (file_exists($file)) { $aFile['name'] = $file; $aFile['tmp_name'] = $file; $aErrors[] = 'Exported plugin file found, attempting to import from ' . $file; if (!$oPluginManager->installPackageCodeOnly($aFile)) { if ($oPluginManager->countErrors()) { $aResult['status'] = 'Failed'; foreach ($oPluginManager->aErrors as $errmsg) { $aErrors[] = $errmsg; } } } else { $aResult['status'] = 'OK'; } } } } // Try to upgrade bundled plugins include_once MAX_PATH . '/etc/default_plugins.php'; if ($aDefaultPlugins) { foreach ($aDefaultPlugins as $idx => $aPlugin) { if ($aPlugin['name'] == $pluginName) { $upgraded = false; $oPluginManager = new OX_PluginManager(); $aFileName['name'] = $aPlugin['name'] . '.' . $aPlugin['ext']; $aFileName['tmp_name'] = $aPlugin['path'] . $aPlugin['name'] . '.' . $aPlugin['ext']; $aFileName['type'] = 'application/zip'; $upgraded = $oPluginManager->upgradePackage($aFileName, $pluginName); if (!empty($oPluginManager->aErrors) && !empty($oPluginManager->previousVersionInstalled) && $oPluginManager->previousVersionInstalled != OX_PLUGIN_SAME_VERSION_INSTALLED) { foreach ($oPluginManager->aErrors as $i => $msg) { $aErrors[] = $msg; } } } } } // now diagnose problems $aDiag = $oPluginManager->getPackageDiagnostics($pluginName); if ($aDiag['plugin']['error']) { $aErrors[] = 'Problems found with plugin ' . $pluginName . '. The plugin has been disabled. Go to the Configuration Plugins page for details '; foreach ($aDiag['plugin']['errors'] as $i => $msg) { $aErrors[] = $msg; } } foreach ($aDiag['groups'] as $idx => &$aGroup) { if ($aGroup['error']) { $aDiag['plugin']['error'] = true; $aErrors[] = 'Problems found with components in group ' . $aGroup['name'] . '. The ' . $pluginName . ' plugin has been disabled. Go to the Configuration->Plugins page for details '; foreach ($aGroup['errors'] as $i => $msg) { $aErrors[] = $msg; } } } $enabled = wasPluginEnabled($pluginName); // original setting if (!$aDiag['plugin']['error']) { if ($upgraded) { $aResult['status'] .= 'OK, Upgraded'; } elseif ($oPluginManager->previousVersionInstalled == OX_PLUGIN_NEWER_VERSION_INSTALLED) { $aResult['status'] .= 'OK. Notice: You have a newer plugin version installed than the one that comes with this upgrade package.'; } elseif ($oPluginManager->previousVersionInstalled == OX_PLUGIN_SAME_VERSION_INSTALLED) { $aResult['status'] .= 'OK, Up to date'; } else { $aResult['status'] .= 'OK'; } if ($enabled) { if ($oPluginManager->enablePackage($pluginName)) { $aResult['status'] .= ', Enabled'; } else { $aResult['status'] .= ', failed to enable, check plugin configuration'; } } else { $aResult['status'] .= ', Disabled'; } } else { $aResult['status'] = 'Errors, disabled'; } return $aResult; }
/** * A function to remove the configiration setup for any plugins that were found * in the previous installation before upgrade, but which have been marked as * deprecated plugins. * * @param string $pluginName The name of the plugin to remove. * @return array An array of the 'name', 'status' and any 'errors' as an array. */ function removePlugin($pluginName) { $aErrors = array(); $aResult = array('name' => $pluginName, 'status' => '', 'errors' => &$aErrors); if (array_key_exists($pluginName, $GLOBALS['_MAX']['CONF']['plugins'])) { require_once RV_PATH . '/lib/RV.php'; require_once MAX_PATH . '/lib/OA.php'; require_once LIB_PATH . '/Plugin/PluginManager.php'; $oPluginManager = new OX_PluginManager(); $result = $oPluginManager->uninstallPackage($pluginName, true); if ($result) { $aResult['status'] = '<br />Uninstalled'; } else { $aResult['status'] = '<br />Error'; $aErrors[] = 'Problems found with plugin ' . $pluginName . '. The plugin was found in the previous installation' . ' and has been marked as deprecated, but was unable to' . ' be removed. Please go to the Configuration Plugins page' . ' and remove it.'; } } else { $aResult['status'] = '<br />OK; Not installed'; $aErrors[] = 'Problems found with plugin ' . $pluginName . '. The plugin was found in the previous installation' . ' and has been marked as deprecated, but was then not' . ' found as being installed when attempting to remove it.' . ' Please go to the Configuration Plugins page to ensure' . ' it is not installed.'; } return $aResult; }
static function getPluginPackageManager($mock) { if ($mock) { Mock::generatePartial('OX_PluginManager', $mockPkgMgrClass = 'MOX_PluginManager' . rand(), array('_auditInit', '_auditSetKeys', '_auditStart', '_auditUpdate', '_auditSetID', '_checkDatabaseEnvironment', '_registerSchema', '_registerPreferences', '_registerPluginVersion', '_unregisterSchema', '_unregisterPreferences', '_unregisterPluginVersion', '_runExtensionTasks')); $oPkgMgr = new $mockPkgMgrClass(); // install tasks $oPkgMgr->setReturnValue('_auditInit', true); $oPkgMgr->setReturnValue('_auditSetKeys', true); $oPkgMgr->setReturnValue('_auditStart', true); $oPkgMgr->setReturnValue('_auditUpdate', true); $oPkgMgr->setReturnValue('_checkDatabaseEnvironment', true); //$oPkgMgr->setReturnValue('_runScript', true); //$oPkgMgr->setReturnValue('_checkDependenciesForInstallOrEnable', true); //$oPkgMgr->setReturnValue('_checkFiles', true); //$oPkgMgr->setReturnValue('_checkMenus', true); $oPkgMgr->setReturnValue('_registerSchema', true); $oPkgMgr->setReturnValue('_registerPreferences', true); //$oPkgMgr->setReturnValue('_registerSettings', true); $oPkgMgr->setReturnValue('_registerPluginVersion', true); // uninstall tasks //$oPkgMgr->setReturnValue('_checkDependenciesForUninstallOrDisable', true); $oPkgMgr->setReturnValue('_unregisterPluginVersion', true); $oPkgMgr->setReturnValue('_unregisterPreferences', true); //$oPkgMgr->setReturnValue('_unregisterSettings', true); $oPkgMgr->setReturnValue('_unregisterSchema', true); //$oPkgMgr->setReturnValue('_removeFiles', true); } else { $oPkgMgr = new OX_PluginManager(); } $oPkgMgr->init(); return $oPkgMgr; }
function processForm(&$form, $aPluginValues) { global $pathPlugin, $pathPackages, $pathAdmin; $aPaths = $GLOBALS['_MAX']['CONF']['pluginPaths']; $varTmp = MAX_PATH . '/var/tmp/'; if (!file_exists($varTmp)) { mkdir($varTmp, 0777); } $pathPlugin = $varTmp . $aPluginValues['name']; if (!file_exists($pathPlugin)) { mkdir($pathPlugin, 0777); } $pathPackages = $pathPlugin . $aPaths['packages']; $pathAdmin = $pathPlugin . $aPaths['admin']; require_once LIB_PATH . '/Plugin/PluginManager.php'; $oPluginManager = new OX_PluginManager(); $aVersion = $aPluginValues['version']; $aPluginValues['date'] = date('Y-m-d'); $aPluginValues['oxversion'] = OA_VERSION; $aPluginValues['version'] = $aVersion['major'] . '.' . $aVersion['minor'] . '.' . $aVersion['build'] . $aVersion['status']; $aGroupValues = $aPluginValues['group']; unset($aPluginValues['group']); foreach ($aGroupValues as $extension => $aGroup) { if ($aGroup['groupname']) { $aVals = $aPluginValues; $aVals['extension'] = $extension; $aVals['name'] = $aGroup['groupname']; $aVals['group'] = $aGroup['groupname']; $aPluginValues['grouporder'][] = $aGroup['groupname']; $oPluginManager->_decompressFile('etc/group.zip', $pathPackages . $aGroup['groupname']); $oBuilder = new OX_PluginBuilder_Group(); if (isset($aGroup['schema']) && $aGroup['schema']) { $oBuilder->schema = true; $oPluginManager->_decompressFile('etc/schema.zip', $pathPackages . $aGroup['groupname']); } if ($extension == 'admin') { $oPluginManager->_decompressFile('etc/admin.zip', $pathPlugin); rename($pathAdmin . 'group', $pathAdmin . $aGroup['groupname']); } $oBuilder->init($aVals); $oBuilder->putGroup(); } } $oPluginManager->_decompressFile('etc/plugin.zip', $pathPackages); $oBuilder = new OX_PluginBuilder_Package(); $oBuilder->init($aPluginValues); $oBuilder->putPlugin(); $aMessages[] = $aPluginValues['name'] . ' created in ' . $pathPlugin; return $aMessages; }
function getPluginsDiagnostics() { require_once LIB_PATH . '/Plugin/PluginManager.php'; $oPluginManager = new OX_PluginManager(); $aPlugins = $GLOBALS['_MAX']['CONF']['plugins'] ? $GLOBALS['_MAX']['CONF']['plugins'] : array(); $aComponentGroups = $GLOBALS['_MAX']['CONF']['pluginGroupComponents'] ? $GLOBALS['_MAX']['CONF']['pluginGroupComponents'] : array(); foreach ($aPlugins as $name => $enabled) { $aPlugin = $oPluginManager->getPackageDiagnostics($name, true); $aResult['detail'][] = $aPlugin; $aGroups = $aPlugin['groups']; $aPlugin = $aPlugin['plugin']; if ($aPlugin['error']) { foreach ($aPlugin['errors'] as $i => $msg) { $aResult['errors'][] = $name . ': ' . $msg; } } foreach ($aGroups as $i => &$aGroup) { if (array_key_exists($aGroup['name'], $aComponentGroups)) { unset($aComponentGroups[$aGroup['name']]); } if ($aGroup['error']) { foreach ($aGroup['errors'] as $i => $msg) { $aResult['errors'][] = $aGroup['name'] . ': ' . $msg; } $aPlugin['error'] = true; } } $aResult['simple'][] = array('name' => $aPlugin['name'], 'version' => $aPlugin['version'], 'enabled' => $enabled, 'error' => $aPlugin['error']); } foreach ($aComponentGroups as $name => $enabled) { $aResult['errors'][] = $name . ': ' . ' is configured as installed but not found to exist'; } return $aResult; }