We have glossary entries in Sulu and would like to iterate over these items via pagination.
We use smartContent with Pagination:
This works for pagination like /glossary?p=2
We would like to extend this to be able to use the pagination with an additional query parameter "letter", like
/glossary?p=3&letter=B
We implemented it as described in the docs
In the moment, we don't know how to get the query parameter letter from the request.
Code from our QueryBuilder
private ?string $letter = null;
public function init(array $options)
{
parent::init($options);
$this->letter = $options['letter'] ?? null;
}
protected function buildWhere($webspaceKey, $locale)
{
$sql2Where = explode(' AND ', parent::buildWhere($webspaceKey, $locale));
// letter parameter is always empty
$sql2Where[] = "page.[i18n:{$locale}-title] LIKE '{$this->letter}%'";
//hard-coded is working
//$sql2Where[] = "page.[i18n:{$locale}-title] LIKE 'B%'";
return implode(' AND ', $sql2Where);
}
How can we pass the query parameter letter to the QueryBuilder?
Technical:
I found the solution.
I didn't know that i can inject request into my QueryBuilder class.
private RequestStack $requestStack;
public function setRequestStack(RequestStack $requestStack): void
{
$this->requestStack = $requestStack;
$request = $this->requestStack->getCurrentRequest();
$this->letter = $request?->query->get('letter') ?? null;
}
private ?string $letter = null;
protected function buildWhere($webspaceKey, $locale)
{
$sql2Where = explode(' AND ', parent::buildWhere($webspaceKey, $locale));
if ($this->letter) {
$sql2Where[] = "page.[i18n:{$locale}-title] LIKE '{$this->letter}%'";
}
return implode(' AND ', $sql2Where);
}
and services.yaml
app.smart_content.letter_filter_query_builder:
class: App\SmartContent\LetterFilterQueryBuilder
arguments:
- '@sulu.content.structure_manager'
- '@sulu_page.extension.manager'
- '@sulu.phpcr.session'
- '%sulu.content.language.namespace%'
calls:
- [setRequestStack, ['@request_stack']] # ← Inject via setter