<?php
/*
* This file is part of the nellapp package.
*
* (c) Benjamin Georgeault <https://www.drosalys-web.fr/>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace App\Form\Channel\Filter;
use App\Entity\Account\Advice;
use Spiriit\Bundle\FormFilterBundle\Filter\Doctrine\ORMQuery;
use Spiriit\Bundle\FormFilterBundle\Filter\Form\Type\ChoiceFilterType;
use Spiriit\Bundle\FormFilterBundle\Filter\Form\Type\TextFilterType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
/**
* Class ChannelFilter
*
* @author Benjamin Georgeault
*/
class ChannelTrainingFilter extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('order', ChoiceFilterType::class, [
'label' => false,
'required' => true,
'choices' => [
'Trier par' => null,
'Les plus récentes' => 'newest',
'Les plus anciennes' => 'oldest',
'Les plus populaires' => 'most-popular',
],
'attr' => [
'class' => 'select-order-channel-trainings',
],
'choice_attr' => function($key, $val, $index) {
if ($key === null) {
return ['disabled' => 'disabled', 'hidden' => 'hidden'];
}
return [];
},
'apply_filter' => function (ORMQuery $filterQuery, $field, $values) {
if (empty($values['value'])) {
return null;
}
if ($values['value'] === 'newest') {
return $filterQuery->getQueryBuilder()->orderBy($filterQuery->getRootAlias().'.createdAt', 'DESC');
} elseif ($values['value'] === 'oldest') {
return $filterQuery->getQueryBuilder()->orderBy($filterQuery->getRootAlias().'.createdAt', 'ASC');
} elseif ($values['value'] === 'most-popular') {
return $filterQuery->getQueryBuilder()
->addSelect('avg(a.note) AS HIDDEN avgmark')
->leftJoin(Advice::class, 'a', 'WITH', $filterQuery->getRootAlias() . ' = a.training')
->groupBy($filterQuery->getRootAlias() . '.id')
->orderBy('avgmark', 'DESC')
->addOrderBy($filterQuery->getRootAlias() . '.createdAt', 'DESC');
}
return null;
},
])
->add('search', TextFilterType::class, [
'label' => false,
'required' => false,
'attr' => [
'placeholder' => 'Rechercher une formation',
'autocomplete' => 'off',
],
'apply_filter' => function (ORMQuery $filterQuery, $field, $values) {
return null;
},
])
;
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'method' => 'GET',
'csrf_protection' => false,
'validation_groups' => [
'filtering',
],
]);
}
public function getBlockPrefix(): string
{
return 'channel_channel_training_filter';
}
}