phpsymfonypaginationsulu

Custom DataProvider with additional query parameter letter


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:


Solution

  • 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