/**
* {@inheritdoc}
*/
public function findCollectionSet($depth = 0, $filter = [], CollectionInterface $collection = null, $sortBy = [])
{
try {
$dql = sprintf('SELECT n, collectionMeta, defaultMeta, collectionType, collectionParent, parentMeta, collectionChildren
FROM %s AS n
LEFT OUTER JOIN n.meta AS collectionMeta
LEFT JOIN n.defaultMeta AS defaultMeta
LEFT JOIN n.type AS collectionType
LEFT JOIN n.parent AS collectionParent
LEFT JOIN n.children AS collectionChildren
LEFT JOIN collectionParent.meta AS parentMeta
WHERE (n.depth <= :depth + :maxDepth OR collectionChildren.depth <= :maxDepthPlusOne)', $this->_entityName);
if ($collection !== null) {
$dql .= ' AND n.lft BETWEEN :lft AND :rgt AND n.id != :id';
}
if (array_key_exists('search', $filter) && $filter['search'] !== null) {
$dql .= ' AND collectionMeta.title LIKE :search';
}
if (array_key_exists('locale', $filter)) {
$dql .= ' AND (collectionMeta.locale = :locale OR defaultMeta != :locale)';
}
if ($sortBy !== null && is_array($sortBy) && sizeof($sortBy) > 0) {
$orderBy = [];
foreach ($sortBy as $column => $order) {
$orderBy[] = 'collectionMeta.' . $column . ' ' . (strtolower($order) === 'asc' ? 'ASC' : 'DESC');
}
$dql .= ' ORDER BY ' . implode(', ', $orderBy);
}
$query = new Query($this->_em);
$query->setDQL($dql);
$query->setParameter('maxDepth', intval($depth));
$query->setParameter('maxDepthPlusOne', intval($depth) + 1);
$query->setParameter('depth', $collection !== null ? $collection->getDepth() : 0);
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 [];
}
}