/** * {@inheritdoc} */ public function execute() { $function = rex_request('function', 'string'); if (!in_array($function, ['install', 'uninstall', 'activate', 'deactivate', 'delete'])) { throw new rex_api_exception('Unknown package function "' . $function . '"!'); } $packageId = rex_request('package', 'string'); $package = rex_package::get($packageId); if ($function == 'uninstall' && !$package->isInstalled() || $function == 'activate' && $package->isAvailable() || $function == 'deactivate' && !$package->isAvailable() || $function == 'delete' && !rex_package::exists($packageId)) { throw new rex_api_exception('Illegal operation "' . $function . '" for package "' . $packageId . '"'); } if ($package instanceof rex_null_package) { throw new rex_api_exception('Package "' . $packageId . '" doesn\'t exists!'); } $reinstall = 'install' === $function && $package->isInstalled(); $manager = rex_package_manager::factory($package); $success = $manager->{$function}(); $message = $manager->getMessage(); $result = new rex_api_result($success, $message); if ($success && !$reinstall) { $result->setRequiresReboot(true); } return $result; }
private static function installAddons($uninstallBefore = false, $installDump = true) { $addonErr = ''; rex_package_manager::synchronizeWithFileSystem(); if ($uninstallBefore) { foreach (array_reverse(rex_package::getSystemPackages()) as $package) { $manager = rex_package_manager::factory($package); $state = $manager->uninstall($installDump); if ($state !== true) { $addonErr .= '<li>' . $package->getPackageId() . '<ul><li>' . $manager->getMessage() . '</li></ul></li>'; } } } foreach (rex::getProperty('system_addons') as $packageRepresentation) { $state = true; $package = rex_package::get($packageRepresentation); $manager = rex_package_manager::factory($package); if ($state === true && !$package->isInstalled()) { $state = $manager->install($installDump); } if ($state !== true) { $addonErr .= '<li>' . $package->getPackageId() . '<ul><li>' . $manager->getMessage() . '</li></ul></li>'; } if ($state === true && !$package->isAvailable()) { $state = $manager->activate(); if ($state !== true) { $addonErr .= '<li>' . $package->getPackageId() . '<ul><li>' . $manager->getMessage() . '</li></ul></li>'; } } } if ($addonErr != '') { $addonErr = '<ul class="rex-ul1"> <li> <h3 class="rex-hl3">' . rex_i18n::msg('setup_513', '<span class="rex-error">', '</span>') . '</h3> <ul>' . $addonErr . '</ul> </li> </ul>'; } return $addonErr; }
/** * Generates the package order. */ public static function generatePackageOrder() { $early = []; $normal = []; $late = []; $requires = []; $add = function ($id) use(&$add, &$normal, &$requires) { $normal[] = $id; unset($requires[$id]); foreach ($requires as $rp => &$ps) { unset($ps[$id]); if (empty($ps)) { $add($rp); } } }; foreach (rex_package::getAvailablePackages() as $package) { $id = $package->getPackageId(); $load = $package->getProperty('load'); if ($package instanceof rex_plugin && !in_array($load, ['early', 'normal', 'late']) && in_array($addonLoad = $package->getAddon()->getProperty('load'), ['early', 'late'])) { $load = $addonLoad; } if ($load === 'early') { $early[] = $id; } elseif ($load === 'late') { $late[] = $id; } else { $req = $package->getProperty('requires'); if ($package instanceof rex_plugin) { $req['packages'][$package->getAddon()->getPackageId()] = true; } if (isset($req['packages']) && is_array($req['packages'])) { foreach ($req['packages'] as $packageId => $reqP) { $package = rex_package::get($packageId); if (!in_array($package, $normal) && !in_array($package->getProperty('load'), ['early', 'late'])) { $requires[$id][$packageId] = true; } } } if (!isset($requires[$id])) { $add($id); } } } rex::setConfig('package-order', array_merge($early, $normal, array_keys($requires), $late)); }
// add package path for fragment loading if (is_readable($folder . 'fragments')) { rex_fragment::addDirectory($folder . 'fragments' . DIRECTORY_SEPARATOR); } // add addon path for class-loading if (is_readable($folder . 'lib')) { rex_autoload::addDirectory($folder . 'lib'); } if (is_readable($folder . 'vendor')) { rex_autoload::addDirectory($folder . 'vendor'); } $autoload = $package->getProperty('autoload'); if (is_array($autoload) && isset($autoload['classes']) && is_array($autoload['classes'])) { foreach ($autoload['classes'] as $dir) { $dir = $package->getPath($dir); if (is_readable($dir)) { rex_autoload::addDirectory($dir); } } } } // now we actually include the addons logic foreach ($packageOrder as $packageId) { $package = rex_package::get($packageId); // include the addon itself if (is_readable($package->getPath(rex_package::FILE_BOOT))) { $package->includeFile(rex_package::FILE_BOOT); } } // ----- all addons configs included rex_extension::registerPoint(new rex_extension_point('PACKAGES_INCLUDED'));
<?php /** * @package redaxo5 */ echo rex_view::title(rex_i18n::msg('addons'), ''); $content = ''; // -------------- RequestVars $subpage = rex_request('subpage', 'string'); // ----------------- HELPPAGE if ($subpage == 'help') { $package = rex_package::get(rex_request('package', 'string')); $name = $package->getPackageId(); $version = $package->getVersion(); $author = $package->getAuthor(); $supportPage = $package->getSupportPage(); if (!is_file($package->getPath('help.php'))) { $content .= rex_view::info(rex_i18n::msg('package_no_help_file')); } else { ob_start(); $package->includeFile('help.php'); $content .= ob_get_clean(); } $fragment = new rex_fragment(); $fragment->setVar('title', rex_i18n::msg('package_help') . ' ' . $name, false); $fragment->setVar('body', $content, false); echo $fragment->parse('core/page/section.php'); $credits = ''; $credits .= '<dl class="dl-horizontal">'; $credits .= '<dt>' . rex_i18n::msg('credits_name') . '</dt><dd>' . htmlspecialchars($name) . '</dd>'; if ($version) {