/**
* {@inheritdoc}
*/
public function findCollectionSet($depth = 0, $filter = [], CollectionInterface $collection = null, $sortBy = [], UserInterface $user = null, $permission = null)
{
try {
$queryBuilder = $this->createQueryBuilder('collection')->addSelect('collectionMeta')->addSelect('defaultMeta')->addSelect('collectionType')->addSelect('collectionParent')->addSelect('parentMeta')->addSelect('collectionChildren')->leftJoin('collection.meta', 'collectionMeta')->leftJoin('collection.defaultMeta', 'defaultMeta')->leftJoin('collection.type', 'collectionType')->leftJoin('collection.parent', 'collectionParent')->leftJoin('collection.children', 'collectionChildren')->leftJoin('collectionParent.meta', 'parentMeta')->where('collection.depth <= :depth1 OR collectionChildren.depth <= :depth2');
if ($collection !== null) {
$queryBuilder->andWhere('collection.lft BETWEEN :lft AND :rgt AND collection.id != :id');
}
if (array_key_exists('search', $filter) && $filter['search'] !== null) {
$queryBuilder->andWhere('collectionMeta.title LIKE :search');
}
if (array_key_exists('locale', $filter)) {
$queryBuilder->andWhere('collectionMeta.locale = :locale OR defaultMeta.locale != :locale');
}
if ($sortBy !== null && is_array($sortBy) && count($sortBy) > 0) {
foreach ($sortBy as $column => $order) {
$queryBuilder->addOrderBy('collectionMeta.' . $column, strtolower($order) === 'asc' ? 'ASC' : 'DESC');
}
}
if ($user !== null && $permission != null) {
$this->addAccessControl($queryBuilder, $user, $permission, Collection::class, 'collection');
}
$collectionDepth = $collection !== null ? $collection->getDepth() : 0;
$query = $queryBuilder->getQuery();
$query->setParameter('depth1', $collectionDepth + $depth);
$query->setParameter('depth2', $depth + 1);
if ($collection !== null) {
$query->setParameter('lft', $collection->getLft());
$query->setParameter('rgt', $collection->getRgt());
$query->setParameter('id', $collection->getId());
}
if (array_key_exists('search', $filter) && $filter['search'] !== null) {
$query->setParameter('search', '%' . $filter['search'] . '%');
}
if (array_key_exists('limit', $filter)) {
$query->setMaxResults($filter['limit']);
}
if (array_key_exists('offset', $filter)) {
$query->setFirstResult($filter['offset']);
}
if (array_key_exists('locale', $filter)) {
$query->setParameter('locale', $filter['locale']);
}
return new Paginator($query);
} catch (NoResultException $ex) {
return [];
}
}