예제 #1
0
 /**
  * @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;
 }