<?php
namespace App\Controller\Admin;
use App\Entity\Cour;
use App\Entity\Session;
use App\Entity\Sport;
use App\Filter\Event\EventFilteredEntityFilter;
use App\Form\ImportExcelType;
use App\Services\SessionImportService;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\QueryBuilder;
use EasyCorp\Bundle\EasyAdminBundle\Collection\FieldCollection;
use EasyCorp\Bundle\EasyAdminBundle\Collection\FilterCollection;
use EasyCorp\Bundle\EasyAdminBundle\Config\Filters;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
use EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto;
use EasyCorp\Bundle\EasyAdminBundle\Dto\SearchDto;
use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField;
use EasyCorp\Bundle\EasyAdminBundle\Field\DateField;
use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
use EasyCorp\Bundle\EasyAdminBundle\Field\NumberField;
use EasyCorp\Bundle\EasyAdminBundle\Field\TextareaField;
use EasyCorp\Bundle\EasyAdminBundle\Field\TimeField;
use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
use EasyCorp\Bundle\EasyAdminBundle\Config\Actions;
use EasyCorp\Bundle\EasyAdminBundle\Filter\DateTimeFilter;
use EasyCorp\Bundle\EasyAdminBundle\Filter\TextFilter;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class SessionCrudController extends AbstractCrudController
{
/**
* @Route("/get-session-data", name="get_session_data", methods={"GET"})
*/
public function getSessionData(Request $request, EntityManagerInterface $em): JsonResponse
{
$sessionId = $request->query->get('sessionId');
$session = $em->getRepository(Session::class)->find($sessionId);
if (!$session) {
return new JsonResponse(['error' => 'Session not found'], 404);
}
return new JsonResponse([
'date' => $session->getDate()->format('d/m/Y'), // assuming the date is a DateTime object
'designationSession' => $session->getDesignationSession(),
]);
}
public function configureCrud(Crud $crud): Crud
{
return $crud
->setPaginatorPageSize(10000)
->setPageTitle('index', 'Matchs')
->setPageTitle('new', 'Create Match')
->setEntityLabelInSingular('Match');
}
public function createIndexQueryBuilder(SearchDto $searchDto, EntityDto $entityDto, FieldCollection $fields, FilterCollection $filters): QueryBuilder
{
$qb = parent::createIndexQueryBuilder($searchDto, $entityDto, $fields, $filters);
// get the 'event_id' from cookies
$request = $this->get('request_stack')->getCurrentRequest();
$eventId = $request->cookies->get('current_event_id');
if ($eventId) {
$qb->andWhere('entity.event = :eventId')
->setParameter('eventId', $eventId);
}
return $qb;
}
public function configureActions(Actions $actions): Actions
{
$importAction = Action::new('import', 'Import')
->linkToCrudAction('import') // pointe vers la méthode import() dans ce controller
->addCssClass('btn btn-success')
->createAsGlobalAction(); // ceci rendra l'action visible pour toutes les pages du CRUD
return $actions
// ...
->update(Crud::PAGE_INDEX, Action::NEW, function (Action $action) {
return $action->setIcon('fa fa-file-new')->setLabel("Add Match");
})->add(Crud::PAGE_INDEX, $importAction);
}
// cette méthode sera invoquée lorsque vous cliquez sur le bouton 'Import'
public function import(Request $request, SessionImportService $sessionImportService): Response
{
$form = $this->createForm(ImportExcelType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// Handle form submission, call the service to do the importing.
$file = $form->get('file')->getData();
$filePath = $this->getParameter('kernel.project_dir').'/public/uploads/'.$file->getClientOriginalName();
$file->move(
$this->getParameter('kernel.project_dir').'/public/uploads',
$file->getClientOriginalName()
);
$request = $this->get('request_stack')->getCurrentRequest();
$eventId = $request->cookies->get('current_event_id');
$sessionImportService->importFromFile($filePath, $eventId);
}
return $this->render('admin/Session/import.html.twig', [
'form' => $form->createView(),
]);
}
public function configureFilters(Filters $filters): Filters
{
$request = $this->get('request_stack')->getCurrentRequest();
$eventId = $request->cookies->get('current_event_id');
return $filters
->add(EventFilteredEntityFilter::new('design', Sport::class, $eventId, 'Sport'))
->add(EventFilteredEntityFilter::new('cour', Cour::class, $eventId, 'Stade'))
->add(DateTimeFilter::new('date', 'Date'))
->add(TextFilter::new('codeSession', 'Code liste'));
}
public static function getEntityFqcn(): string
{
return Session::class;
}
public function configureFields(string $pageName): iterable
{
$request = $this->get('request_stack')->getCurrentRequest();
$eventId = $request->cookies->get('current_event_id');
yield AssociationField::new('design', 'Sport')->setFormTypeOptions([
'query_builder' => function (EntityRepository $er) use ($eventId) {
return $er->createQueryBuilder('a')
->where('a.event = :currentEventId')
->setParameter('currentEventId', $eventId);
},
]);
if ($pageName == Crud::PAGE_INDEX) {
yield TextField::new('localizedDate', 'Date');
} else {
yield AssociationField::new('cour', 'Stade')->setFormTypeOptions([
'query_builder' => function (EntityRepository $er) use ($eventId) {
return $er->createQueryBuilder('a')
->where('a.event = :currentEventId')
->setParameter('currentEventId', $eventId);
},
]);
yield DateField::new('date', 'Date');
}
yield TimeField::new('heure_start')->setColumns('col-md-3');
yield TimeField::new('heure_end')->setColumns('col-md-3');
yield TextareaField::new('description')->setColumns('col-md-12');
yield TextField::new('designation_session');
yield TextField::new('code_session');
yield TextField::new('type_session');
yield NumberField::new('cat_a');
yield NumberField::new('cat_b');
yield NumberField::new('cat_c');
yield NumberField::new('cat_d');
}
}