<?php
namespace App\EventSubscriber\Management;
use EasyCorp\Bundle\EasyAdminBundle\Event\EasyAdminEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\EventDispatcher\GenericEvent;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
class SearchSubscriber implements EventSubscriberInterface
{
public function __construct(
private RequestStack $requestStack,
) {}
public static function getSubscribedEvents(): array
{
return [
EasyAdminEvents::PRE_SEARCH => 'lowercaseSearchRequest',
EasyAdminEvents::POST_SEARCH_QUERY_BUILDER => [
['addRegexPhoneSearch', 0]
],
];
}
public function addRegexPhoneSearch(GenericEvent $event): void
{
// if($event->getArgument('entity')['name'] != 'Profile')
// return;
$searchableFields = array_keys($event->getArgument('searchable_fields'));
$queryBuilder = $event->getArgument('query_builder');
$entitiesAlreadyJoined = $queryBuilder->getAllAliases();
foreach ($searchableFields as $fieldName) {
if(false === $this->endsWith($fieldName, 'phoneNumber'))
continue;
$entityName = 'entity';
if (false !== strpos($fieldName, '.')) {
// support arbitrarily nested associations (e.g. foo.bar.baz.qux)
$associationComponents = \explode('.', $fieldName);
for ($i = 0; $i < \count($associationComponents) - 1; ++$i) {
$associatedEntityName = $associationComponents[$i];
$associatedFieldName = $associationComponents[$i + 1];
if (!\in_array($associatedEntityName, $entitiesAlreadyJoined)) {
$parentEntityName = 0 === $i ? 'entity' : $associationComponents[$i - 1];
$queryBuilder->leftJoin($parentEntityName . '.' . $associatedEntityName, $associatedEntityName);
$entitiesAlreadyJoined[] = $associatedEntityName;
}
$entityName = $associatedEntityName;
$fieldName = $associatedFieldName;
}
}
$queryBuilder->orWhere(\sprintf("REGEXP_REPLACE(%s.%s, '-| ', '') LIKE :fuzzy_query", $entityName, $fieldName));
$queryBuilder->setParameter('fuzzy_query', '%'.$event->getArgument('search_query').'%');
}
}
public function lowercaseSearchRequest(GenericEvent $event): void
{
$this->requestStack->getCurrentRequest()->query->set(
'query',
mb_strtolower($this->requestStack->getCurrentRequest()->query->get('query'))
);
}
protected function endsWith( $haystack, $needle )
{
$length = strlen( $needle );
if( !$length ) {
return true;
}
return substr( $haystack, -$length ) === $needle;
}
}