diff --git a/administrator/components/com_content/models/articles.php b/administrator/components/com_content/models/articles.php index 5865db973fa91..0d28a2ae90d5c 100644 --- a/administrator/components/com_content/models/articles.php +++ b/administrator/components/com_content/models/articles.php @@ -266,31 +266,37 @@ protected function getListQuery() $query->where('(a.state = 0 OR a.state = 1)'); } - - // Filter by a single or group of categories. - $baselevel = 1; + // Filter by categories and by level $categoryId = $this->getState('filter.category_id'); + $level = $this->getState('filter.level'); - if (is_numeric($categoryId)) - { - $categoryTable = JTable::getInstance('Category', 'JTable'); - $categoryTable->load($categoryId); - $rgt = $categoryTable->rgt; - $lft = $categoryTable->lft; - $baselevel = (int) $categoryTable->level; - $query->where('c.lft >= ' . (int) $lft) - ->where('c.rgt <= ' . (int) $rgt); - } - elseif (is_array($categoryId)) + $categoryId = $categoryId && !is_array($categoryId) + ? array($categoryId) + : $categoryId; + + // Case: Using both categories filter and by level filter + if (count($categoryId)) { $categoryId = ArrayHelper::toInteger($categoryId); - $query->where('a.catid IN (' . implode(',', ArrayHelper::toInteger($categoryId)) . ')'); + $categoryTable = JTable::getInstance('Category', 'JTable'); + $subCatItemsWhere = array(); + + foreach ($categoryId as $filter_catid) + { + $categoryTable->load($filter_catid); + $subCatItemsWhere[] = '(' . + ($level ? 'c.level <= ' . ((int) $level + (int) $categoryTable->level - 1) . ' AND ' : '') . + 'c.lft >= ' . (int) $categoryTable->lft . ' AND ' . + 'c.rgt <= ' . (int) $categoryTable->rgt . ')'; + } + + $query->where(implode(' OR ', $subCatItemsWhere)); } - // Filter on the level. - if ($level = $this->getState('filter.level')) + // Case: Using only the by level filter + elseif ($level) { - $query->where('c.level <= ' . ((int) $level + (int) $baselevel - 1)); + $query->where('c.level <= ' . (int) $level); } // Filter by author