src/Component/Elasticsearch/Form/Type/SearchType.php line 24

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace BitBag\OpenMarketplace\Component\Elasticsearch\Form\Type;
  4. use BitBag\SyliusElasticsearchPlugin\Facet\RegistryInterface;
  5. use BitBag\SyliusElasticsearchPlugin\Form\Type\SearchBoxType;
  6. use BitBag\SyliusElasticsearchPlugin\Form\Type\SearchFacetsType;
  7. use BitBag\SyliusElasticsearchPlugin\Model\Search;
  8. use BitBag\SyliusElasticsearchPlugin\Model\SearchBox;
  9. use BitBag\SyliusElasticsearchPlugin\QueryBuilder\QueryBuilderInterface;
  10. use Elastica\Query;
  11. use FOS\ElasticaBundle\Finder\PaginatedFinderInterface;
  12. use FOS\ElasticaBundle\Paginator\FantaPaginatorAdapter;
  13. use Pagerfanta\Adapter\AdapterInterface;
  14. use Symfony\Component\Form\AbstractType;
  15. use Symfony\Component\Form\FormBuilderInterface;
  16. use Symfony\Component\Form\FormEvent;
  17. use Symfony\Component\Form\FormEvents;
  18. use Symfony\Component\Form\FormInterface;
  19. use Symfony\Component\OptionsResolver\OptionsResolver;
  20. final class SearchType extends AbstractType
  21. {
  22.     private PaginatedFinderInterface $finder;
  23.     private RegistryInterface $facetRegistry;
  24.     private QueryBuilderInterface $searchProductsQueryBuilder;
  25.     public function __construct(
  26.         PaginatedFinderInterface $finder,
  27.         RegistryInterface $facetRegistry,
  28.         QueryBuilderInterface $searchProductsQueryBuilder
  29.     ) {
  30.         $this->finder $finder;
  31.         $this->facetRegistry $facetRegistry;
  32.         $this->searchProductsQueryBuilder $searchProductsQueryBuilder;
  33.     }
  34.     public function buildForm(FormBuilderInterface $builder, array $options): void
  35.     {
  36.         $builder
  37.             ->add('box'SearchBoxType::class, ['label' => false])
  38.             ->setMethod('GET')
  39.         ;
  40.         $formModifier = function (FormInterface $formAdapterInterface $adapter) {
  41.             if (!$adapter instanceof FantaPaginatorAdapter) {
  42.                 return;
  43.             }
  44.             $form->add('filters'SearchFacetsType::class, [
  45.                 'facets' => $adapter->getAggregations(),
  46.                 'label' => false,
  47.                 'property_path' => 'facets',
  48.             ]);
  49.         };
  50.         $builder
  51.             ->get('box')
  52.             ->addEventListener(
  53.                 FormEvents::POST_SUBMIT,
  54.                 function (FormEvent $event) use ($formModifier) {
  55.                     /** @var SearchBox $data */
  56.                     $data $event->getForm()->getData();
  57.                     if (!$data->getQuery()) {
  58.                         return;
  59.                     }
  60.                     $query = new Query($this->searchProductsQueryBuilder->buildQuery(['query' => $data->getQuery()]));
  61.                     foreach ($this->facetRegistry->getFacets() as $facetId => $facet) {
  62.                         $query->addAggregation($facet->getAggregation()->setName($facetId));
  63.                     }
  64.                     $query->setSize(0);
  65.                     $results $this->finder->findPaginated($query);
  66.                     if (null !== $event->getForm()->getParent()) {
  67.                         $formModifier($event->getForm()->getParent(), $results->getAdapter());
  68.                     }
  69.                 }
  70.             )
  71.         ;
  72.     }
  73.     public function configureOptions(OptionsResolver $resolver): void
  74.     {
  75.         $resolver->setDefaults([
  76.             'data_class' => Search::class,
  77.             'csrf_protection' => false,
  78.         ]);
  79.     }
  80.     public function getBlockPrefix(): string
  81.     {
  82.         return 'parameters';
  83.     }
  84. }