<?php namespace App\Form\Activity; use App\Entity\ActorEntity; use App\Form\AbstractFormManager; use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\Extension\Core\Type\SubmitType; use App\Repository\ActivityRepository; use Doctrine\ORM\Query; use Doctrine\ORM\Query\Expr\Join; use Doctrine\Common\Collections\Criteria; class ActivityFilterForm extends AbstractFormManager { /** @var array List of actors */ protected $actors = []; /** * {@inheritdoc} */ public function __construct(FormBuilderInterface $formBuilder, array $data = [], bool $usesToken = true) { $this->actors = $data['actors']; parent::__construct($formBuilder, $data, $usesToken); } /** * Create query builder * * @param ActivityRepository $activityRepository * @return array */ public function getActivities(ActivityRepository $activityRepository): array { $data = $this->getData(); // Create filter $criteria = new Criteria(); // Filter actors if(!is_null($data['actor'])) { $criteria->andWhere($criteria->expr()->eq('activity.actor', $data['actor'])); } // Create query $query = $activityRepository->createQueryBuilder('activity'); $query->join(ActorEntity::class, 'actor', Join::WITH, 'activity.actor = actor'); $query->addCriteria($criteria); return $query->getQuery()->execute([], Query::HYDRATE_OBJECT); } /** * {@inheritdoc} */ public function getTemplate(): string { return '_includes/html/form/activity/filter.html.twig'; } /** * {@inheritdoc} */ protected function addFields($formBuilder, $options): void { $formBuilder->add('actor', EntityType::class, [ 'class' => ActorEntity::class, 'choices' => $this->actors, 'group_by' => function (ActorEntity $choice) { if ($choice->getFollowed()) { return 'Suivi'; } if ($choice->getActive()) { return 'Actif'; } return 'Inactif'; }, 'choice_label' => 'displayName', 'required' => false, ]) ->add('submit', SubmitType::class); } }