<?php
namespace App\Controller\Admin;
use App\Entity\Sujetforum;
use App\Entity\User;
use App\Service\NotificationManager;
use Doctrine\ORM\EntityManagerInterface;
use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
use EasyCorp\Bundle\EasyAdminBundle\Field\IdField;
use EasyCorp\Bundle\EasyAdminBundle\Config\Actions;
use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
use EasyCorp\Bundle\EasyAdminBundle\Field\BooleanField;
use EasyCorp\Bundle\EasyAdminBundle\Field\DateField;
use EasyCorp\Bundle\EasyAdminBundle\Field\TextareaField;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Knp\Component\Pager\PaginatorInterface;
use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\HttpFoundation\JsonResponse;
use DateTimeImmutable; // Assurez-vous que cette classe est importée en haut de votre fichier
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Validator\Constraints\NotBlank;
class SujetforumCrudController extends AbstractCrudController
{
public $em;
private $adminUrlGenerator;
private $notificationManager;
private $request;
/**
* @param EntityManagerInterface $em
*/
public function __construct(EntityManagerInterface $em, AdminUrlGenerator $adminUrlGenerator, NotificationManager $notificationManager)
{
$this->em = $em;
$this->adminUrlGenerator = $adminUrlGenerator;
$this->notificationManager = $notificationManager;
}
#[Route('/forum/list', name: 'app_list_sujet_propose')]
public function listSujetPropose(EntityManagerInterface $entityManager): Response
{
$Sujetforums = $entityManager->getRepository(Sujetforum::class)->findBy(['user' => $this->getUser()]);
return $this->render('forum/list_sujet_propose.html.twig', [
"sujetforums" => $Sujetforums,
]);
}
public static function getEntityFqcn(): string
{
return Sujetforum::class;
}
public function configureCrud(Crud $crud): Crud
{
return $crud->setPageTitle('index', 'Liste des sujets ')
->setPageTitle('detail', 'Détails des sujets')
->setPageTitle('new', 'Créer un sujet')
->setPageTitle('edit', 'Modifier un sujet');
}
public function configureActions(Actions $actions): Actions
{
$actions->add(Crud::PAGE_INDEX, Action::DETAIL)
->update(Crud::PAGE_INDEX, Action::NEW, function (Action $action) {
return $action->setIcon('fa fa-plus')->setLabel('Créer un sujet');
})
->update(Crud::PAGE_NEW, Action::SAVE_AND_RETURN, function (Action $action) {
return $action->setLabel('Enregistrer');
});
return $actions;
}
public function configureFields(string $pageName): iterable
{
return [
IdField::new('id')->hideOnForm(),
TextField::new('sujet'),
TextareaField::new('description')->formatValue(function ($value) {
return $value;
}),
TextField::new('user', 'utilisateur')->setFormTypeOption('disabled', 'disabled'),
BooleanField::new('ispublic', 'Publier ?')
// ->onlyOnForms() // Ne s'affiche que dans le formulaire
->setFormTypeOption('attr', ['class' => 'enable-in-form'])->setDisabled( $pageName == Crud::PAGE_INDEX,true), // Ajout d'une classe CSS personnalisée
DateField::new('date_public', ' ')
->setFormType(DateType::class)
->onlyOnForms()
->setFormTypeOptions([
'widget' => 'single_text',
'data' => new \DateTimeImmutable(),
'constraints' => [
new NotBlank(),
],
'attr' => ['style' => 'display: none'],
]),
];
}
public function persistEntity(EntityManagerInterface $entityManager, $entityInstance): void
{
$entityInstance->setUser($this->getUser());
$entityInstance->setDate(new \DateTime());
$entityManager->persist($entityInstance);
$entityManager->flush();
}
public function updateEntity(EntityManagerInterface $entityManager, $entityInstance): void
{
// $entityInstance->setSujet($entityInstance->getSujet());
// $entityInstance->setDescription($entityInstance->getDescription());
// $entityManager->setIsPublic($entityInstance->isIsPublic());
if($entityInstance->isIsPublic()){
$urlSujet = '/list/forum/index/';
$user = $entityManager->getRepository(User::class)->find($entityInstance->getUser());
$notification_message = 'Votre sujet a été validé ! ';
$this->notificationManager->pushMessage('Votre sujet a été validé !', $notification_message, $user, $urlSujet);
}
$entityManager->persist($entityInstance);
$entityManager->flush();
}
#[Route('/list/forum/index/', name: 'index_forum')]
public function listServices(Request $request, EntityManagerInterface $em, PaginatorInterface $paginator): Response
{
//$donnees = $entityManager->getRepository(Sujetforum::class)->findBy([], ['id'=>'DESC']);
$donnees = $em->getRepository(Sujetforum::class)->getLastsSujetForums($request->query->get('offset'), 2);
// $sujetForums = $paginator->paginate(
// $donnees,
// $request->query->getInt('page', 1),
// 10
// );
return $this->render('forum/index.html.twig', [
'sujetForums' => $donnees,
]);
}
#[Route('/delete/forum/sujet/{id}', name: 'delete_forum__sujet_response')]
public function deleteResponseForum(Sujetforum $reponse, Request $request, EntityManagerInterface $entityManager, Security $security): JsonResponse
{
$entityManager->remove($reponse);
$entityManager->flush();
return new JsonResponse(['data' => 'done'], Response::HTTP_OK, ['Content-Type', 'application/json']);
}
#[Route('/forum/update/{id}', name: 'update_forum_sujet')]
public function updateResponseForum(Sujetforum $reponse, Request $request,
EntityManagerInterface $entityManager,
AdminUrlGenerator $adminUrlGenerator): Response
{
$reponse->setDescription($request->request->get('sujetDescription'));
$reponse->setSujet($request->request->get('sujetName'));
$entityManager->persist($reponse);
$entityManager->flush();
// End send comment
return $this->redirectToRoute('index_forum');
}
#[Route('/make/sujet/', name: 'make_sujet')]
public function responseForum(Request $request, EntityManagerInterface $entityManager,
Security $security,
AdminUrlGenerator $adminUrlGenerator,
NotificationManager $notificationManager): Response
{
$sujet = new Sujetforum();
$sujet->setSujet($request->request->get('sujetName'));
$sujet->setDescription($request->request->get('sujetDescription'));
$sujet->setIsPublic(false);
$sujet->setUser($security->getUser());
$sujet->setDate((new \DateTime()));
$entityManager->persist($sujet);
$entityManager->flush();
// Send Comment
$edit_demande_url = $this->adminUrlGenerator
->setController(SujetforumCrudController::class)
->setAction(Action::INDEX)
->generateUrl();
$notification_message = 'Nouveau sujet proposé ! ';
$admins = $entityManager->getRepository(User::class)->findByRole('ROLE_ADMIN');
foreach($admins as $admin){
$notificationManager->pushMessage('Nouveau sujet proposé !', $notification_message, $admin, $edit_demande_url);
}
return $this->redirectToRoute('index_forum');
}
#[Route('ajax/get/sujetForum', name: 'ajax_get_sujetForum')]
public function getSujetForum(Request $request, EntityManagerInterface $em, Security $security): JsonResponse
{
/** @var $result */
$result = [];
try {
$user = null;
$donnees = $em->getRepository(Sujetforum::class)->getLastsSujetForums($request->query->get('offset'), 2);
foreach ($donnees as $key => $obj) {
$result[$key] = [
'id' => $obj->getId(),
'sujet' => $obj->getSujet(),
// 'date' => $obj->getDate()->format('d/m/Y'),
'isPublic' => $obj->isIsPublic(),
'userName' => $obj->getUser()->getUsername(),
'description' => $obj->getDescription(),
'userId' => $obj->getUser()->getId(),
'date' =>$obj->getDatePublic()
];
}
if ($security->getUser()) {
$user = $security->getUser()->getId();
}
} catch (\Exception $e) {
echo $e->getMessage();
}
return new JsonResponse(['result' => $result, "userId" => $user], Response::HTTP_OK, ['Content-Type', 'application/json']);
}
#[Route('/list/forum/delete/{id}', name: 'sujet_delete')]
public function deleteAction($id, EntityManagerInterface $entityManager)
{
$sujet = $entityManager->getRepository(Sujetforum::class);
$sujet = $sujet->find($id);
if (!$sujet) {
throw $this->createNotFoundException(
'Il n\'y a aucun sujet avec l\'identifiant suivant : ' . $id
);
}
$entityManager->remove($sujet);
$entityManager->flush();
$this->addFlash('success', 'suppression effectuée avec succès');
return $this->redirect($this->generateUrl('app_list_sujet_propose'));
}
/**
* @Route("/sujet/fetchData/{id}", name="fetch_sujet_data", methods={"GET"})
*/
public function fetchData(int $id, EntityManagerInterface $entityManager): Response
{
$sujetforum = $entityManager->getRepository(Sujetforum::class)->find($id);
if (!$sujetforum) {
return $this->json(['error' => 'Subject not found.'], Response::HTTP_NOT_FOUND);
}
$date_pub = '';
if ($sujetforum->getDatePublic()) {
$date_pub = $sujetforum->getDatePublic()->format('Y-m-d');
}
$response = [
'id' => $sujetforum->getId(),
'sujet' => $sujetforum->getSujet(),
'description' => $sujetforum->getDescription(),
'isPublic' => $sujetforum->isIsPublic(),
'date' => $sujetforum->getDate()->format('Y-m-d'),
'date_pub' => $date_pub
];
return $this->json($response);
}
/**
* @Route("/sujet/update/{id}", name="update_sujet", methods={"POST"})
*/
public function updateSujet(Request $request, int $id, EntityManagerInterface $entityManager): Response
{
$sujetforum = $entityManager->getRepository(Sujetforum::class)->find($id);
if (!$sujetforum) {
return $this->json(['error' => 'Subject not found.'], Response::HTTP_NOT_FOUND);
}
// Assuming the submitted form data is sent as JSON, you can decode it as follows:
$formData = json_decode($request->getContent(), true);
// Update the properties of the Sujetforum entity based on the form data
$sujetforum->setSujet($formData['sujetName']);
$sujetforum->setDescription($formData['sujetDescription']);
$sujetforum->setDate((new \DateTime()));
// Update other properties as needed
// Persist and flush the changes tVotre Sujet a été publiéo the database
$entityManager->persist($sujetforum);
$entityManager->flush();
// Return a success response
$response = [
'success' => true,
'messages' => 'Le sujet a été mis à jour avec succès.',
];
return $this->json($response);
}
}