<?php
namespace App\Controller\Content\Page;
use App\Entity\Article;
use App\Entity\Page;
use App\Entity\PageContenu;
use App\Entity\Projet;
use App\Service\PageCSVService;
use Doctrine\ORM\QueryBuilder;
use Doctrine\Persistence\ManagerRegistry;
use EasyCorp\Bundle\EasyAdminBundle\Collection\FieldCollection;
use EasyCorp\Bundle\EasyAdminBundle\Collection\FilterCollection;
use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
use EasyCorp\Bundle\EasyAdminBundle\Config\Actions;
use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
use EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
use EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto;
use EasyCorp\Bundle\EasyAdminBundle\Dto\SearchDto;
use EasyCorp\Bundle\EasyAdminBundle\Factory\FilterFactory;
use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField;
use EasyCorp\Bundle\EasyAdminBundle\Field\BooleanField;
use EasyCorp\Bundle\EasyAdminBundle\Field\FormField;
use EasyCorp\Bundle\EasyAdminBundle\Field\IntegerField;
use EasyCorp\Bundle\EasyAdminBundle\Field\TextareaField;
use EasyCorp\Bundle\EasyAdminBundle\Field\TextEditorField;
use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
use EasyCorp\Bundle\EasyAdminBundle\Provider\AdminContextProvider;
use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator;
use Flasher\SweetAlert\Prime\SweetAlertFactory;
class PageCrudController extends AbstractCrudController
{
private PageCSVService $csvService;
private ManagerRegistry $manager;
private AdminContextProvider $adminContextProvider;
private SweetAlertFactory $flasher;
public function __construct(
PageCSVService $csvService,
ManagerRegistry $manager,
AdminContextProvider $adminContextProvider,
AdminUrlGenerator $adminUrlGenerator,
SweetAlertFactory $flasher
) {
$this->csvService = $csvService;
$this->manager = $manager;
$this->adminContextProvider = $adminContextProvider;
$this->adminUrlGenerator = $adminUrlGenerator;
$this->flasher = $flasher;
}
public static function getEntityFqcn(): string
{
return Page::class;
}
public function configureFields(string $pageName): iterable
{
return [
TextField::new('permalink')->setLabel('Id')->setSortable(false)->onlyOnIndex(),
AssociationField::new('parent')->onlyOnIndex()->setSortable(false)
->setColumns('col-sm-6 col-lg-4 col-xxl-4')
->setQueryBuilder(function (QueryBuilder $queryBuilder) {
$projet = $this->adminContextProvider->getContext()->getEntity()->getInstance()->getProjet();
$id = $this->adminContextProvider->getContext()->getEntity()->getInstance()->getId();
// $queryBuilder->where('entity.parent is null and entity.projet = :val and entity.id != :valid')->setParameter('val', $projet)->setParameter('valid', $id);
$queryBuilder->andWhere('entity.projet = :val and entity.id != :valid')->setParameter('val', $projet)->setParameter('valid', $id);
}),
FormField::addTab('Paramétrage'),
TextField::new('titreNav')->stripTags()
->setColumns('col-sm-6 col-lg-4 col-xxl-4')
->setLabel('Titre du menu')
->setSortable(false),
// FormField::addPanel(''),
TextField::new('titre')->stripTags()->setSortable(false)->setLabel('Titre (H1)')->setColumns('col-sm-6 col-lg-4 col-xxl-4'),
TextField::new('sousTitre')->hideOnIndex()->stripTags()->setSortable(false)->setLabel('Sous-titre (H2)')->setColumns('col-sm-6 col-lg-4 col-xxl-4'),
AssociationField::new('parent')->hideWhenCreating()->setSortable(false)->hideOnIndex()
->setColumns('col-sm-6 col-lg-4 col-xxl-4')
->setQueryBuilder(function (QueryBuilder $queryBuilder) {
$projet = $this->adminContextProvider->getContext()->getEntity()->getInstance()->getProjet();
$id = $this->adminContextProvider->getContext()->getEntity()->getInstance()->getId();
// $queryBuilder->where('entity.parent is null and entity.projet = :val and entity.id != :valid')->setParameter('val', $projet)->setParameter('valid', $id);
$queryBuilder->andWhere('entity.projet = :val and entity.id != :valid')->setParameter('val', $projet)->setParameter('valid', $id);
}),
AssociationField::new('parent')->onlyWhenCreating()->setSortable(false)
->setColumns('col-sm-6 col-lg-4 col-xxl-4')
->setQueryBuilder(function (QueryBuilder $queryBuilder) {
$projet = $this->manager->getRepository(Projet::class)->findOneBy(
['id' => $this->getUser()->getProjet()->getId()]
);
// $queryBuilder->where('entity.parent is null and entity.projet = :val')->setParameter('val', $projet);
$queryBuilder->andWhere('entity.projet = :val')->setParameter('val', $projet);
})->hideOnIndex(),
IntegerField::new('niveau')
->hideOnForm()
->setColumns('col-sm-6 col-lg-4 col-xxl-4'),
IntegerField::new('ordre')
->hideOnIndex()
->setColumns('col-sm-6 col-lg-4 col-xxl-4'),
// /[year]/[month]/[day]
// ->setUploadedFileNamePattern('[year]/[month]/[day]/[slug]-[contenthash].[extension]')
TextField::new('icon')->setColumns('col-sm-6 col-lg-4 col-xxl-4')
->addCssClass('mimagefilepreviewPageicon')
->addCssClass('width-95')
->hideOnIndex(),
TextareaField::new('keywords')
->setColumns('col-sm-6 col-lg-5 col-xxl-6')
->setLabel('Mots clés')
->hideOnIndex(),
BooleanField::new('actif')->setSortable(false)
->setColumns('col-sm-6 col-lg-4 col-xxl-4'),
AssociationField::new('formulaire')->setSortable(false)
->setQueryBuilder(function (QueryBuilder $queryBuilder) {
$projet = $this->manager->getRepository(Projet::class)->findOneBy(
['id' => $this->getUser()->getProjet()->getId()]
);
$queryBuilder
->andWhere('entity.projet = :val')
->setParameter('val', $projet);
})->setColumns('col-sm-6 col-lg-6 col-xxl-6'),
/* CollectionField::new('pageContenus')
->allowDelete(false)
->onlyWhenUpdating()
->setEntryIsComplex(true), */
AssociationField::new('combi')->setSortable(false)
->setQueryBuilder(function (QueryBuilder $queryBuilder) {
$projet = $this->manager->getRepository(Projet::class)->findOneBy(
['id' => $this->getUser()->getProjet()->getId()]
);
$queryBuilder
->andWhere('entity.projet = :val')
->setParameter('val', $projet);
})->setColumns('col-sm-6 col-lg-6 col-xxl-6'),
/* TextField::new('combi')->setSortable(false)
->setColumns('col-sm-6 col-lg-6 col-xxl-6'),
*/
FormField::addTab('Description'),
/* ImageField::new('image')
->setSortable(false)
->addCssClass('mimagefilepreview')
->setColumns('col-sm-6 col-lg-4 col-xxl-4')
->setUploadedFileNamePattern('[year]-[month]-[day]-[slug]-[contenthash].[extension]')
->setUploadDir('public/uploads/project/page/images')
->setBasePath('uploads/project/page/images')
->addJsFiles('js/imagepreview.js'), */
TextField::new('image')->setSortable(false)
->addCssClass('mimagefilepreview')
->addCssClass('width-95')
->setColumns('col-sm-6 col-lg-4 col-xxl-4')
->hideOnIndex()
// ->setTemplatePath('content/fields/imageftp.html.twig')
// ->addJsFiles('js/imagepreview.js')
// ->addJsFiles('js/imagepreview.js')
,
FormField::addPanel('')->addCssClass('col-sm-12 col-lg-8 col-xxl-8'),
TextEditorField::new('description')->setColumns('col-sm-12 col-lg-12 col-xxl-12')
->setTemplatePath('content/fields/description.html.twig')
->hideOnIndex(),
TextEditorField::new('descriptionCourte')->setColumns('col-sm-12 col-lg-12 col-xxl-12')
->setTemplatePath('content/fields/description.html.twig')
->hideOnIndex(),
TextEditorField::new('descriptionFin')->setColumns('col-sm-12 col-lg-12 col-xxl-12')
->setTemplatePath('content/fields/description.html.twig')
->hideOnIndex(),
FormField::addTab('Les paragraphes')->onlyWhenUpdating(),
// FormField::addPanel('Contenu')->addCssClass('col-sm-12 col-lg-12 col-xxl-12'),
FormField::addPanel('')->addCssClass('tablepageContentPanel')->addJsFiles('js/tablePageContent.js'),
AssociationField::new('projet')->setCssClass('d-none')
->setColumns('col-sm-6 col-lg-4 col-xxl-4')
->setQueryBuilder(function (QueryBuilder $queryBuilder) {
$queryBuilder->andWhere('entity.id = :val')->setParameter('val', $this->getUser()->getProjet()->getId());
})
->onlyWhenCreating(),
];
}
public function configureCrud(Crud $crud): Crud
{
return $crud
// the labels used to refer to this entity in titles, buttons, etc.
->overrideTemplate('crud/index', 'content/page/crud/index.html.twig')
->overrideTemplate('crud/edit', 'content/page/crud/edit.html.twig')
->overrideTemplate('crud/new', 'content/page/crud/new.html.twig')
->setSearchFields(['titre', 'parent.titre', 'titreNav', 'parent.titreNav'])
->showEntityActionsInlined()
->setEntityLabelInSingular('Page')
->setEntityLabelInPlural('Pages')
->renderContentMaximized()
->setPaginatorPageSize(100000);
//->setPaginatorPageSize(6)
;
}
public function configureActions(Actions $actions): Actions
{
$exportCSV = Action::new('exportCSV', 'Export CSV')
->setIcon('fa fa-file-csv')
->linkToCrudAction('export')
->addCssClass('btn btn-info')
->createAsGlobalAction();
$importCSV = Action::new('importCSV', 'Import CSV')
->setIcon('fa fa-file-import')
->setHtmlAttributes(['data-bs-toggle' => 'modal', 'data-bs-target' => '#pageModal'])
->linkToCrudAction('import')
->addCssClass('btn btn-secondary')
//data-bs-toggle="modal" data-bs-target="#pageModal"
->createAsGlobalAction();
$crudContenu = Action::new('Page Contenu')
->linkToCrudAction('toPageContentCrud')
->addCssClass('btn crud-action-content px-2 py-1 ')
->setIcon('fa fa-outdent');
$preview = Action::new('Aperçu')
->linkToRoute('app_content_preview', function (Page $page): array {
return [
'pageid' => $page->getId(),
'projectid' => $this->getUser()->getProjet()->getId(),
//'method' => $order->getUser()->getPreferredSendingMethod(),
];
})
->addCssClass('btn crud-action-preview px-2 py-1 ')
->setIcon('fa fa-binoculars')
->setHtmlAttributes(['target' => '_blank']);
return $actions
->add(Crud::PAGE_INDEX, $importCSV)
->add(Crud::PAGE_INDEX, $exportCSV)
//->add(Crud::PAGE_INDEX, $crudContenu)
->add(Crud::PAGE_INDEX, $preview)
->add(Crud::PAGE_EDIT, $preview)
->add(Crud::PAGE_NEW, Action::SAVE_AND_CONTINUE)
->update(Crud::PAGE_NEW, Action::SAVE_AND_CONTINUE, function (Action $action) {
return $action->setLabel('Créer et ajouter Contenu')->addCssClass('btn btn-info px-2 py-1 ');
})
/* ->update(Crud::PAGE_INDEX, Action::DETAIL, function (Action $action) {
return $action->setIcon('fa fa-info')->addCssClass('btn crud-action-details px-2 py-1 ');
}) */
->update(Crud::PAGE_INDEX, Action::EDIT, function (Action $action) {
return $action->setIcon('fa fa-pen')->addCssClass('btn crud-action-edit px-2 py-1 ');
})
->update(Crud::PAGE_INDEX, Action::DELETE, function (Action $action) {
return $action->setIcon('fa fa-trash')->addCssClass('btn px-2 py-1');
});
}
public function toPageContentCrud(AdminContext $context)
{
$url = $this->adminUrlGenerator
->setController(PageContenuCrudController::class)
->setAction(Action::INDEX)
->set('parentmpage', $context->getEntity()->getInstance()->getId())
->unset('entityId')
->generateUrl();
return $this->redirect($url);
}
public function createIndexQueryBuilder(SearchDto $searchDto, EntityDto $entityDto, FieldCollection $fields, FilterCollection $filters): QueryBuilder
{
$queryBuilder = parent::createIndexQueryBuilder($searchDto, $entityDto, $fields, $filters);
$projet = $this->manager->getRepository(Projet::class)->findOneBy(
['id' => $this->getUser()->getProjet()->getId()]
);
if ($projet != null) {
if (0 === count($searchDto->getSort())) {
$queryBuilder
->andWhere('entity.projet = :val')->setParameter('val', $projet)
->addOrderBy('entity.parent', 'ASC')
->addOrderBy('entity.ordre', 'ASC');
}
} else {
if (0 === count($searchDto->getSort())) {
$queryBuilder
->addOrderBy('entity.ordre', 'ASC');
}
}
return $queryBuilder;
}
public function export(AdminContext $context)
{
$fields = FieldCollection::new($this->configureFields(Crud::PAGE_DETAIL));
$filters = $this->get(FilterFactory::class)->create($context->getCrud()->getFiltersConfig(), $fields, $context->getEntity());
$orders = $this->createIndexQueryBuilder($context->getSearch(), $context->getEntity(), $fields, $filters)
->getQuery()
->getResult();
$data = [];
foreach ($orders as $order) {
$data[] = $order->getExportData();
}
$projet = $this->manager->getRepository(Projet::class)->findOneBy(
['id' => $this->getUser()->getProjet()->getId()]
);
$res = $this->csvService->exportPage($projet);
if ($res == 'probleme ftp') {
$this->flasher->addError('Probleme FTP verifier les parametrages');
} else if ($res == 'ok') {
$this->flasher->addSuccess('La liste des pages du projet ' . $projet->getProjet() . ' a été exportée avec succès');
} else {
$this->flasher->addError('Quelque chose s\'est mal passé, Essayez de fermer les fichiers CSV ouverts');
}
$url = $this->adminUrlGenerator
->setController(PageCrudController::class)
->setAction(Action::INDEX)
->set('projet', $projet->getId())
->set('nomprojet', $projet->getProjet())
->generateUrl();
return $this->redirect($url);
}
public function import(AdminContext $context)
{
$fileToUpload = $this->adminContextProvider->getContext()->getRequest()->request->get('mfileToUpload');
$nameFileToUpload = $this->adminContextProvider->getContext()->getRequest()->request->get('mfileNameToUpload');
$projet = $this->manager->getRepository(Projet::class)->findOneBy(
['id' => $this->getUser()->getProjet()->getId()]
);
//var_dump($this->csvService->importPage('../csv/2022-05-18-16-49 devil app pro/page.csv', $projet));
$resultImport = $this->csvService->importPage($fileToUpload, $nameFileToUpload, $projet->getId());
if ($resultImport) {
$this->flasher->addSuccess('La liste des pages du projet ' . $projet . ' a été importée avec succès');
} else {
$this->flasher->addError('vous avez choisi le mauvais fichier');
}
$url = $this->adminUrlGenerator
->setController(PageCrudController::class)
->setAction(Action::INDEX)
->set('projet', $projet->getId())
->set('nomprojet', $projet)
->generateUrl();
return $this->redirect($url);
}
public function preview(AdminContext $context)
{
$projet = $this->manager->getRepository(Projet::class)->findOneBy(
['id' => $this->getUser()->getProjet()->getId()]
);
$url = $this->adminUrlGenerator
->setController(PageCrudController::class)
->setAction(Action::INDEX)
->set('projet', $projet->getId())
->set('nomprojet', $projet)
->generateUrl();
return $this->redirect($url);
}
public function ajouterContenu(AdminContext $context)
{
$idPage = $context->getEntity()->getInstance()->getId();
$titre = $context->getRequest()->get('titre');
$ordre = $context->getRequest()->get('ordre');
$objet = $context->getRequest()->get('objet');
$paragraph = $context->getRequest()->get('paragraph');
$position = $context->getRequest()->get('position');
// $image = $context->getRequest()->request->get('image');
$image = $context->getRequest()->get('imageContenu');
$file = $context->getRequest()->get('mfileToUpload');
$createBtn = $context->getRequest()->get('checkBtn');
$page = $this->manager->getRepository(Page::class)->findOneBy(['id' => $idPage]);
$contenu = new PageContenu();
//$contenu = new PageContenu();
if ($titre != '') {
$contenu->setTitre($titre);
}
if ($image != '') {
$contenu->setImage($image);
}
if ($ordre != '' && $ordre != 0) {
$contenu->setOrdre($ordre);
}
if ($objet != '' && $objet != 0) {
$contenu->setObjet($objet);
}
if ($paragraph != '') {
$contenu->setParagraph(str_replace([
'<div>', '</div>',
'<h1>', '</h1>',
'<h2>', '</h2>',
'<h3>', '</h3>',
'<h4>', '</h4>',
'<h5>', '</h5>',
'<h6>', '</h6>',
'<p>', '</p>',
'<pre>', '</pre>',
'<blockquote>', '</blockquote>'
], "", $paragraph));
}
if ($position != '') {
$contenu->setPosition($position);
} else {
$contenu->setPosition('Centre');
}
if ($createBtn) {
$btnLabel = $context->getRequest()->get('btnLabel');
$btnType = $context->getRequest()->get('btnType');
$btnValue = '';
if ($btnType == 'Page') {
$btnValue = $context->getRequest()->get('selectPage');
$ctaPage = $this->manager->getRepository(Page::class)->findOneBy(['id' => $btnValue]);
if ($ctaPage->getPermalink() != '') {
$btnValue = $ctaPage->getPermalink();
} else {
$btnValue = $ctaPage->getId();
}
} else if ($btnType == 'Article') {
$btnValue = $context->getRequest()->get('selectArticle');
$ctaArticle = $this->manager->getRepository(Article::class)->findOneBy(['id' => $btnValue]);
if ($ctaArticle->getPermalink() != '') {
$btnValue = $ctaArticle->getPermalink();
} else {
$btnValue = $ctaArticle->getId();
}
} else if ($btnType == 'Form') {
$btnValue = $context->getRequest()->get('selectForm');
} else if ($btnType == 'Lien') {
$btnValue = $context->getRequest()->get('extrnLink');
}
$contenu->setButtonLabel($btnLabel);
$contenu->setButtonType($btnType);
$contenu->setButtonValue($btnValue);
}
$contenu->setPage($page);
if ($contenu->getIdImport() == null || $contenu->getIdImport() == '') {
$contenu->setIdImport(date('Y-m-d-H-i-s') . '-page-contenu-' . $contenu->getId() . "-" . $contenu->getPage()->getId() . $contenu->getPage()->getProjet()->getId());
}
$contenu->setIdImportPage($contenu->getPage()->getIdImport());
$entityManager = $this->manager->getManager();
$entityManager->persist($contenu);
$entityManager->flush();
$url = $this->adminUrlGenerator
->setController(PageCrudController::class)
->setAction(Action::EDIT)
->set('tabactive', 'contenu')
->generateUrl();
return $this->redirect($url);
}
public function editContenu(AdminContext $context)
{
$idPage = $context->getEntity()->getInstance()->getId();
$idContenu = $context->getRequest()->get('contentid');
$titre = $context->getRequest()->get('titre');
$ordre = $context->getRequest()->get('ordre');
$objet = $context->getRequest()->get('objet');
$paragraph = $context->getRequest()->get('paragraph');
$pos = 'position' . $idContenu;
$position = $context->getRequest()->get($pos);
$image = $context->getRequest()->get('image');
$file = $context->getRequest()->get('mfileToUpload' . $idContenu);
// var_dump('mfileToUpload' . $file);
$image = $context->getRequest()->get('imageContenu');
$createBtn = $context->getRequest()->get('checkBtn');
$page = $this->manager->getRepository(Page::class)->findOneBy(['id' => $idPage]);
$contenu = $this->manager->getRepository(PageContenu::class)->findOneBy(['id' => $idContenu]);
//$contenu = new PageContenu();
if ($titre != '') {
$contenu->setTitre($titre);
} else {
$contenu->setTitre(null);
}
if ($ordre != '' && $ordre != 0) {
$contenu->setOrdre($ordre);
} else {
$contenu->setOrdre(null);
}
if ($objet != '' && $objet != 0) {
$contenu->setObjet($objet);
} else {
$contenu->setObjet(null);
}
if ($paragraph != '') {
$contenu->setParagraph(str_replace([
'<div>', '</div>',
'<h1>', '</h1>',
'<h2>', '</h2>',
'<h3>', '</h3>',
'<h4>', '</h4>',
'<h5>', '</h5>',
'<h6>', '</h6>',
'<p>', '</p>',
'<pre>', '</pre>',
'<blockquote>', '</blockquote>'
], "", $paragraph));
} else {
$contenu->setParagraph(null);
}
if ($position != '') {
$contenu->setPosition($position);
} else {
$contenu->setPosition('Centre');
}
if ($createBtn) {
$btnLabel = $context->getRequest()->get('btnLabel');
$btnType = $context->getRequest()->get('btnType' . $idContenu);
$btnValue = '';
if ($btnType == 'Page') {
$btnValue = $context->getRequest()->get('selectPage');
$ctaPage = $this->manager->getRepository(Page::class)->findOneBy(['id' => $btnValue]);
if ($ctaPage->getPermalink() != '') {
$btnValue = $ctaPage->getPermalink();
} else {
$btnValue = $ctaPage->getId();
}
} else if ($btnType == 'Article') {
$btnValue = $context->getRequest()->get('selectArticle');
$ctaArticle = $this->manager->getRepository(Article::class)->findOneBy(['id' => $btnValue]);
if ($ctaArticle->getPermalink() != '') {
$btnValue = $ctaArticle->getPermalink();
} else {
$btnValue = $ctaArticle->getId();
}
} else if ($btnType == 'Form') {
$btnValue = $context->getRequest()->get('selectForm');
} else if ($btnType == 'Lien') {
$btnValue = $context->getRequest()->get('extrnLink');
}
$contenu->setButtonLabel($btnLabel);
$contenu->setButtonType($btnType);
$contenu->setButtonValue($btnValue);
} else {
$contenu->setButtonLabel(null);
$contenu->setButtonType(null);
$contenu->setButtonValue(null);
}
$contenu->setPage($page);
if ($contenu->getIdImport() == null || $contenu->getIdImport() == '') {
$contenu->setIdImport(date('Y-m-d-H-i-s') . '-page-contenu-' . $contenu->getId() . "-" . $contenu->getPage()->getId() . $contenu->getPage()->getProjet()->getId());
}
$contenu->setIdImportPage($contenu->getPage()->getIdImport());
if ($image != "") {
/* $time = new \DateTime();
$day = $time->format('Y-m-d');
$hour = $time->format('H-i-s');
$path = 'uploads/project/pages-contenu/images/' . $day . "-" . $hour . "-" . $image;
$contenu->setImage($day . "-" . $hour . "-" . $image);
file_put_contents($path, file_get_contents($file)); */
$contenu->setImage($image);
} else {
$contenu->setImage(null);
}
$entityManager = $this->manager->getManager();
$entityManager->flush();
$url = $this->adminUrlGenerator
->setController(PageCrudController::class)
->setAction(Action::EDIT)
->set('tabactive', 'contenu')
->generateUrl();
//var_dump($context->getRequest()->get('mfileToUpload' . $idContenu));
//contentid
return $this->redirect($url);
}
public function supprimerContenu(AdminContext $context)
{
$entityManager = $this->manager->getManager();
$idPageContent = $context->getRequest()->get('contentId');
$pageContent = $this->manager->getRepository(PageContenu::class)->findOneBy(['id' => $idPageContent]);
$entityManager->remove($pageContent);
$entityManager->flush();
$url = $this->adminUrlGenerator
->setController(PageCrudController::class)
->setAction(Action::EDIT)
->generateUrl();
return $this->redirect($url);
}
}