diff --git a/administrator/components/com_installer/controllers/discover.php b/administrator/components/com_installer/controllers/discover.php
index 1127eb8f61804..2040bad450b13 100644
--- a/administrator/components/com_installer/controllers/discover.php
+++ b/administrator/components/com_installer/controllers/discover.php
@@ -27,7 +27,7 @@ public function refresh()
{
$model = $this->getModel('discover');
$model->discover();
- $this->setRedirect(JRoute::_('index.php?option=com_installer&view=discover', false));
+ $this->setRedirect(JRoute::_('index.php?option=com_installer&view=discover', false), $model->_message);
}
/**
@@ -39,8 +39,7 @@ public function refresh()
*/
public function install()
{
- $model = $this->getModel('discover');
- $model->discover_install();
+ $this->getModel('discover')->discover_install();
$this->setRedirect(JRoute::_('index.php?option=com_installer&view=discover', false));
}
diff --git a/administrator/components/com_installer/models/discover.php b/administrator/components/com_installer/models/discover.php
index 4374ccac1fdb4..c58884bc0fec8 100644
--- a/administrator/components/com_installer/models/discover.php
+++ b/administrator/components/com_installer/models/discover.php
@@ -18,6 +18,31 @@
*/
class InstallerModelDiscover extends InstallerModel
{
+ /**
+ * Constructor.
+ *
+ * @param array $config An optional associative array of configuration settings.
+ *
+ * @see JController
+ * @since __DEPLOY_VERSION__
+ */
+ public function __construct($config = array())
+ {
+ if (empty($config['filter_fields']))
+ {
+ $config['filter_fields'] = array(
+ 'name',
+ 'client_id',
+ 'client', 'client_translated',
+ 'type', 'type_translated',
+ 'folder', 'folder_translated',
+ 'extension_id',
+ );
+ }
+
+ parent::__construct($config);
+ }
+
/**
* Method to auto-populate the model state.
*
@@ -30,30 +55,23 @@ class InstallerModelDiscover extends InstallerModel
*
* @since 3.1
*/
- protected function populateState($ordering = null, $direction = null)
+ protected function populateState($ordering = 'name', $direction = 'asc')
{
$app = JFactory::getApplication();
// Load the filter state.
- $search = $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search');
- $this->setState('filter.search', $search);
-
- $clientId = $this->getUserStateFromRequest($this->context . '.filter.client_id', 'filter_client_id', '');
- $this->setState('filter.client_id', $clientId);
-
- $categoryId = $this->getUserStateFromRequest($this->context . '.filter.type', 'filter_type', '');
- $this->setState('filter.type', $categoryId);
-
- $group = $this->getUserStateFromRequest($this->context . '.filter.group', 'filter_group', '');
- $this->setState('filter.group', $group);
+ $this->setState('filter.search', $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search', '', 'string'));
+ $this->setState('filter.client_id', $this->getUserStateFromRequest($this->context . '.filter.client_id', 'filter_client_id', null, 'int'));
+ $this->setState('filter.type', $this->getUserStateFromRequest($this->context . '.filter.type', 'filter_type', '', 'string'));
+ $this->setState('filter.folder', $this->getUserStateFromRequest($this->context . '.filter.folder', 'filter_folder', '', 'string'));
$this->setState('message', $app->getUserState('com_installer.message'));
$this->setState('extension_message', $app->getUserState('com_installer.extension_message'));
+
$app->setUserState('com_installer.message', '');
$app->setUserState('com_installer.extension_message', '');
- $this->setState('list.ordering', 'name');
- parent::populateState('name', 'asc');
+ parent::populateState($ordering, $direction);
}
/**
@@ -65,38 +83,45 @@ protected function populateState($ordering = null, $direction = null)
*/
protected function getListQuery()
{
- $type = $this->getState('filter.type');
- $client = $this->getState('filter.client_id');
- $group = $this->getState('filter.group');
-
- $query = $this->getDbo()->getQuery(true)
+ $db = $this->getDbo();
+ $query = $db->getQuery(true)
->select('*')
- ->from('#__extensions')
- ->where('state=-1');
+ ->from($db->quoteName('#__extensions'))
+ ->where($db->quoteName('state') . ' = -1');
+
+ // Process select filters.
+ $type = $this->getState('filter.type');
+ $clientId = $this->getState('filter.client_id');
+ $folder = $this->getState('filter.folder');
if ($type)
{
- $query->where('type=' . $this->_db->quote($type));
+ $query->where($db->quoteName('type') . ' = ' . $db->quote($type));
}
- if ($client != '')
+ if ($clientId != '')
{
- $query->where('client_id=' . (int) $client);
+ $query->where($db->quoteName('client_id') . ' = ' . (int) $clientId);
}
- if ($group != '' && in_array($type, array('plugin', 'library', '')))
+ if ($folder != '' && in_array($type, array('plugin', 'library', '')))
{
- $query->where('folder=' . $this->_db->quote($group == '*' ? '' : $group));
+ $query->where($db->quoteName('folder') . ' = ' . $db->quote($folder == '*' ? '' : $folder));
}
- // Filter by search in id
+ // Process search filter.
$search = $this->getState('filter.search');
- if (!empty($search) && stripos($search, 'id:') === 0)
+ if (!empty($search))
{
- $query->where('extension_id = ' . (int) substr($search, 3));
+ if (stripos($search, 'id:') === 0)
+ {
+ $query->where($db->quoteName('extension_id') . ' = ' . (int) substr($search, 3));
+ }
}
+ // Note: The search for name, ordering and pagination are processed by the parent InstallerModel class (in extension.php).
+
return $query;
}
@@ -111,20 +136,17 @@ protected function getListQuery()
*/
public function discover()
{
- // Purge the list of discovered extensions
- $this->purge();
-
- $installer = JInstaller::getInstance();
- $results = $installer->discover();
+ // Purge the list of discovered extensions and fetch them again.
+ $results = JInstaller::getInstance()->discover();
// Get all templates, including discovered ones
$db = $this->getDbo();
$query = $db->getQuery(true)
- ->select('extension_id, element, folder, client_id, type')
- ->from('#__extensions');
-
+ ->select($db->quoteName(array('extension_id', 'element', 'folder', 'client_id', 'type')))
+ ->from($db->quoteName('#__extensions'));
$db->setQuery($query);
$installedtmp = $db->loadObjectList();
+
$extensions = array();
foreach ($installedtmp as $install)
@@ -133,8 +155,6 @@ public function discover()
$extensions[$key] = $install;
}
- unset($installedtmp);
-
foreach ($results as $result)
{
// Check if we have a match on the element
@@ -210,10 +230,10 @@ public function discover_install()
*/
public function purge()
{
- $db = $this->getDbo();
+ $db = $this->getDbo();
$query = $db->getQuery(true)
- ->delete('#__extensions')
- ->where('state = -1');
+ ->delete($db->quoteName('#__extensions'))
+ ->where($db->quoteName('state') . ' = -1');
$db->setQuery($query);
if (!$db->execute())
diff --git a/administrator/components/com_installer/models/extension.php b/administrator/components/com_installer/models/extension.php
index b34b6c083a5cc..e997967c4d3ba 100644
--- a/administrator/components/com_installer/models/extension.php
+++ b/administrator/components/com_installer/models/extension.php
@@ -9,6 +9,8 @@
defined('_JEXEC') or die;
+use Joomla\Utilities\ArrayHelper;
+
/**
* Extension Manager Abstract Extension Model.
*
@@ -31,9 +33,10 @@ public function __construct($config = array())
$config['filter_fields'] = array(
'name',
'client_id',
+ 'client', 'client_translated',
'enabled',
- 'type',
- 'folder',
+ 'type', 'type_translated',
+ 'folder', 'folder_translated',
'extension_id',
);
}
@@ -52,19 +55,23 @@ public function __construct($config = array())
*/
protected function _getList($query, $limitstart = 0, $limit = 0)
{
- $ordering = $this->getState('list.ordering');
- $search = $this->getState('filter.search');
+ $listOrder = $this->getState('list.ordering', 'name');
+ $listDirn = $this->getState('list.direction', 'asc');
// Replace slashes so preg_match will work
+ $search = $this->getState('filter.search');
$search = str_replace('/', ' ', $search);
$db = $this->getDbo();
- if ($ordering == 'name' || (!empty($search) && stripos($search, 'id:') !== 0))
+ // Process ordering and pagination.
+ if (in_array($listOrder, array('name', 'client_translated', 'type_translated', 'folder_translated'))
+ || (!empty($search) && stripos($search, 'id:') !== 0))
{
$db->setQuery($query);
$result = $db->loadObjectList();
$this->translate($result);
+ // Search in the name.
if (!empty($search))
{
$escapedSearchString = $this->refineSearchStringToRegex($search, '/');
@@ -78,7 +85,9 @@ protected function _getList($query, $limitstart = 0, $limit = 0)
}
}
- JArrayHelper::sortObjects($result, $this->getState('list.ordering'), $this->getState('list.direction') == 'desc' ? -1 : 1, true, true);
+ // Sort array object by selected ordering and selected direction. Sort is case insensative and using locale sorting.
+ $result = ArrayHelper::sortObjects($result, $listOrder, strtolower($listDirn) == 'desc' ? -1 : 1, false, true);
+
$total = count($result);
$this->cache[$this->getStoreId('getTotal')] = $total;
@@ -91,7 +100,7 @@ protected function _getList($query, $limitstart = 0, $limit = 0)
return array_slice($result, $limitstart, $limit ? $limit : null);
}
- $query->order($db->quoteName($ordering) . ' ' . $this->getState('list.direction'));
+ $query->order($db->quoteName($listOrder) . ' ' . $db->escape($listDirn));
$result = parent::_getList($query, $limitstart, $limit);
$this->translate($result);
@@ -125,8 +134,12 @@ protected function translate(&$items)
}
}
- $item->author_info = @$item->authorEmail . '
' . @$item->authorUrl;
- $item->client = $item->client_id ? JText::_('JADMINISTRATOR') : JText::_('JSITE');
+ $item->author_info = @$item->authorEmail . '
' . @$item->authorUrl;
+ $item->client = $item->client_id ? JText::_('JADMINISTRATOR') : JText::_('JSITE');
+ $item->client_translated = $item->client;
+ $item->type_translated = JText::_('COM_INSTALLER_TYPE_' . strtoupper($item->type));
+ $item->folder_translated = @$item->folder ? $item->folder : JText::_('COM_INSTALLER_TYPE_NONAPPLICABLE');
+
$path = $item->client_id ? JPATH_ADMINISTRATOR : JPATH_SITE;
switch ($item->type)
diff --git a/administrator/components/com_installer/models/forms/filter_discover.xml b/administrator/components/com_installer/models/forms/filter_discover.xml
index 667c6a5e00fda..2eb4f75849aed 100644
--- a/administrator/components/com_installer/models/forms/filter_discover.xml
+++ b/administrator/components/com_installer/models/forms/filter_discover.xml
@@ -1,46 +1,66 @@