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');