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

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