Example #1
0
 /**
  * Find category tree
  *
  * @param array $rootIdList list of id s
  * @return QueryInterface
  */
 public function findTree(array $rootIdList)
 {
     $subCategories = CategoryService::getChildrenCategories(implode(',', $rootIdList));
     $ordering = array('sorting' => QueryInterface::ORDER_ASCENDING);
     $categories = $this->findByIdList(explode(',', $subCategories), $ordering);
     $flatCategories = array();
     foreach ($categories as $category) {
         $flatCategories[$category->getUid()] = array('item' => $category, 'parent' => $category->getParentcategory() ? $category->getParentcategory()->getUid() : null);
     }
     $tree = array();
     // If leaves are selected without its parents selected, those are shown as parent
     foreach ($flatCategories as $id => &$flatCategory) {
         if (!isset($flatCategories[$flatCategory['parent']])) {
             $flatCategory['parent'] = null;
         }
     }
     foreach ($flatCategories as $id => &$node) {
         if ($node['parent'] === null) {
             $tree[$id] =& $node;
         } else {
             $flatCategories[$node['parent']]['children'][$id] =& $node;
         }
     }
     return $tree;
 }
Example #2
0
 /**
  * Returns a category constraint created by
  * a given list of categories and a junction string
  *
  * @param QueryInterface $query
  * @param  array $categories
  * @param  string $conjunction
  * @param  boolean $includeSubCategories
  * @return \TYPO3\CMS\Extbase\Persistence\Generic\Qom\ConstraintInterface|null
  */
 protected function createCategoryConstraint(QueryInterface $query, $categories, $conjunction, $includeSubCategories = false)
 {
     $constraint = null;
     $categoryConstraints = [];
     // If "ignore category selection" is used, nothing needs to be done
     if (empty($conjunction)) {
         return $constraint;
     }
     if (!is_array($categories)) {
         $categories = GeneralUtility::intExplode(',', $categories, true);
     }
     foreach ($categories as $category) {
         if ($includeSubCategories) {
             $subCategories = GeneralUtility::trimExplode(',', CategoryService::getChildrenCategories($category, 0, '', true), true);
             $subCategoryConstraint = [];
             $subCategoryConstraint[] = $query->contains('categories', $category);
             if (count($subCategories) > 0) {
                 foreach ($subCategories as $subCategory) {
                     $subCategoryConstraint[] = $query->contains('categories', $subCategory);
                 }
             }
             if ($subCategoryConstraint) {
                 $categoryConstraints[] = $query->logicalOr($subCategoryConstraint);
             }
         } else {
             $categoryConstraints[] = $query->contains('categories', $category);
         }
     }
     if ($categoryConstraints) {
         switch (strtolower($conjunction)) {
             case 'or':
                 $constraint = $query->logicalOr($categoryConstraints);
                 break;
             case 'notor':
                 $constraint = $query->logicalNot($query->logicalOr($categoryConstraints));
                 break;
             case 'notand':
                 $constraint = $query->logicalNot($query->logicalAnd($categoryConstraints));
                 break;
             case 'and':
             default:
                 $constraint = $query->logicalAnd($categoryConstraints);
         }
     }
     return $constraint;
 }