<?php
namespace App\Service;
use Doctrine\ORM\QueryBuilder;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Contracts\Translation\TranslatorInterface;
class EntitySortService
{
public function getCurrentLocale():string
{
return $this->requestStack->getCurrentRequest()->getLocale();
}
public function __construct(
private RequestStack $requestStack,
private TranslatorInterface $translator
) {}
public function sortEntityArrayUsingStringCompareByFieldName(array $array, string $field): array
{
$field = 'get' . ucfirst($field);
uasort($array, function($a, $b) use ($field): int {
return strcmp($a->{$field}(), $b->{$field}());
});
return $array;
}
public function sortEntityArrayByTranslatableFieldName(array $array, string $translatableFieldName, ?callable $firstLevelSortFunction = null): array
{
$translatableFieldName = 'get' . ucfirst($translatableFieldName);
uasort($array, function($a, $b) use ($translatableFieldName, $firstLevelSortFunction) {
$nameCompareResult = strcmp(
$this->translator->trans($a->{$translatableFieldName}()),
$this->translator->trans($b->{$translatableFieldName}())
);
if(null !== $firstLevelSortFunction) {
$firstLevelFunctionCompareResult = $firstLevelSortFunction($a, $b);
return 0 === $firstLevelFunctionCompareResult ? $nameCompareResult : $firstLevelFunctionCompareResult;
} else {
return $nameCompareResult;
}
// return strcmp(
// $this->translator->trans($a->{$translatableFieldName}()),
// $this->translator->trans($b->{$translatableFieldName}())
// );
});
return $array;
}
public function modifyQueryBuilderToSortByCurrentTranslation(QueryBuilder &$qb, string $dqlAlias, string $fieldName): void
{
$qb->orderBy(sprintf('json_unquote(json_extract(%s.%s, :json_path))', $dqlAlias, $fieldName))
->setParameter('json_path', sprintf('$.%s', $this->getCurrentLocale()));
}
}