first commit
This commit is contained in:
@ -0,0 +1,661 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_installer
|
||||
*
|
||||
* @copyright (C) 2014 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
namespace Joomla\Component\Installer\Administrator\Model;
|
||||
|
||||
use Joomla\CMS\Factory;
|
||||
use Joomla\CMS\Filesystem\Folder;
|
||||
use Joomla\CMS\Installer\Installer;
|
||||
use Joomla\CMS\Language\Text;
|
||||
use Joomla\CMS\MVC\Factory\MVCFactoryInterface;
|
||||
use Joomla\CMS\Object\CMSObject;
|
||||
use Joomla\CMS\Plugin\PluginHelper;
|
||||
use Joomla\CMS\Router\Route;
|
||||
use Joomla\CMS\Table\UpdateSite as UpdateSiteTable;
|
||||
use Joomla\Component\Installer\Administrator\Helper\InstallerHelper;
|
||||
use Joomla\Database\ParameterType;
|
||||
|
||||
// phpcs:disable PSR1.Files.SideEffects
|
||||
\defined('_JEXEC') or die;
|
||||
// phpcs:enable PSR1.Files.SideEffects
|
||||
|
||||
/**
|
||||
* Installer Update Sites Model
|
||||
*
|
||||
* @since 3.4
|
||||
*/
|
||||
class UpdatesitesModel extends InstallerModel
|
||||
{
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param array $config An optional associative array of configuration settings.
|
||||
* @param MVCFactoryInterface $factory The factory.
|
||||
*
|
||||
* @since 1.6
|
||||
* @see \Joomla\CMS\MVC\Model\ListModel
|
||||
*/
|
||||
public function __construct($config = [], MVCFactoryInterface $factory = null)
|
||||
{
|
||||
if (empty($config['filter_fields'])) {
|
||||
$config['filter_fields'] = [
|
||||
'update_site_name',
|
||||
'name',
|
||||
'client_id',
|
||||
'client',
|
||||
'client_translated',
|
||||
'status',
|
||||
'type',
|
||||
'type_translated',
|
||||
'folder',
|
||||
'folder_translated',
|
||||
'update_site_id',
|
||||
'enabled',
|
||||
'supported',
|
||||
];
|
||||
}
|
||||
|
||||
parent::__construct($config, $factory);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable/Disable an extension.
|
||||
*
|
||||
* @param array $eid Extension ids to un/publish
|
||||
* @param int $value Publish value
|
||||
*
|
||||
* @return boolean True on success
|
||||
*
|
||||
* @throws \Exception on ACL error
|
||||
* @since 3.4
|
||||
*
|
||||
*/
|
||||
public function publish(&$eid = [], $value = 1)
|
||||
{
|
||||
if (!$this->getCurrentUser()->authorise('core.edit.state', 'com_installer')) {
|
||||
throw new \Exception(Text::_('JLIB_APPLICATION_ERROR_EDITSTATE_NOT_PERMITTED'), 403);
|
||||
}
|
||||
|
||||
$result = true;
|
||||
|
||||
// Ensure eid is an array of extension ids
|
||||
if (!\is_array($eid)) {
|
||||
$eid = [$eid];
|
||||
}
|
||||
|
||||
// Get a table object for the extension type
|
||||
$table = new UpdateSiteTable($this->getDatabase());
|
||||
|
||||
// Enable the update site in the table and store it in the database
|
||||
foreach ($eid as $i => $id) {
|
||||
$table->load($id);
|
||||
$table->enabled = $value;
|
||||
|
||||
if (!$table->store()) {
|
||||
$this->setError($table->getError());
|
||||
$result = false;
|
||||
}
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes an update site.
|
||||
*
|
||||
* @param array $ids Extension ids to delete.
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @throws \Exception on ACL error
|
||||
* @since 3.6
|
||||
*
|
||||
*/
|
||||
public function delete($ids = [])
|
||||
{
|
||||
if (!$this->getCurrentUser()->authorise('core.delete', 'com_installer')) {
|
||||
throw new \Exception(Text::_('JLIB_APPLICATION_ERROR_DELETE_NOT_PERMITTED'), 403);
|
||||
}
|
||||
|
||||
// Ensure eid is an array of extension ids
|
||||
if (!\is_array($ids)) {
|
||||
$ids = [$ids];
|
||||
}
|
||||
|
||||
$db = $this->getDatabase();
|
||||
$app = Factory::getApplication();
|
||||
|
||||
$count = 0;
|
||||
|
||||
// Gets the update site names.
|
||||
$query = $db->getQuery(true)
|
||||
->select($db->quoteName(['update_site_id', 'name']))
|
||||
->from($db->quoteName('#__update_sites'))
|
||||
->whereIn($db->quoteName('update_site_id'), $ids);
|
||||
$db->setQuery($query);
|
||||
$updateSitesNames = $db->loadObjectList('update_site_id');
|
||||
|
||||
// Gets Joomla core update sites Ids.
|
||||
$joomlaUpdateSitesIds = $this->getJoomlaUpdateSitesIds(0);
|
||||
|
||||
// Enable the update site in the table and store it in the database
|
||||
foreach ($ids as $i => $id) {
|
||||
// Don't allow to delete Joomla Core update sites.
|
||||
if (\in_array((int) $id, $joomlaUpdateSitesIds)) {
|
||||
$app->enqueueMessage(Text::sprintf('COM_INSTALLER_MSG_UPDATESITES_DELETE_CANNOT_DELETE', $updateSitesNames[$id]->name), 'error');
|
||||
continue;
|
||||
}
|
||||
|
||||
// Delete the update site from all tables.
|
||||
try {
|
||||
$id = (int) $id;
|
||||
$query = $db->getQuery(true)
|
||||
->delete($db->quoteName('#__update_sites'))
|
||||
->where($db->quoteName('update_site_id') . ' = :id')
|
||||
->bind(':id', $id, ParameterType::INTEGER);
|
||||
$db->setQuery($query);
|
||||
$db->execute();
|
||||
|
||||
$query = $db->getQuery(true)
|
||||
->delete($db->quoteName('#__update_sites_extensions'))
|
||||
->where($db->quoteName('update_site_id') . ' = :id')
|
||||
->bind(':id', $id, ParameterType::INTEGER);
|
||||
$db->setQuery($query);
|
||||
$db->execute();
|
||||
|
||||
$query = $db->getQuery(true)
|
||||
->delete($db->quoteName('#__updates'))
|
||||
->where($db->quoteName('update_site_id') . ' = :id')
|
||||
->bind(':id', $id, ParameterType::INTEGER);
|
||||
$db->setQuery($query);
|
||||
$db->execute();
|
||||
|
||||
$count++;
|
||||
} catch (\RuntimeException $e) {
|
||||
$app->enqueueMessage(
|
||||
Text::sprintf(
|
||||
'COM_INSTALLER_MSG_UPDATESITES_DELETE_ERROR',
|
||||
$updateSitesNames[$id]->name,
|
||||
$e->getMessage()
|
||||
),
|
||||
'error'
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if ($count > 0) {
|
||||
$app->enqueueMessage(Text::plural('COM_INSTALLER_MSG_UPDATESITES_N_DELETE_UPDATESITES_DELETED', $count), 'message');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetch the Joomla update sites ids.
|
||||
*
|
||||
* @param integer $column Column to return. 0 for update site ids, 1 for extension ids.
|
||||
*
|
||||
* @return array Array with joomla core update site ids.
|
||||
*
|
||||
* @since 3.6.0
|
||||
*/
|
||||
protected function getJoomlaUpdateSitesIds($column = 0)
|
||||
{
|
||||
$db = $this->getDatabase();
|
||||
|
||||
// Fetch the Joomla core update sites ids and their extension ids. We search for all except the core joomla extension with update sites.
|
||||
$query = $db->getQuery(true)
|
||||
->select($db->quoteName(['use.update_site_id', 'e.extension_id']))
|
||||
->from($db->quoteName('#__update_sites_extensions', 'use'))
|
||||
->join(
|
||||
'LEFT',
|
||||
$db->quoteName('#__update_sites', 'us'),
|
||||
$db->quoteName('us.update_site_id') . ' = ' . $db->quoteName('use.update_site_id')
|
||||
)
|
||||
->join(
|
||||
'LEFT',
|
||||
$db->quoteName('#__extensions', 'e'),
|
||||
$db->quoteName('e.extension_id') . ' = ' . $db->quoteName('use.extension_id')
|
||||
)
|
||||
->where('('
|
||||
. '(' . $db->quoteName('e.type') . ' = ' . $db->quote('file') .
|
||||
' AND ' . $db->quoteName('e.element') . ' = ' . $db->quote('joomla') . ')'
|
||||
. ' OR (' . $db->quoteName('e.type') . ' = ' . $db->quote('package') . ' AND ' . $db->quoteName('e.element')
|
||||
. ' = ' . $db->quote('pkg_en-GB') . ') OR (' . $db->quoteName('e.type') . ' = ' . $db->quote('component')
|
||||
. ' AND ' . $db->quoteName('e.element') . ' = ' . $db->quote('com_joomlaupdate') . ')'
|
||||
. ')');
|
||||
|
||||
$db->setQuery($query);
|
||||
|
||||
return $db->loadColumn($column);
|
||||
}
|
||||
|
||||
/**
|
||||
* Rebuild update sites tables.
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @throws \Exception on ACL error
|
||||
* @since 3.6
|
||||
*
|
||||
*/
|
||||
public function rebuild(): void
|
||||
{
|
||||
if (!$this->getCurrentUser()->authorise('core.admin', 'com_installer')) {
|
||||
throw new \Exception(Text::_('COM_INSTALLER_MSG_UPDATESITES_REBUILD_NOT_PERMITTED'), 403);
|
||||
}
|
||||
|
||||
$db = $this->getDatabase();
|
||||
$app = Factory::getApplication();
|
||||
|
||||
// Check if Joomla Extension plugin is enabled.
|
||||
if (!PluginHelper::isEnabled('extension', 'joomla')) {
|
||||
$query = $db->getQuery(true)
|
||||
->select($db->quoteName('extension_id'))
|
||||
->from($db->quoteName('#__extensions'))
|
||||
->where($db->quoteName('type') . ' = ' . $db->quote('plugin'))
|
||||
->where($db->quoteName('element') . ' = ' . $db->quote('joomla'))
|
||||
->where($db->quoteName('folder') . ' = ' . $db->quote('extension'));
|
||||
$db->setQuery($query);
|
||||
|
||||
$pluginId = (int) $db->loadResult();
|
||||
|
||||
$link = Route::_('index.php?option=com_plugins&task=plugin.edit&extension_id=' . $pluginId);
|
||||
$app->enqueueMessage(Text::sprintf('COM_INSTALLER_MSG_UPDATESITES_REBUILD_EXTENSION_PLUGIN_NOT_ENABLED', $link), 'error');
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$clients = [JPATH_SITE, JPATH_ADMINISTRATOR, JPATH_API];
|
||||
$extensionGroupFolders = ['components', 'modules', 'plugins', 'templates', 'language', 'manifests'];
|
||||
|
||||
$pathsToSearch = [];
|
||||
|
||||
// Identifies which folders to search for manifest files.
|
||||
foreach ($clients as $clientPath) {
|
||||
foreach ($extensionGroupFolders as $extensionGroupFolderName) {
|
||||
// Components, modules, plugins, templates, languages and manifest (files, libraries, etc)
|
||||
if ($extensionGroupFolderName !== 'plugins') {
|
||||
foreach (glob($clientPath . '/' . $extensionGroupFolderName . '/*', GLOB_NOSORT | GLOB_ONLYDIR) as $extensionFolderPath) {
|
||||
$pathsToSearch[] = $extensionFolderPath;
|
||||
}
|
||||
} else {
|
||||
// Plugins (another directory level is needed)
|
||||
foreach (
|
||||
glob(
|
||||
$clientPath . '/' . $extensionGroupFolderName . '/*',
|
||||
GLOB_NOSORT | GLOB_ONLYDIR
|
||||
) as $pluginGroupFolderPath
|
||||
) {
|
||||
foreach (glob($pluginGroupFolderPath . '/*', GLOB_NOSORT | GLOB_ONLYDIR) as $extensionFolderPath) {
|
||||
$pathsToSearch[] = $extensionFolderPath;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Gets Joomla core update sites Ids.
|
||||
$joomlaUpdateSitesIds = $this->getJoomlaUpdateSitesIds(0);
|
||||
|
||||
// First backup any custom extra_query for the sites
|
||||
$query = $db->getQuery(true)
|
||||
->select('TRIM(' . $db->quoteName('location') . ') AS ' . $db->quoteName('location') . ', ' . $db->quoteName('extra_query'))
|
||||
->from($db->quoteName('#__update_sites'));
|
||||
$db->setQuery($query);
|
||||
$backupExtraQuerys = $db->loadAssocList('location');
|
||||
|
||||
// Delete from all tables (except joomla core update sites).
|
||||
$query = $db->getQuery(true)
|
||||
->delete($db->quoteName('#__update_sites'))
|
||||
->whereNotIn($db->quoteName('update_site_id'), $joomlaUpdateSitesIds);
|
||||
$db->setQuery($query);
|
||||
$db->execute();
|
||||
|
||||
$query = $db->getQuery(true)
|
||||
->delete($db->quoteName('#__update_sites_extensions'))
|
||||
->whereNotIn($db->quoteName('update_site_id'), $joomlaUpdateSitesIds);
|
||||
$db->setQuery($query);
|
||||
$db->execute();
|
||||
|
||||
$query = $db->getQuery(true)
|
||||
->delete($db->quoteName('#__updates'))
|
||||
->whereNotIn($db->quoteName('update_site_id'), $joomlaUpdateSitesIds);
|
||||
$db->setQuery($query);
|
||||
$db->execute();
|
||||
|
||||
$count = 0;
|
||||
|
||||
// Gets Joomla core extension Ids.
|
||||
$joomlaCoreExtensionIds = $this->getJoomlaUpdateSitesIds(1);
|
||||
|
||||
// Search for updateservers in manifest files inside the folders to search.
|
||||
foreach ($pathsToSearch as $extensionFolderPath) {
|
||||
$tmpInstaller = new Installer();
|
||||
$tmpInstaller->setDatabase($this->getDatabase());
|
||||
|
||||
$tmpInstaller->setPath('source', $extensionFolderPath);
|
||||
|
||||
// Main folder manifests (higher priority)
|
||||
$parentXmlfiles = Folder::files($tmpInstaller->getPath('source'), '.xml$', false, true);
|
||||
|
||||
// Search for children manifests (lower priority)
|
||||
$allXmlFiles = Folder::files($tmpInstaller->getPath('source'), '.xml$', 1, true);
|
||||
|
||||
// Create a unique array of files ordered by priority
|
||||
$xmlfiles = array_unique(array_merge($parentXmlfiles, $allXmlFiles));
|
||||
|
||||
if (!empty($xmlfiles)) {
|
||||
foreach ($xmlfiles as $file) {
|
||||
// Is it a valid Joomla installation manifest file?
|
||||
$manifest = $tmpInstaller->isManifest($file);
|
||||
|
||||
if ($manifest !== null) {
|
||||
/**
|
||||
* Search if the extension exists in the extensions table. Excluding Joomla
|
||||
* core extensions and discovered but not yet installed extensions.
|
||||
*/
|
||||
|
||||
$name = (string) $manifest->name;
|
||||
$pkgName = (string) $manifest->packagename;
|
||||
$type = (string) $manifest['type'];
|
||||
|
||||
$query = $db->getQuery(true)
|
||||
->select($db->quoteName('extension_id'))
|
||||
->from($db->quoteName('#__extensions'))
|
||||
->where(
|
||||
[
|
||||
$db->quoteName('type') . ' = :type',
|
||||
$db->quoteName('state') . ' != -1',
|
||||
]
|
||||
)
|
||||
->extendWhere(
|
||||
'AND',
|
||||
[
|
||||
$db->quoteName('name') . ' = :name',
|
||||
$db->quoteName('name') . ' = :pkgname',
|
||||
],
|
||||
'OR'
|
||||
)
|
||||
->whereNotIn($db->quoteName('extension_id'), $joomlaCoreExtensionIds)
|
||||
->bind(':name', $name)
|
||||
->bind(':pkgname', $pkgName)
|
||||
->bind(':type', $type);
|
||||
$db->setQuery($query);
|
||||
|
||||
$eid = (int) $db->loadResult();
|
||||
|
||||
if ($eid && $manifest->updateservers) {
|
||||
// Set the manifest object and path
|
||||
$tmpInstaller->manifest = $manifest;
|
||||
$tmpInstaller->setPath('manifest', $file);
|
||||
|
||||
// Remove last extra_query as we are in a foreach
|
||||
$tmpInstaller->extraQuery = '';
|
||||
|
||||
if (
|
||||
$tmpInstaller->manifest->updateservers
|
||||
&& $tmpInstaller->manifest->updateservers->server
|
||||
&& isset($backupExtraQuerys[trim((string) $tmpInstaller->manifest->updateservers->server)])
|
||||
) {
|
||||
$tmpInstaller->extraQuery = $backupExtraQuerys[trim((string) $tmpInstaller->manifest->updateservers->server)]['extra_query'];
|
||||
}
|
||||
|
||||
// Load the extension plugin (if not loaded yet).
|
||||
PluginHelper::importPlugin('extension', 'joomla');
|
||||
|
||||
// Fire the onExtensionAfterUpdate
|
||||
$app->triggerEvent('onExtensionAfterUpdate', ['installer' => $tmpInstaller, 'eid' => $eid]);
|
||||
|
||||
$count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($count > 0) {
|
||||
$app->enqueueMessage(Text::_('COM_INSTALLER_MSG_UPDATESITES_REBUILD_SUCCESS'), 'message');
|
||||
} else {
|
||||
$app->enqueueMessage(Text::_('COM_INSTALLER_MSG_UPDATESITES_REBUILD_MESSAGE'), 'message');
|
||||
}
|
||||
|
||||
// Flush the system cache to ensure extra_query is correctly loaded next time.
|
||||
$this->cleanCache('_system');
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get an array of data items.
|
||||
*
|
||||
* @return mixed An array of data items on success, false on failure.
|
||||
*
|
||||
* @since 4.0.0
|
||||
*/
|
||||
public function getItems()
|
||||
{
|
||||
$items = parent::getItems();
|
||||
|
||||
array_walk(
|
||||
$items,
|
||||
static function ($item) {
|
||||
$data = new CMSObject($item);
|
||||
$item->downloadKey = InstallerHelper::getDownloadKey($data);
|
||||
}
|
||||
);
|
||||
|
||||
return $items;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to auto-populate the model state.
|
||||
*
|
||||
* Note. Calling getState in this method will result in recursion.
|
||||
*
|
||||
* @param string $ordering An optional ordering field.
|
||||
* @param string $direction An optional direction (asc|desc).
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 3.4
|
||||
*/
|
||||
protected function populateState($ordering = 'name', $direction = 'asc')
|
||||
{
|
||||
// Load the filter state.
|
||||
$stateKeys = [
|
||||
'search' => 'string',
|
||||
'client_id' => 'int',
|
||||
'enabled' => 'string',
|
||||
'type' => 'string',
|
||||
'folder' => 'string',
|
||||
'supported' => 'int',
|
||||
];
|
||||
|
||||
foreach ($stateKeys as $key => $filterType) {
|
||||
$stateKey = 'filter.' . $key;
|
||||
|
||||
switch ($filterType) {
|
||||
case 'int':
|
||||
case 'bool':
|
||||
$default = null;
|
||||
break;
|
||||
|
||||
default:
|
||||
$default = '';
|
||||
break;
|
||||
}
|
||||
|
||||
$stateValue = $this->getUserStateFromRequest(
|
||||
$this->context . '.' . $stateKey,
|
||||
'filter_' . $key,
|
||||
$default,
|
||||
$filterType
|
||||
);
|
||||
|
||||
$this->setState($stateKey, $stateValue);
|
||||
}
|
||||
|
||||
parent::populateState($ordering, $direction);
|
||||
}
|
||||
|
||||
protected function getStoreId($id = '')
|
||||
{
|
||||
$id .= ':' . $this->getState('search');
|
||||
$id .= ':' . $this->getState('client_id');
|
||||
$id .= ':' . $this->getState('enabled');
|
||||
$id .= ':' . $this->getState('type');
|
||||
$id .= ':' . $this->getState('folder');
|
||||
$id .= ':' . $this->getState('supported');
|
||||
|
||||
return parent::getStoreId($id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get the database query
|
||||
*
|
||||
* @return \Joomla\Database\DatabaseQuery The database query
|
||||
*
|
||||
* @since 3.4
|
||||
*/
|
||||
protected function getListQuery()
|
||||
{
|
||||
$db = $this->getDatabase();
|
||||
$query = $db->getQuery(true)
|
||||
->select(
|
||||
$db->quoteName(
|
||||
[
|
||||
's.update_site_id',
|
||||
's.name',
|
||||
's.type',
|
||||
's.location',
|
||||
's.enabled',
|
||||
's.checked_out',
|
||||
's.checked_out_time',
|
||||
's.extra_query',
|
||||
'e.extension_id',
|
||||
'e.name',
|
||||
'e.type',
|
||||
'e.element',
|
||||
'e.folder',
|
||||
'e.client_id',
|
||||
'e.state',
|
||||
'e.manifest_cache',
|
||||
'u.name',
|
||||
],
|
||||
[
|
||||
'update_site_id',
|
||||
'update_site_name',
|
||||
'update_site_type',
|
||||
'location',
|
||||
'enabled',
|
||||
'checked_out',
|
||||
'checked_out_time',
|
||||
'extra_query',
|
||||
'extension_id',
|
||||
'name',
|
||||
'type',
|
||||
'element',
|
||||
'folder',
|
||||
'client_id',
|
||||
'state',
|
||||
'manifest_cache',
|
||||
'editor',
|
||||
]
|
||||
)
|
||||
)
|
||||
->from($db->quoteName('#__update_sites', 's'))
|
||||
->join(
|
||||
'INNER',
|
||||
$db->quoteName('#__update_sites_extensions', 'se'),
|
||||
$db->quoteName('se.update_site_id') . ' = ' . $db->quoteName('s.update_site_id')
|
||||
)
|
||||
->join(
|
||||
'INNER',
|
||||
$db->quoteName('#__extensions', 'e'),
|
||||
$db->quoteName('e.extension_id') . ' = ' . $db->quoteName('se.extension_id')
|
||||
)
|
||||
->join(
|
||||
'LEFT',
|
||||
$db->quoteName('#__users', 'u'),
|
||||
$db->quoteName('s.checked_out') . ' = ' . $db->quoteName('u.id')
|
||||
)
|
||||
->where($db->quoteName('state') . ' = 0');
|
||||
|
||||
// Process select filters.
|
||||
$supported = $this->getState('filter.supported');
|
||||
$enabled = $this->getState('filter.enabled');
|
||||
$type = $this->getState('filter.type');
|
||||
$clientId = $this->getState('filter.client_id');
|
||||
$folder = $this->getState('filter.folder');
|
||||
|
||||
if ($enabled !== '') {
|
||||
$enabled = (int) $enabled;
|
||||
$query->where($db->quoteName('s.enabled') . ' = :enabled')
|
||||
->bind(':enabled', $enabled, ParameterType::INTEGER);
|
||||
}
|
||||
|
||||
if ($type) {
|
||||
$query->where($db->quoteName('e.type') . ' = :type')
|
||||
->bind(':type', $type);
|
||||
}
|
||||
|
||||
if ($clientId !== null && $clientId !== '') {
|
||||
$clientId = (int) $clientId;
|
||||
$query->where($db->quoteName('e.client_id') . ' = :clientId')
|
||||
->bind(':clientId', $clientId, ParameterType::INTEGER);
|
||||
}
|
||||
|
||||
if ($folder !== '' && \in_array($type, ['plugin', 'library', ''], true)) {
|
||||
$folderForBinding = $folder === '*' ? '' : $folder;
|
||||
$query->where($db->quoteName('e.folder') . ' = :folder')
|
||||
->bind(':folder', $folderForBinding);
|
||||
}
|
||||
|
||||
// Process search filter (update site id).
|
||||
$search = $this->getState('filter.search');
|
||||
|
||||
if (!empty($search) && stripos($search, 'id:') === 0) {
|
||||
$uid = (int) substr($search, 3);
|
||||
$query->where($db->quoteName('s.update_site_id') . ' = :siteId')
|
||||
->bind(':siteId', $uid, ParameterType::INTEGER);
|
||||
}
|
||||
|
||||
if (is_numeric($supported)) {
|
||||
switch ($supported) {
|
||||
// Show Update Sites which support Download Keys
|
||||
case 1:
|
||||
$supportedIDs = InstallerHelper::getDownloadKeySupportedSites($enabled);
|
||||
break;
|
||||
|
||||
// Show Update Sites which are missing Download Keys
|
||||
case -1:
|
||||
$supportedIDs = InstallerHelper::getDownloadKeyExistsSites(false, $enabled);
|
||||
break;
|
||||
|
||||
// Show Update Sites which have valid Download Keys
|
||||
case 2:
|
||||
$supportedIDs = InstallerHelper::getDownloadKeyExistsSites(true, $enabled);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!empty($supportedIDs)) {
|
||||
// Don't remove array_values(). whereIn expect a zero-based array.
|
||||
$query->whereIn($db->quoteName('s.update_site_id'), array_values($supportedIDs));
|
||||
} else {
|
||||
// In case of an empty list of IDs we apply a fake filter to effectively return no data
|
||||
$query->where($db->quoteName('s.update_site_id') . ' = 0');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Note: The search for name, ordering and pagination are processed by the parent InstallerModel class (in
|
||||
* extension.php).
|
||||
*/
|
||||
|
||||
return $query;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user