diff --git a/administrator/components/com_categories/models/categories.php b/administrator/components/com_categories/models/categories.php
index 9578f15708f20..6cdf6020e4aef 100644
--- a/administrator/components/com_categories/models/categories.php
+++ b/administrator/components/com_categories/models/categories.php
@@ -43,6 +43,7 @@ public function __construct($config = array())
'rgt', 'a.rgt',
'level', 'a.level',
'path', 'a.path',
+ 'category_id',
'tag',
);
}
@@ -93,6 +94,7 @@ protected function populateState($ordering = 'a.lft', $direction = 'asc')
$this->setState('filter.search', $this->getUserStateFromRequest($this->context . '.search', 'filter_search', '', 'string'));
$this->setState('filter.published', $this->getUserStateFromRequest($this->context . '.filter.published', 'filter_published', '', 'string'));
+ $this->setState('filter.category_id', $this->getUserStateFromRequest($this->context . '.filter.category_id', 'filter_category_id', '', 'string'));
$this->setState('filter.access', $this->getUserStateFromRequest($this->context . '.filter.access', 'filter_access', '', 'cmd'));
$this->setState('filter.language', $this->getUserStateFromRequest($this->context . '.filter.language', 'filter_language', '', 'string'));
$this->setState('filter.tag', $this->getUserStateFromRequest($this->context . '.filter.tag', 'filter_tag', '', 'string'));
@@ -127,6 +129,7 @@ protected function getStoreId($id = '')
$id .= ':' . $this->getState('filter.extension');
$id .= ':' . $this->getState('filter.search');
$id .= ':' . $this->getState('filter.published');
+ $id .= ':' . $this->getState('filter.category_id');
$id .= ':' . $this->getState('filter.access');
$id .= ':' . $this->getState('filter.language');
$id .= ':' . $this->getState('filter.level');
@@ -194,10 +197,29 @@ protected function getListQuery()
$query->where('a.extension = ' . $db->quote($extension));
}
+ // Filter by a single or group of categories.
+ $baselevel = 1;
+ $categoryId = $this->getState('filter.category_id');
+
+ if (is_numeric($categoryId))
+ {
+ $categoryTable = JTable::getInstance('Category', 'JTable');
+ $categoryTable->load($categoryId);
+ $rgt = $categoryTable->rgt;
+ $lft = $categoryTable->lft;
+ $baselevel = (int) $categoryTable->level;
+ $query->where('a.lft >= ' . (int) $lft)
+ ->where('a.rgt <= ' . (int) $rgt);
+ }
+ elseif (is_array($categoryId))
+ {
+ $query->where('a.id IN (' . implode(',', ArrayHelper::toInteger($categoryId)) . ')');
+ }
+
// Filter on the level.
if ($level = $this->getState('filter.level'))
{
- $query->where('a.level <= ' . (int) $level);
+ $query->where('a.level <= ' . ((int) $level + (int) $baselevel - 1));
}
// Filter by access level.
diff --git a/administrator/components/com_categories/models/forms/filter_categories.xml b/administrator/components/com_categories/models/forms/filter_categories.xml
index 3dd53359d3527..fb56ac0fffff4 100644
--- a/administrator/components/com_categories/models/forms/filter_categories.xml
+++ b/administrator/components/com_categories/models/forms/filter_categories.xml
@@ -21,6 +21,18 @@
+
+
+
+
authorise('core.admin'))
+ if ($user->authorise('core.admin'))
{
JToolbarHelper::checkin('categories.checkin');
}
// Add a batch button
- if ($canDo->get('core.create')
- && $canDo->get('core.edit')
- && $canDo->get('core.edit.state'))
+ if ($user->authorise('core.create', $component)
+ && $user->authorise('core.edit', $component)
+ && $user->authorise('core.edit.state', $component))
{
$title = JText::_('JTOOLBAR_BATCH');