diff --git a/_build/build.config.php b/_build/build.config.php index 7c085e7..e8fa105 100644 --- a/_build/build.config.php +++ b/_build/build.config.php @@ -50,5 +50,5 @@ $BUILD_RESOLVERS = array( 'chunks', - //'setup', + 'setup', ); diff --git a/_build/resolvers/resolve.setup.php b/_build/resolvers/resolve.setup.php index 0e4f134..44441f5 100644 --- a/_build/resolvers/resolve.setup.php +++ b/_build/resolvers/resolve.setup.php @@ -1,152 +1,122 @@ xpdo || !($transport instanceof xPDOTransport)) { + return false; +} -/*---------------------------------*/ -if (!function_exists('installPackage')) { - function installPackage($packageName) { - global $modx; - - /* @var modTransportProvider $provider */ - if (!$provider = $modx->getObject('transport.modTransportProvider', array('service_url:LIKE' => '%simpledream.ru%', 'OR:service_url:LIKE' => '%modstore.pro%'))) { - $provider = $modx->getObject('transport.modTransportProvider', 1); - } - - $modx->getVersionData(); - $productVersion = $modx->version['code_name'] . '-' . $modx->version['full_version']; - - $response = $provider->request('package', 'GET', array( - 'supports' => $productVersion, - 'query' => $packageName - )); - - if (!empty($response)) { - $foundPackages = simplexml_load_string($response->response); - foreach ($foundPackages as $foundPackage) { - /* @var modTransportPackage $foundPackage */ - if ($foundPackage->name == $packageName) { - $sig = explode('-', $foundPackage->signature); - $versionSignature = explode('.', $sig[1]); - $url = $foundPackage->location; +/** @var modX $modx */ +$modx = $transport->xpdo; +$packages = [ + 'pdoTools' => 'modx.com', +]; + +/** + * Installs a MODX package. + * @param string $packageName The name of the package. + * @param string|null $providerName The name of the package provider. + * @return array An array with the installation result: + * - success: An integer (0 or 1) - 1 in case of successful installation, 0 otherwise. + * - message: A message about the installation result. + */ +$installPackage = function ($packageName, $providerName = null) use ($modx) +{ + if (!$providerName || !$provider = $modx->getObject('transport.modTransportProvider', ['service_url:LIKE' => '%' . $providerName . '%'])) { + $provider = $modx->getObject('transport.modTransportProvider', 1); + } - if (!downloadPackage($url, $modx->getOption('core_path') . 'packages/' . $foundPackage->signature . '.transport.zip')) { - return array( - 'success' => 0, - 'message' => "Could not download package {$packageName}.", - ); - } + $finedPackages = $provider->find(['query' => $packageName]); + $filteredPackages = array_filter($finedPackages[1], fn($item) => strtolower($item['name']) === strtolower($packageName)); + $installablePackage = $filteredPackages ? reset($filteredPackages) : false; + $managerLanguage = $modx->getOption('manager_language'); + $messages = [ + 'ru' => [ + 'already_installed' => "Дополнение {$packageName} уже было установлено", + 'not_found' => "Дополнение {$packageName} не найдено в репозитории {$providerName}", + 'minimum_supports' => "Дополнение {$packageName} требует минимальную версию системы {$installablePackage['minimum_supports']}", + 'download_failed' => "Дополнение {$packageName} не удалось скачать", + 'not_found_during_installation' => "Дополнение {$packageName} не найдено при установке", + 'installed' => "Дополнение {$packageName} установлено", + 'install_failed' => "Дополнение {$packageName} не удалось установить", + ], + 'en' => [ + 'already_installed' => "The add-on {$packageName} has already been installed", + 'not_found' => "The add-on {$packageName} was not found in the {$providerName} repository", + 'minimum_supports' => "The add-on {$packageName} requires a minimum system version of {$installablePackage['minimum_supports']}", + 'download_failed' => "Failed to download the add-on {$packageName}", + 'not_found_during_installation' => "The add-on {$packageName} was not found during installation", + 'installed' => "The add-on {$packageName} has been installed", + 'install_failed' => "Failed to install the add-on {$packageName}", + ], + ]; + + $messages = isset($messages[$managerLanguage]) ? $messages[$managerLanguage] : $messages['en']; + + if ($modx->getObject('transport.modTransportPackage', ['package_name' => $packageName, 'installed:IS NOT' => null])) { + return [ + 'success' => 1, + 'message' => $messages['already_installed'], + ]; + } - /* add in the package as an object so it can be upgraded */ - /** @var modTransportPackage $package */ - $package = $modx->newObject('transport.modTransportPackage'); - $package->set('signature', $foundPackage->signature); - $package->fromArray(array( - 'created' => date('Y-m-d h:i:s'), - 'updated' => null, - 'state' => 1, - 'workspace' => 1, - 'provider' => $provider->id, - 'source' => $foundPackage->signature . '.transport.zip', - 'package_name' => $packageName, - 'version_major' => $versionSignature[0], - 'version_minor' => !empty($versionSignature[1]) ? $versionSignature[1] : 0, - 'version_patch' => !empty($versionSignature[2]) ? $versionSignature[2] : 0, - )); + if (!$installablePackage) { + return [ + 'success' => 0, + 'message' => $messages['not_found'], + ]; + } - if (!empty($sig[2])) { - $r = preg_split('/([0-9]+)/', $sig[2], -1, PREG_SPLIT_DELIM_CAPTURE); - if (is_array($r) && !empty($r)) { - $package->set('release', $r[0]); - $package->set('release_index', (isset($r[1]) ? $r[1] : '0')); - } - else { - $package->set('release', $sig[2]); - } - } + if ($installablePackage['minimum_supports'] > $modx->version['full_version']) { + return [ + 'success' => 0, + 'message' => $messages['minimum_supports'], + ]; + } - if ($package->save() && $package->install()) { - return array( - 'success' => 1, - 'message' => "{$packageName} was successfully installed", - ); - } - else { - return array( - 'success' => 0, - 'message' => "Could not save package {$packageName}", - ); - } - break; - } - } - } - else { - return array( - 'success' => 0, - 'message' => "Could not find {$packageName} in MODX repository", - ); - } - return true; + // Download the package + $download = $provider->transfer($installablePackage['signature'], null, ['location' => $installablePackage['location']]); + if (!$download) { + return [ + 'success' => 0, + 'message' => $messages['download_failed'], + ]; } -} -if (!function_exists('downloadPackage')) { - function downloadPackage($src, $dst) { - if (ini_get('allow_url_fopen')) { - $file = @file_get_contents($src); - } - else { - if (function_exists('curl_init')) { - $ch = curl_init(); - curl_setopt($ch, CURLOPT_URL, $src); - curl_setopt($ch, CURLOPT_HEADER, 0); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - curl_setopt($ch, CURLOPT_TIMEOUT, 180); - $safeMode = @ini_get('safe_mode'); - $openBasedir = @ini_get('open_basedir'); - if (empty($safeMode) && empty($openBasedir)) { - curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); - } + // Install the package + $package = $modx->getObject('transport.modTransportPackage', ['signature' => $installablePackage['signature']]); - $file = curl_exec($ch); - curl_close($ch); - } - else { - return false; - } - } - file_put_contents($dst, $file); + if (!$package) { + return [ + 'success' => 0, + 'message' => $messages['not_found_during_installation'], + ]; + } - return file_exists($dst); + if ($package->save() && $package->install()) { + return [ + 'success' => 1, + 'message' => $messages['installed'], + ]; } -} + return [ + 'success' => 0, + 'message' => $messages['install_failed'], + ]; +}; $success = false; -switch (@$options[xPDOTransport::PACKAGE_ACTION]) { +/** @var array $options */ +switch ($options[xPDOTransport::PACKAGE_ACTION]) { case xPDOTransport::ACTION_INSTALL: case xPDOTransport::ACTION_UPGRADE: - /* @var modX $modx */ - $modx = &$object->xpdo; - /* Checking and installing required packages */ - $packages = array( - 'pdoTools' => '2.1.0-pl', - ); - - foreach ($packages as $package_name => $version) { - $installed = $modx->getIterator('transport.modTransportPackage', array('package_name' => $package_name)); - /** @var modTransportPackage $package */ - foreach ($installed as $package) { - if ($package->compareVersion($version, '<=')) { - continue(2); - } - } - $modx->log(modX::LOG_LEVEL_INFO, "Trying to install {$package_name}. Please wait..."); - $response = installPackage($package_name); + foreach ($packages as $name => $providerName) { + $modx->log(modX::LOG_LEVEL_INFO, "Trying to install {$name}. Please wait..."); + $response = $installPackage($name, $providerName); $level = $response['success'] ? modX::LOG_LEVEL_INFO : modX::LOG_LEVEL_ERROR; $modx->log($level, $response['message']); } - $success = true; break; @@ -155,4 +125,4 @@ function downloadPackage($src, $dst) { break; } -return $success; \ No newline at end of file +return $success; diff --git a/_build/setup.options.php b/_build/setup.options.php index bf71367..a7b4106 100644 --- a/_build/setup.options.php +++ b/_build/setup.options.php @@ -4,11 +4,11 @@ $output = null; switch ($options[xPDOTransport::PACKAGE_ACTION]) { case xPDOTransport::ACTION_INSTALL: - //$exists = $modx->getObject('transport.modTransportPackage', array('package_name' => 'pdoTools')); + $exists = $modx->getObject('transport.modTransportPackage', array('package_name' => 'pdoTools')); break; case xPDOTransport::ACTION_UPGRADE: - //$exists = $modx->getObject('transport.modTransportPackage', array('package_name' => 'pdoTools')); + $exists = $modx->getObject('transport.modTransportPackage', array('package_name' => 'pdoTools')); if (!empty($options['attributes']['chunks'])) { $chunks = '