Skip to content

Commit 0f6c026

Browse files
committed
Refactor the search form to use type classes instead of a single form builder class
1 parent c317451 commit 0f6c026

File tree

8 files changed

+82
-5
lines changed

8 files changed

+82
-5
lines changed

src/Controller/Action/SearchAction.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@
1313
use Setono\SyliusMeilisearchPlugin\Event\Search\SearchResponseParametersCreated;
1414
use Setono\SyliusMeilisearchPlugin\Event\Search\SearchResultReceived;
1515
use Setono\SyliusMeilisearchPlugin\Form\Builder\SearchFormBuilderInterface;
16+
use Setono\SyliusMeilisearchPlugin\Form\Type\SearchResultType;
1617
use Setono\SyliusMeilisearchPlugin\Model\IndexableInterface;
18+
use Symfony\Component\Form\FormFactoryInterface;
1719
use Symfony\Component\HttpFoundation\Request;
1820
use Symfony\Component\HttpFoundation\Response;
1921
use Twig\Environment;
@@ -24,6 +26,7 @@ final class SearchAction
2426

2527
public function __construct(
2628
ManagerRegistry $managerRegistry,
29+
private readonly FormFactoryInterface $formFactory,
2730
private readonly Environment $twig,
2831
private readonly SearchFormBuilderInterface $searchFormBuilder,
2932
private readonly SearchEngineInterface $searchEngine,
@@ -40,7 +43,7 @@ public function __invoke(Request $request): Response
4043
$searchResult = $this->searchEngine->execute($searchRequestCreatedEvent->searchRequest);
4144
$this->eventDispatcher->dispatch(new SearchResultReceived($searchResult));
4245

43-
$searchForm = $this->searchFormBuilder->build($searchResult);
46+
$searchForm = $this->formFactory->create(SearchResultType::class, $searchResult);
4447
$searchForm->handleRequest($request);
4548

4649
if ($searchForm->isSubmitted() && !$searchForm->isValid()) {

src/Engine/SearchResult.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,15 @@ final class SearchResult
1313
public function __construct(
1414
/** The index that was queried */
1515
public readonly Index $index,
16-
16+
public readonly string $query,
1717
/** @var array<int, array> $hits */
1818
public readonly array $hits,
1919
public readonly int $totalHits,
2020
public readonly int $page,
2121
public readonly int $pageSize,
2222
public readonly int $totalPages,
2323
public readonly FacetDistribution $facetDistribution,
24+
public readonly ?string $sort = null,
2425
) {
2526
}
2627

@@ -44,6 +45,7 @@ public static function fromMeilisearchSearchResult(Index $index, MeilisearchSear
4445

4546
return new self(
4647
$index,
48+
$meilisearchSearchResult->getQuery(),
4749
$meilisearchSearchResult->getHits(),
4850
$totalHits,
4951
$page,

src/Form/Builder/SearchFormBuilder.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public function build(SearchResult $searchResult): FormInterface
3535
'csrf_protection' => false,
3636
'allow_extra_fields' => true,
3737
])
38-
->add('q', HiddenType::class)
38+
->add(SearchRequest::QUERY_PARAMETER_FILTER, HiddenType::class)
3939
->setMethod('GET')
4040
;
4141

@@ -79,7 +79,7 @@ private function buildPagination(SearchResult $searchResult, FormBuilderInterfac
7979
$choices['setono_sylius_meilisearch.form.search.pagination.next'] = $searchResult->page + 1;
8080
}
8181

82-
$builder->add('p', ChoiceType::class, [
82+
$builder->add(SearchRequest::QUERY_PARAMETER_PAGE, ChoiceType::class, [
8383
'choices' => $choices,
8484
'choice_attr' => fn (string $page) => ['style' => 'display: none'], // we only want to display the labels
8585
'required' => false,

src/Form/Type/SearchFilterType.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Setono\SyliusMeilisearchPlugin\Form\Type;
6+
7+
use Symfony\Component\Form\AbstractType;
8+
use Symfony\Component\Form\FormBuilderInterface;
9+
use Symfony\Component\OptionsResolver\OptionsResolver;
10+
11+
final class SearchFilterType extends AbstractType
12+
{
13+
public function buildForm(FormBuilderInterface $builder, array $options): void
14+
{
15+
}
16+
17+
public function configureOptions(OptionsResolver $resolver): void
18+
{
19+
}
20+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Setono\SyliusMeilisearchPlugin\Form\Type;
6+
7+
use Symfony\Component\Form\AbstractType;
8+
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
9+
use Symfony\Component\Form\FormBuilderInterface;
10+
use Symfony\Component\Form\FormEvent;
11+
use Symfony\Component\Form\FormEvents;
12+
use Symfony\Component\OptionsResolver\OptionsResolver;
13+
14+
final class SearchResultSortType extends AbstractType
15+
{
16+
public function buildForm(FormBuilderInterface $builder, array $options)
17+
{
18+
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event): void {
19+
dump($event->getData());
20+
});
21+
}
22+
}

src/Form/Type/SearchResultType.php

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Setono\SyliusMeilisearchPlugin\Form\Type;
6+
7+
use Setono\SyliusMeilisearchPlugin\Engine\SearchRequest;
8+
use Symfony\Component\Form\AbstractType;
9+
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
10+
use Symfony\Component\Form\FormBuilderInterface;
11+
use Symfony\Component\Form\FormEvent;
12+
use Symfony\Component\Form\FormEvents;
13+
14+
final class SearchResultType extends AbstractType
15+
{
16+
public function buildForm(FormBuilderInterface $builder, array $options): void
17+
{
18+
$builder
19+
->add(SearchRequest::QUERY_PARAMETER_SEARCH, HiddenType::class, [
20+
'property_path' => 'query',
21+
])
22+
// ->add(SearchRequest::QUERY_PARAMETER_FILTER, SearchFilterType::class)
23+
->add(SearchRequest::QUERY_PARAMETER_SORT, SearchResultSortType::class, [
24+
'property_path' => 'sort',
25+
])
26+
->setMethod('GET')
27+
;
28+
}
29+
}

src/Resources/config/services/conditional/search.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
<service id="Setono\SyliusMeilisearchPlugin\Controller\Action\SearchAction" public="true">
1111
<argument type="service" id="doctrine"/>
12+
<argument type="service" id="form.factory"/>
1213
<argument type="service" id="twig"/>
1314
<argument type="service" id="Setono\SyliusMeilisearchPlugin\Form\Builder\SearchFormBuilderInterface"/>
1415
<argument type="service" id="Setono\SyliusMeilisearchPlugin\Engine\SearchEngineInterface"/>
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{{ form_widget(searchForm.f, { 'attr': { 'class': 'ssm-filters' } }) }}
1+
{#{{ form_widget(searchForm.f, { 'attr': { 'class': 'ssm-filters' } }) }}#}

0 commit comments

Comments
 (0)