<?php
namespace App\Controller\Admin;
use App\Entity\Documents;
use App\Entity\Ressources;
use App\Entity\User;
use App\Service\NotificationManager;
use Doctrine\ORM\EntityManagerInterface;
use Knp\Component\Pager\PaginatorInterface;
use phpDocumentor\Reflection\Types\Resource_;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
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\Config\Filters;
use EasyCorp\Bundle\EasyAdminBundle\Field\DateField;
use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
use EasyCorp\Bundle\EasyAdminBundle\Field\ImageField;
use EasyCorp\Bundle\EasyAdminBundle\Field\ChoiceField;
use EasyCorp\Bundle\EasyAdminBundle\Field\BooleanField;
use EasyCorp\Bundle\EasyAdminBundle\Filter\ArrayFilter;
use EasyCorp\Bundle\EasyAdminBundle\Field\TextareaField;
use EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext;
use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
use EasyCorp\Bundle\EasyAdminBundle\Contracts\Field\FieldInterface;
use Symfony\Component\Validator\Constraints\Callback;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
class RessourcesCrudController extends AbstractCrudController
{
private AdminUrlGenerator $adminUrlGenerator;
public function __construct(
AdminUrlGenerator $adminUrlGenerator,
) {
$this->adminUrlGenerator = $adminUrlGenerator;
}
public static function getEntityFqcn(): string
{
return Ressources::class;
}
public function configureCrud(Crud $crud): Crud
{
return $crud ->setPageTitle('index', 'Liste des Ressources')
->setPageTitle('detail', 'Détails Ressource')
->setPageTitle('new', 'Créer une Ressource')
->setPageTitle('edit', 'Modifier une Ressource') ->overrideTemplates([
'crud/edit' => 'admin/fields/publier.html.twig'
]);
}
public function configureFilters(Filters $filters): Filters
{
return $filters
->add(ArrayFilter::new('status', 'Statut')->setChoices(array_combine(Ressources::STATUS_ARRAY, Ressources::STATUS_ARRAY)));
}
public function configureActions(Actions $actions): Actions
{
$valider = Action::new('validerDocument', 'Valider', 'fa fa-check-circle')
->linkToCrudAction('validerDocument') ->displayIf(static function ($entity) {
return $entity->getStatus() == 'en cours';
});
$refuser = Action::new('refuserDocument', 'Refuser', 'fa fa-ban')
->linkToCrudAction('refuserDocument') ->displayIf(static function ($entity) {
return $entity->getStatus() == 'en cours';
});
return $actions
->update(Crud::PAGE_NEW, Action::SAVE_AND_RETURN, function (Action $action) {
return $action->setLabel('Enregistrer');
})
->update(Crud::PAGE_INDEX, Action::NEW, function (Action $action) {
return $action->setLabel('Créer ressource');
})
->update(Crud::PAGE_INDEX, Action::EDIT, function (Action $action) {
return $action->displayIf(static function ($entity) {
return $entity->getStatus() == 'en cours' || $entity->getStatus() != 'refusé';
});
})
->update(Crud::PAGE_DETAIL, Action::EDIT, function (Action $action) {
return $action->displayIf(static function ($entity) {
return $entity->getStatus() == 'en cours' || $entity->getStatus() != 'refusé';
});
})
->add(Crud::PAGE_EDIT, $valider)
->add(Crud::PAGE_EDIT, $refuser)
->add(Crud::PAGE_INDEX, Action::DETAIL)
;
}
public function validerDocument(EntityManagerInterface $entityManager, AdminContext $context, NotificationManager $notificationManager)
{
$ressource = $context->getEntity()->getInstance();
$ressource->setStatus('VALIDATED');
if ($ressource->getDateDebut() != new \DateTime()) {
$ressource->setDateDebut(new \DateTime());
}
$ressource->setIsPublic(true);
$entityManager->persist($ressource);
$entityManager->flush();
$url =
$this->adminUrlGenerator
->setController(RessourcesCrudController::class)
->setAction(Action::INDEX)
->generateUrl();
$urlCommande = '/listDocuments';
$user = $entityManager->getRepository(User::class)->find($ressource->getUser());
$notification_message = 'Votre Document a été validée !' . $ressource->getId() . ' ';
$notificationManager->pushMessage('Votre Document a été validée !', $notification_message, $user, $urlCommande);
return $this->redirect($url);
}
public function refuserDocument(EntityManagerInterface $entityManager, AdminContext $context, NotificationManager $notificationManager)
{
$ressource = $context->getEntity()->getInstance();
if ($ressource->getStatus() === Ressources::STATUS_ARRAY['WAITING']) {
$ressource->setStatus('REFUSED');
}
$ressource->setIsPublic(false);
$entityManager->persist($ressource);
$entityManager->flush();
$url =
$this->adminUrlGenerator
->setController(RessourcesCrudController::class)
->setAction(Action::INDEX)
->generateUrl();
$urlCommande = '/listDocuments';
$user = $entityManager->getRepository(User::class)->find($ressource->getUser());
$notification_message = 'Votre Document a été refusé !' . $ressource->getId() . ' ';
$notificationManager->pushMessage('Votre Document a été refusé !', $notification_message, $user, $urlCommande);
return $this->redirect($url);
}
public function configureFields(string $pageName): iterable
{
return [
IdField::new('id')->hideOnForm()->setColumns('col-sm-6 col-md-6 col-lg-5 col-xxl-3'),
TextField::new('titre')->setColumns('col-sm-6 col-md-6 col-lg-5 col-xxl-3'),
ImageField::new('image', 'Photo')->setUploadDir('/public/upload/galerie/images')->setBasePath('upload/galerie/images')
->setUploadedFileNamePattern('[randomhash].[extension]')
->setFormTypeOptions(["attr" => ['accept' => 'image/*']])
->setRequired($pageName !== Crud::PAGE_EDIT),
TextareaField::new('description')->setColumns('col-sm-6 col-md-6 col-lg-5 col-xxl-3'),
TextField::new('auteur')->setColumns('col-sm-6 col-md-6 col-lg-5 col-xxl-3'),
DateField::new('date_debut', 'Date de début')
->setColumns('col-sm-6 col-md-6 col-lg-5 col-xxl-3')
->setFormTypeOptions([
'constraints' => [
new Callback([$this, 'validateDateDebut']),
],
]),
DateField::new('date_expiration', 'Date d\'expiration')
->setColumns('col-sm-6 col-md-6 col-lg-5 col-xxl-3'),
ChoiceField::new('Categorie', 'Catégorie')
->setChoices([
'Guide' => 'Guide',
'Fiches d’expérience' => 'Fiches d experience',
'Manifestations' => 'Manifestations',
'Lois et règlements' => 'Lois et reglements',
'Centre de documentation' => 'Centre de documentation',
])->setFormTypeOptions(['placeholder' => 'Veuillez sélectionner Catégorie'])->setColumns('col-sm-6 col-md-6 col-lg-5 col-xxl-3')/*->hideOnIndex()*/,
ImageField::new('ressource', 'Ressource')->setUploadDir('/public/upload/galerie/images')->setBasePath('upload/galerie/images')->setTemplatePath('admin/fields/vich_uploader_pdf.html.twig')
->setUploadedFileNamePattern('[randomhash].[extension]')
->setFormTypeOptions(["attr" => ['accept' => 'image/*, application/pdf, application/vnd.ms-excel']])
->setRequired($pageName !== Crud::PAGE_EDIT)->hideOnIndex(),
BooleanField::new('ispublic', 'Publier ?')->setFormTypeOption('disabled', 'disabled')->onlyOnIndex(),
BooleanField::new('ispublic', 'Publier ?')->onlyWhenCreating(),
BooleanField::new('ispublic', 'Publier ?')->onlyWhenUpdating(),
TextField::new('status', 'Statut')->setColumns('col-sm-6 col-md-6 col-lg-5 col-xxl-3')->hideOnForm(),
];
}
public function persistEntity(EntityManagerInterface $entityManager, $entityInstance): void
{
$entityInstance->setStatus('VALIDATED');
$entityInstance->setUser($this->getUser());
$entityManager->persist($entityInstance);
$entityManager->flush();
}
#[Route('/show/ressource/detail/{id}', name: 'show_ressource_detail')]
public function showByRessourceDetail(Ressources $ressource, Request $request, EntityManagerInterface $entityManager): Response
{
return $this->render('ressource/detail.html.twig', [
'ressource'=>$ressource,
]);
}
#[Route('/list/ressource/index/', name: 'index_ressource')]
public function listRessources(Request $request, EntityManagerInterface $entityManager, PaginatorInterface $paginator): Response
{
//dd($request->request->get('selected_filter'));
// $date = new \DateTime();
$donnees = $entityManager->getRepository(Ressources::class)->getLastsRessources($request->request->get('selected_filter'), -1);
$ressources = $paginator->paginate(
$donnees,
$request->query->getInt('page', 1),
9
);
return $this->render('ressource/index.html.twig', [
'ressources'=>$ressources,
'selectedFilter'=>$request->request->get('selected_filter')
]);
}
public function validateDateDebut($value, ExecutionContextInterface $context): void
{
$entity = $context->getRoot()->getData();
$dateDebut = $entity->getDateDebut();
$dateExpiration = $entity->getDateExpiration();
if ($dateExpiration) {
if ($dateDebut >= $dateExpiration) {
$context
->buildViolation('La date de début doit être inférieure à la date d\'expiration.')
->atPath('date_debut')
->addViolation();
}
}
}
}