src/Controller/App/ClassroomController.php line 33
<?php
namespace App\Controller\App;
use App\Entity\Child;
use App\Entity\Employee;
use App\Entity\Section;
use App\Entity\Classroom;
use App\Form\ClassroomType;
use App\Entity\enums\ClassroomStatus;
use App\Form\ClassroomTypeBasic;
use App\Repository\ChildRepository;
use App\Repository\ClassroomRepository;
use App\Repository\EmployeeRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Serializer\SerializerInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
#[Route('/app/classroom')]
class ClassroomController extends AbstractController
{
public function __construct(private TranslatorInterface $translator)
{
}
#[Route('/', name: 'app_classroom_index', methods: ['GET', 'POST'])]
public function index(Request $request, ClassroomRepository $classroomRepository, EntityManagerInterface $manager): Response
{
if ($request->isXmlHttpRequest()) {
if ($this->isCsrfTokenValid('classroom_type_basic', $_POST['classroom_type_basic']['_token'])) {
$classroom = new Classroom();
$form = $this->createForm(ClassroomTypeBasic::class, $classroom);
$section = $manager->getRepository(Section::class)->find($_POST['classroom_type_basic']['section']);
$classroom
->setName($_POST['classroom_type_basic']['name'])
->setDescription($_POST['classroom_type_basic']['description'])
->setCapacity($_POST['classroom_type_basic']['capacity'])
->setStatus(ClassroomStatus::INACTIVE)
->setSection($section);
$classroomRepository->add($classroom, true);
return new JsonResponse(['status' => 'ok', 'data' => $classroom->getId(), 'msg' =>$this->translator->trans('Classe crée !')]);
} else {
return new JsonResponse(['status' => 'no', 'data' => null, 'msg' => $this->translator->trans('token invalid !')]);
}
}
$classroom = new Classroom();
$form = $this->createForm(ClassroomTypeBasic::class, $classroom);
$edit_form = $this->createForm(ClassroomTypeBasic::class, $classroom, [
'action' => $this->generateUrl('app_classroom_edit_ajax', ['id' => '1']),
'method' => 'POST',
'attr' => ['name' => 'classroom_type_basic_edit']
]);
return $this->render('app/classroom/index.html.twig', [
'classrooms' => $classroomRepository->findAll(),
'form' => $form->createView(),
'edit_form' => $edit_form->createView()
]);
}
#[Route('/new', name: 'app_classroom_new', methods: ['GET', 'POST'])]
public function new(Request $request, ClassroomRepository $classroomRepository): Response
{
return $this->redirectToRoute('app_classroom_index', [], Response::HTTP_SEE_OTHER);
// $classroom = new Classroom();
// $form = $this->createForm(ClassroomType::class, $classroom);
// $form->handleRequest($request);
// if ($form->isSubmitted() && $form->isValid()) {
// $classroomRepository->add($classroom, true);
// $this->addFlash('success', $this->translator->trans('Succès !!'));
// return $this->redirectToRoute('app_classroom_index', [], Response::HTTP_SEE_OTHER);
// }
// return $this->renderForm('app/classroom/new.html.twig', [
// 'classroom' => $classroom,
// 'form' => $form,
// ]);
}
#[Route('/{id}', name: 'app_classroom_show', methods: ['GET'])]
public function show(Classroom $classroom): Response
{
return $this->render('app/classroom/show.html.twig', [
'classroom' => $classroom,
]);
}
#[Route('/ajax/{id}', name: 'app_classroom_show_ajax', methods: ['GET'])]
public function show_ajax(Classroom $classroom, SerializerInterface $serializer): Response
{
$json = $serializer->serialize($classroom, 'json', ['groups' => ['read:classroom:basic', 'read:section:basic']]);
return $this->json(json_decode($json));
}
#[Route('/{id}/edit', name: 'app_classroom_edit', methods: ['GET', 'POST'])]
public function edit(Request $request, Classroom $classroom, ClassroomRepository $classroomRepository): Response
{
return $this->redirectToRoute('app_classroom_index', [], Response::HTTP_SEE_OTHER);
// $form = $this->createForm(ClassroomType::class, $classroom);
// $form->handleRequest($request);
// if ($form->isSubmitted() && $form->isValid()) {
// $classroomRepository->add($classroom, true);
// $this->addFlash('success', $this->translator->trans('Succès !!'));
// return $this->redirectToRoute('app_classroom_index', [], Response::HTTP_SEE_OTHER);
// }
// return $this->renderForm('app/classroom/edit.html.twig', [
// 'classroom' => $classroom,
// 'form' => $form,
// ]);
}
#[Route('/{id}/status/{status}', name: 'app_classroom_status', methods: ['GET'])]
public function status(Request $request, ClassroomStatus $status, Classroom $classroom, ClassroomRepository $classroomRepository): Response
{
$classroom->setStatus($status);
$classroomRepository->add($classroom, true);
$this->addFlash('success', $this->translator->trans('Succès !!'));
return $this->redirectToRoute('app_classroom_show', ['id' => $classroom->getId()], Response::HTTP_SEE_OTHER);
}
#[Route('/{id?}/edit/ajax', name: 'app_classroom_edit_ajax', methods: ['GET', 'POST'])]
public function edit_ajax(Request $request, Classroom $classroom, ClassroomRepository $classroomRepository, EntityManagerInterface $manager): Response
{
if ($request->isXmlHttpRequest()) {
if ($this->isCsrfTokenValid('edit_classroom', $_POST['classroom_type_basic']['_token'])) {
$section = $manager->getRepository(Section::class)->find($_POST['classroom_type_basic']['section']);
$form = $this->createForm(ClassroomTypeBasic::class, $classroom);
$classroom
->setName($_POST['classroom_type_basic']['name'])
->setDescription($_POST['classroom_type_basic']['description'])
->setCapacity($_POST['classroom_type_basic']['capacity'])
->setSection($section);
$form->handleRequest($request);
$classroomRepository->add($classroom, true);
return new JsonResponse(['status' => 'ok', 'data' => $classroom->getId(), 'msg' => $this->translator->trans('Salle de classe mise à jour !')]);
} else {
return new JsonResponse(['status' => 'no', 'data' => null, 'msg' => $this->translator->trans('token invalid !')]);
}
}
}
#[Route('/{id}', name: 'app_classroom_delete', methods: ['POST'])]
public function delete(Request $request, Classroom $classroom, ClassroomRepository $classroomRepository): Response
{
if ($this->isCsrfTokenValid('delete' . $classroom->getId(), $request->request->get('_token'))) {
try {
$classroomRepository->remove($classroom, true);
$this->addFlash('success', $this->translator->trans('Succès !!'));
} catch (\Exception $e) {
$errorMessage = $e->getMessage();
$result = explode(':', $errorMessage);
$this->addFlash('error', $result[0]);
}
}
return $this->redirectToRoute('app_classroom_index', [], Response::HTTP_SEE_OTHER);
}
#[Route('/assign/child/{classroom}/{child}', name: 'app_classroom_assign_child', methods: ['GET'])]
public function assign_child(Child $child, Classroom $classroom, ChildRepository $childRepository): Response
{
$child->addClassroom($classroom);
$childRepository->add($child, true);
$this->addFlash('success', $this->translator->trans('Succès !!'));
return $this->redirectToRoute('app_classroom_show', ['id' => $classroom->getId()], Response::HTTP_SEE_OTHER);
}
#[Route('/unassign/child/{classroom}/{child}', name: 'app_classroom_unassign_child', methods: ['GET'])]
public function unassign_child(Child $child, Classroom $classroom, ChildRepository $childRepository): Response
{
$child->removeClassroom($classroom);
$childRepository->add($child, true);
$this->addFlash('success', $this->translator->trans('Succès !!'));
return $this->redirectToRoute('app_classroom_show', ['id' => $classroom->getId()], Response::HTTP_SEE_OTHER);
}
#[Route('/assign/employee/{classroom}/{employee}', name: 'app_classroom_assign_employee', methods: ['GET'])]
public function assign_employee(Employee $employee, Classroom $classroom, EmployeeRepository $employeeRepository): Response
{
$employee->addClassroom($classroom);
$employeeRepository->add($employee, true);
$this->addFlash('success', $this->translator->trans('Succès !!'));
return $this->redirectToRoute('app_classroom_show', ['id' => $classroom->getId()], Response::HTTP_SEE_OTHER);
}
#[Route('/unassign/employee/{classroom}/{employee}', name: 'app_classroom_unassign_employee', methods: ['GET'])]
public function unassign_employee(Employee $employee, Classroom $classroom, EmployeeRepository $employeeRepository): Response
{
$employee->removeClassroom($classroom);
$employeeRepository->add($employee, true);
$this->addFlash('success', $this->translator->trans('Succès !!'));
return $this->redirectToRoute('app_classroom_show', ['id' => $classroom->getId()], Response::HTTP_SEE_OTHER);
}
#[Route('{id}/export/children/csv', name: 'app_classroom_export_children_csv', methods: ['GET'])]
public function export_csv(Classroom $classroom, SerializerInterface $serializer): Response
{
$children = $classroom->getChildren();
$csv = $serializer->serialize($children, 'csv', ['groups' => ['read:child:export', 'read:section:export']]);
$csv = str_replace('first_name', 'Prénom', $csv);
$csv = str_replace('last_name', 'Nom', $csv);
$csv = str_replace('gender', 'Genre', $csv);
$csv = str_replace('birth_date', 'Date de naissance', $csv);
$csv = str_replace('birth_place', 'Lieu de naissance', $csv);
$csv = str_replace('blood', 'Groupe sanguin', $csv);
// id,,,,,,,diseases,allergies,food_habit,behavior,fears,interests,description,section,section.id,section.name,section.description,section.age_range ◀
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename="e-rawdha-' . $classroom->getName() . 'children-' . date('m-d-Y') . '.csv"');
header("Pragma: no-cache");
header("Expires: 0");
return new Response($csv);
}
#[Route('{id}/export/children/pdf', name: 'app_classroom_export_children_pdf', methods: ['GET'])]
public function export_pdf(Classroom $classroom, SerializerInterface $serializer): Response
{
$company = $classroom->getOwner();
try {
$path_logo = 'uploads/companies/' . $company->getLogo();
$type = pathinfo($path_logo, PATHINFO_EXTENSION);
$data = file_get_contents($path_logo);
$logo = 'data:image/' . $type . ';base64,' . base64_encode($data);
} catch (\Throwable $th) {
$logo = 'data:image/png;base64,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';
}
$children = $serializer->serialize($classroom->getChildren(), 'json', ['groups' => ['read:child:basic', 'read:section:basic']]);
return $this->render('app/classroom/pdf-list-children.html.twig', [
'user' => $this->getUser(),
'classroom' => $classroom,
'children' => $classroom->getChildren(),
//$children,
'company' => $company,
'qrcode' => 'AMGHAR',
// 'photo' => $photo,
'logo' => $logo
]);
}
}