/** * @param array $parents * @param int $levels * @param array $params * @param bool $optimize * * @return array|KunenaForumCategory[] */ protected static function _getChildren(array $parents, $levels, array $params, $optimize) { $list = array(); foreach ($parents as $parent) { if ($parent instanceof KunenaForumCategory) { $parent = $parent->id; } if (!isset(self::$_tree[$parent])) { continue; } $cats = self::$_tree[$parent]; if (!$optimize) { switch ($params['ordering']) { case 'catid': if ($params['direction'] > 0) { ksort($cats); } else { krsort($cats); } break; case 'name': if ($params['direction'] > 0) { uksort($cats, array(__CLASS__, 'compareByNameAsc')); } else { uksort($cats, array(__CLASS__, 'compareByNameDesc')); } break; case 'ordering': default: if ($params['direction'] < 0) { $cats = array_reverse($cats, true); } } } foreach ($cats as $id => $children) { if (!isset(self::$_instances[$id])) { continue; } if ($id == $params['selected']) { continue; } $instance = self::$_instances[$id]; $filtered = isset($params['published']) && $instance->published != $params['published']; if (!$optimize) { $filtered |= isset($params['filter_title']) && (Joomla\String\String::stristr($instance->name, (string) $params['filter_title']) === false && Joomla\String\String::stristr($instance->alias, (string) $params['filter_title']) === false); $filtered |= isset($params['filter_type']); $filtered |= isset($params['filter_access']) && ($instance->accesstype != 'joomla.level' || $instance->access != $params['filter_access']); $filtered |= isset($params['filter_locked']) && $instance->locked != (int) $params['filter_locked']; $filtered |= isset($params['filter_allow_polls']) && $instance->allow_polls != (int) $params['filter_allow_polls']; $filtered |= isset($params['filter_review']) && $instance->review != (int) $params['filter_review']; $filtered |= isset($params['filter_anonymous']) && $instance->allow_anonymous != (int) $params['filter_anonymous']; } if ($filtered && $params['action'] != 'admin') { continue; } $clist = array(); if ($levels && !empty($children)) { $clist = self::_getChildren(array($id), $levels - 1, $params, $optimize); } $allowed = $params['action'] == 'none' || $params['action'] == 'read' && !empty(self::$allowed[$id]) || $instance->authorise($params['action'], null, true); if (empty($clist) && !$allowed) { continue; } if (!empty($clist) || !$params['search'] || intval($params['search']) == $id || Joomla\String\String::stristr($instance->name, (string) $params['search'])) { if (!$filtered && (empty($clist) || $params['parents'])) { $list[$id] = $instance; } $list += $clist; } } } return $list; }