<?php
namespace App\Controller\Admin;
use Symfony\Contracts\Translation\TranslatorInterface;
use App\Entity\Locale;
use App\Entity\Article\Article;
use App\Entity\Article\ArticleTranslation;
use Doctrine\ORM\EntityManagerInterface;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
use EasyCorp\Bundle\EasyAdminBundle\Config\Filters;
use EasyCorp\Bundle\EasyAdminBundle\Filter\ChoiceFilter;
use EasyCorp\Bundle\EasyAdminBundle\Filter\DateTimeFilter;
use EasyCorp\Bundle\EasyAdminBundle\Config\Assets;
use EasyCorp\Bundle\EasyAdminBundle\Config\Actions;
use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
use EasyCorp\Bundle\EasyAdminBundle\Field\IdField;
use EasyCorp\Bundle\EasyAdminBundle\Field\ChoiceField;
use EasyCorp\Bundle\EasyAdminBundle\Field\DateField;
use EasyCorp\Bundle\EasyAdminBundle\Field\DateTimeField;
use EasyCorp\Bundle\EasyAdminBundle\Field\CollectionField;
use EasyCorp\Bundle\EasyAdminBundle\Field\ImageField;
use App\Form\Article\ArticleTranslationType;
use App\Field\VichImageField;
class ArticleCrudController extends AbstractCrudController
{
/** @var array */
private $pages = array(
'admin.page.about' => 'about',
'admin.page.service' => 'service',
);
/** @var TranslatorInterface */
private $translator;
/**
* @param TranslatorInterface $translator
*/
public function __construct(TranslatorInterface $translator) {
$this->translator = $translator;
}
public static function getEntityFqcn(): string
{
return Article::class;
}
public function configureCrud(Crud $crud): Crud
{
return $crud
->setEntityLabelInSingular('admin.article.label.singular')
->setEntityLabelInPlural('admin.article.label.plural')
->setEntityPermission('ROLE_ADMIN')
->setPageTitle('index', 'admin.title.index')
->setPageTitle('new', 'admin.title.new')
->setPageTitle('detail', 'admin.title.detail')
->setPageTitle('edit', 'admin.title.edit')
->setHelp('index', $this->translator->trans('admin.article.help.index'))
->setHelp('new', $this->translator->trans('admin.article.help.new'))
->setHelp('detail', $this->translator->trans('admin.article.help.detail'))
->setHelp('edit', $this->translator->trans('admin.article.help.edit'))
->setSearchFields(['page', 'articleTranslations.title', 'articleTranslations.text', 'articleTranslations.description'])
->setDefaultSort(['id' => 'ASC'])
->setPaginatorPageSize(10)
->setPaginatorRangeSize(3)
->addFormTheme('@FOSCKEditor/Form/ckeditor_widget.html.twig')
;
}
public function configureActions(Actions $actions): Actions
{
return $actions
// PAGE_INDEX
->add(Crud::PAGE_INDEX, Action::DETAIL)
->update(Crud::PAGE_INDEX, Action::NEW, function (Action $action) {
return $action->setIcon('fas fa-user-plus')->addCssClass('btn btn-sm btn-primary');
})
->update(Crud::PAGE_INDEX, Action::DETAIL, function (Action $action) {
return $action->setIcon('far fa-eye')->addCssClass('btn btn-sm btn-warning')->setLabel(false);
})
->update(Crud::PAGE_INDEX, Action::EDIT, function (Action $action) {
return $action->setIcon('far fa-edit')->addCssClass('btn btn-sm btn-success')->setLabel(false);
})
->update(Crud::PAGE_INDEX, Action::DELETE, function (Action $action) {
return $action->setIcon('far fa-trash-alt')->setCssClass('btn btn-sm btn-danger font-weight-bolder action-delete ')->setLabel(false);
})
// PAGE_NEW
->update(Crud::PAGE_NEW, Action::SAVE_AND_RETURN, function (Action $action) {
return $action->setIcon('fas fa-plus')->addCssClass('btn btn-sm btn-success');
})
->update(Crud::PAGE_NEW, Action::SAVE_AND_ADD_ANOTHER, function (Action $action) {
return $action->setIcon('fas fa-plus-circle')->setCssClass('btn btn-sm btn-primary');
})
->add(Crud::PAGE_NEW, Action::INDEX)->update(Crud::PAGE_NEW, Action::INDEX, function (Action $action) {
return $action->setIcon('fas fa-list')->setCssClass('btn btn-sm btn-warning');
})
// PAGE_EDIT
->remove(Crud::PAGE_EDIT, Action::SAVE_AND_CONTINUE)
->update(Crud::PAGE_EDIT, Action::SAVE_AND_RETURN, function (Action $action) {
return $action->setIcon('fas fa-edit')->addCssClass('btn btn-sm btn-success');
})
->add(Crud::PAGE_EDIT, Action::DETAIL)->update(Crud::PAGE_EDIT, Action::DETAIL, function (Action $action) {
return $action->setIcon('far fa-eye')->setCssClass('btn btn-sm btn-primary font-weight-bolder action-detail ss');
})
->add(Crud::PAGE_EDIT, Action::INDEX)->update(Crud::PAGE_EDIT, Action::INDEX, function (Action $action) {
return $action->setIcon('fas fa-list')->addCssClass('btn btn-sm btn-warning');
})
// PAGE_DETAIL
->update(Crud::PAGE_DETAIL, Action::EDIT, function (Action $action) {
return $action->setIcon('fas fa-edit')->addCssClass('btn btn-sm btn-success');
})
->update(Crud::PAGE_DETAIL, Action::DELETE, function (Action $action) {
return $action->setIcon('far fa-trash-alt')->setCssClass('btn btn-sm btn-danger font-weight-bolder action-delete ');
})
->update(Crud::PAGE_DETAIL, Action::INDEX, function (Action $action) {
return $action->setIcon('fas fa-list')->setCssClass('btn btn-sm btn-warning');
})
// BATCH ACTIONS
->update(Crud::PAGE_INDEX, Action::BATCH_DELETE, function (Action $action) {
return $action->setIcon('far fa-trash-alt')->setCssClass('btn btn-sm btn-danger font-weight-bolder action-batchDelete ss');
})
// Reorder actions
->reorder(Crud::PAGE_DETAIL, [Action::INDEX, Action::DELETE, Action::EDIT])
;
}
public function configureFields(string $pageName): iterable
{
$imagesDirectory = $this->getParameter('article_images_directory');
return [
IdField::new('id', 'admin.field.id')->hideOnForm(),
ChoiceField::new('page', 'admin.page.title')->setChoices($this->pages),
DateField::new('date', 'admin.field.date')->setFormat('dd/MM/yyyy'),
ImageField::new('image.name')
->setLabel('admin.field.image')
->setBasePath('/' . $imagesDirectory)
->hideOnForm(),
VichImageField::new('imageFile', 'admin.field.image')
->setDownloadUri('public/' . $imagesDirectory)
->setImageUri($imagesDirectory)
->onlyOnForms(),
CollectionField::new('articleTranslations', 'admin.field.languages')
->setTemplatePath('fields/article_translations.html.twig')
->onlyOnDetail(),
CollectionField::new('articleTranslations', 'admin.field.title')
->onlyOnIndex(),
CollectionField::new('articleTranslations', 'admin.field.languages')
->showEntryLabel(false)
->allowAdd(false)
->allowDelete(false)
->setEntryIsComplex(true)
->setEntryType(ArticleTranslationType::class)
->onlyOnForms(),
DateTimeField::new('createdAt', 'admin.field.created_at')->setFormat('dd/MM/yyyy HH:mm')->onlyOnDetail(),
DateTimeField::new('updatedAt', 'admin.field.updated_at')->setFormat('dd/MM/yyyy HH:mm')->hideOnForm(),
];
}
public function configureFilters(Filters $filters): Filters
{
return $filters
->add(DateTimeFilter::new('date', 'admin.field.date'))
->add(ChoiceFilter::new('page', 'admin.page.title')->setChoices($this->pages))
->add(DateTimeFilter::new('createdAt', 'admin.field.created_at'))
;
}
public function configureAssets(Assets $assets): Assets
{
return $assets->addJsFile('admin/assets/js/enable_locale.js');
}
public function createEntity(string $entityFqcn)
{
$article = new Article();
// Set the user who will create this entity
$article->setUser($this->getUser());
// Set translation for this entity
$locales = $this->getDoctrine()->getRepository(Locale::class)->findBy([], ['code' => 'ASC']);
foreach ($locales as $locale) {
$articleTranslation = new ArticleTranslation();
$articleTranslation->setLocale($locale);
$article->addArticleTranslation($articleTranslation);
}
return $article;
}
public function updateEntity(EntityManagerInterface $entityManager, $entityInstance): void
{
$entityInstance->setUpdatedAt(new \DateTimeImmutable());
parent::updateEntity($entityManager, $entityInstance);
}
}