diff --git a/bundle/QueryType/SearchQueryType.php b/bundle/QueryType/SearchQueryType.php index ed1af522..87b780de 100644 --- a/bundle/QueryType/SearchQueryType.php +++ b/bundle/QueryType/SearchQueryType.php @@ -6,6 +6,7 @@ use Ibexa\Contracts\Core\Repository\Values\Content\LocationQuery; use Ibexa\Contracts\Core\Repository\Values\Content\Query; +use Ibexa\Contracts\Core\Repository\Values\Content\Query\SortClause; use Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion; use Ibexa\Contracts\Core\SiteAccess\ConfigResolverInterface; use Ibexa\Core\QueryType\OptionsResolverBasedQueryType; @@ -34,26 +35,31 @@ public static function getName(): string protected function configureOptions(OptionsResolver $optionsResolver): void { $optionsResolver->setRequired(['search_text', 'content_types', 'subtree', 'sort', 'order']); + $optionsResolver->setAllowedTypes('search_text', 'string'); $optionsResolver->setAllowedTypes('content_types', 'string[]'); $optionsResolver->setAllowedTypes('sort', 'string[]'); $optionsResolver->setAllowedTypes('subtree', ['int', 'string']); + $optionsResolver->setAllowedValues( 'search_text', static fn (string $searchText): bool => trim($searchText) !== '', ); + $optionsResolver->setAllowedValues( 'sort', /** @var string[] $classNames */ fn (array $classNames): bool => $this->validateSortConfig($classNames), ); + $optionsResolver->setAllowedValues( 'order', static fn (string $order): bool => in_array($order, [Query::SORT_ASC, Query::SORT_DESC], true), ); + $optionsResolver->setDefault('content_types', $this->configResolver->getParameter('search.content_types', 'ngsite')); $optionsResolver->setDefault('subtree', $this->site->getSettings()->rootLocationId); - $optionsResolver->setDefault('sort', [Query\SortClause\DatePublished::class]); + $optionsResolver->setDefault('sort', [SortClause\DatePublished::class]); $optionsResolver->setDefault('order', Query::SORT_DESC); } @@ -69,13 +75,18 @@ protected function doGetQuery(array $parameters): Query if (count($parameters['content_types']) > 0) { $criteria[] = new Criterion\ContentTypeIdentifier($parameters['content_types']); } + $query = new LocationQuery(); $query->query = new FullText(trim($parameters['search_text'])); $query->filter = new Criterion\LogicalAnd($criteria); + + /** @var \Ibexa\Contracts\Core\Repository\Values\Content\Query\SortClause[] $sortClauses */ $sortClauses = []; + foreach ($parameters['sort'] as $className) { $sortClauses[] = new $className($parameters['order']); } + $query->sortClauses = $sortClauses; return $query;