Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion _build/build.config.php
Original file line number Diff line number Diff line change
Expand Up @@ -50,5 +50,5 @@

$BUILD_RESOLVERS = array(
'chunks',
//'setup',
'setup',
);
228 changes: 99 additions & 129 deletions _build/resolvers/resolve.setup.php
Original file line number Diff line number Diff line change
@@ -1,152 +1,122 @@
<?php
/** @var xPDOTransport $transport */
if (!$transport->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 <b>{$packageName}</b>.",
);
}
$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' => "Дополнение <b>{$packageName}</b> уже было установлено",
'not_found' => "Дополнение <b>{$packageName}</b> не найдено в репозитории {$providerName}",
'minimum_supports' => "Дополнение <b>{$packageName}</b> требует минимальную версию системы {$installablePackage['minimum_supports']}",
'download_failed' => "Дополнение <b>{$packageName}</b> не удалось скачать",
'not_found_during_installation' => "Дополнение <b>{$packageName}</b> не найдено при установке",
'installed' => "Дополнение <b>{$packageName}</b> установлено",
'install_failed' => "Дополнение <b>{$packageName}</b> не удалось установить",
],
'en' => [
'already_installed' => "The add-on <b>{$packageName}</b> has already been installed",
'not_found' => "The add-on <b>{$packageName}</b> was not found in the {$providerName} repository",
'minimum_supports' => "The add-on <b>{$packageName}</b> requires a minimum system version of {$installablePackage['minimum_supports']}",
'download_failed' => "Failed to download the add-on <b>{$packageName}</b>",
'not_found_during_installation' => "The add-on <b>{$packageName}</b> was not found during installation",
'installed' => "The add-on <b>{$packageName}</b> has been installed",
'install_failed' => "Failed to install the add-on <b>{$packageName}</b>",
],
];

$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' => "<b>{$packageName}</b> was successfully installed",
);
}
else {
return array(
'success' => 0,
'message' => "Could not save package <b>{$packageName}</b>",
);
}
break;
}
}
}
else {
return array(
'success' => 0,
'message' => "Could not find <b>{$packageName}</b> 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 <b>{$package_name}</b>. Please wait...");
$response = installPackage($package_name);
foreach ($packages as $name => $providerName) {
$modx->log(modX::LOG_LEVEL_INFO, "Trying to install <b>{$name}</b>. 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;

Expand All @@ -155,4 +125,4 @@ function downloadPackage($src, $dst) {
break;
}

return $success;
return $success;
61 changes: 29 additions & 32 deletions _build/setup.options.php
Original file line number Diff line number Diff line change
Expand Up @@ -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 = '<ul id="formCheckboxes" style="height:200px;overflow:auto;">';
foreach ($options['attributes']['chunks'] as $k => $v) {
Expand All @@ -28,44 +28,41 @@
}

$output = '';
/*
$messages = array(
'ru' => array(
'dependency' => 'В качестве зависимости требуется <b>pdoTools</b>.<br/>Он будет автоматически скачан и установлен.',
'chunks' => 'Выберите чанки, которые нужно <b>перезаписать</b>:<br/>
<small>
<a href="#" onclick="Ext.get(\'formCheckboxes\').select(\'input\').each(function(v) {v.dom.checked = true;});">отметить все</a> |
<a href="#" onclick="Ext.get(\'formCheckboxes\').select(\'input\').each(function(v) {v.dom.checked = false;});">снять со всех</a>
</small>'
),
'default' => array(
'dependency' => 'The <b>pdoTools</b> dependency is required.<br/>It will be automatically downloaded and installed.',
'chunks' => 'Select chunks, which need to <b>overwrite</b>:<br/>
<small>
<a href="#" onclick="Ext.get(\'formCheckboxes\').select(\'input\').each(function(v) {v.dom.checked = true;});">select all</a> |
<a href="#" onclick="Ext.get(\'formCheckboxes\').select(\'input\').each(function(v) {v.dom.checked = false;});">deselect all</a>
</small>'
)
);

$language = $modx->getOption('manager_language');
$output = '';

if (!$exists) {
switch ($modx->getOption('manager_language')) {
case 'ru':
$output = 'Этот компонент требует <b>pdoTools</b> для быстрой работы сниппетов.<br/>Он будет автоматически скачан и установлен.';
break;
default:
$output = 'This component requires <b>pdoTools</b> for fast work of snippets.<br/><br/>It will be automaticly downloaded and installed?';
}
$output .= isset($messages[$language]) ? $messages[$language]['dependency'] : $messages['default']['dependency'];
}
*/

if ($chunks) {
/*
if (!$exists) {
$output .= '<br/><br/>';
$output .= '<br/><br/>';
}
*/

switch ($modx->getOption('manager_language')) {
case 'ru':
$output .= 'Выберите чанки, которые нужно <b>перезаписать</b>:<br/>
<small>
<a href="#" onclick="Ext.get(\'formCheckboxes\').select(\'input\').each(function(v) {v.dom.checked = true;});">отметить все</a> |
<a href="#" onclick="Ext.get(\'formCheckboxes\').select(\'input\').each(function(v) {v.dom.checked = false;});">cнять отметки</a>
</small>
';
break;
default:
$output .= 'Select chunks, which need to <b>overwrite</b>:<br/>
<small>
<a href="#" onclick="Ext.get(\'formCheckboxes\').select(\'input\').each(function(v) {v.dom.checked = true;});">select all</a> |
<a href="#" onclick="Ext.get(\'formCheckboxes\').select(\'input\').each(function(v) {v.dom.checked = false;});">deselect all</a>
</small>
';
}
$output .= isset($messages[$language]) ? $messages[$language]['chunks'] : $messages['default']['chunks'];

$output .= $chunks;
}

return $output;

return $output;