Bläddra i källkod

Merge branch 'develop'

develop
Guillaume 2 år sedan
förälder
incheckning
304b1eacd8
36 ändrade filer med 559 tillägg och 82 borttagningar
  1. +6
    -2
      Builder/User/UserBuilder.php
  2. +5
    -0
      Component/DateComponent.php
  3. +8
    -0
      Container/File/FileContainer.php
  4. +7
    -0
      Container/Newsletter/NewsletterContainer.php
  5. +6
    -0
      Container/Reminder/ReminderContainer.php
  6. +7
    -0
      Container/Setting/SiteSettingContainer.php
  7. +6
    -0
      Container/Site/NewsContainer.php
  8. +6
    -0
      Container/Site/PageContainer.php
  9. +5
    -0
      Container/Site/SiteContainer.php
  10. +7
    -0
      Container/Ticket/TicketContainer.php
  11. +5
    -0
      Container/Ticket/TicketMessageContainer.php
  12. +5
    -0
      Container/User/GroupUserContainer.php
  13. +5
    -0
      Container/User/UserContainer.php
  14. +24
    -1
      Controller/AbstractAdminController.php
  15. +49
    -49
      Controller/ControllerTrait.php
  16. +120
    -0
      Controller/User/UserAdminController.php
  17. +88
    -0
      Definition/ApplicationDefinition.php
  18. +2
    -2
      Doctrine/Extension/BlameableTrait.php
  19. +3
    -2
      Factory/File/FileFactory.php
  20. +3
    -2
      Factory/Newsletter/NewsletterFactory.php
  21. +3
    -3
      Factory/Reminder/ReminderFactory.php
  22. +3
    -2
      Factory/Setting/SiteSettingFactory.php
  23. +3
    -3
      Factory/Site/NewsFactory.php
  24. +3
    -2
      Factory/Site/PageFactory.php
  25. +3
    -2
      Factory/Site/SiteFactory.php
  26. +3
    -2
      Factory/Ticket/TicketFactory.php
  27. +3
    -2
      Factory/Ticket/TicketMessageFactory.php
  28. +3
    -2
      Factory/User/GroupUserFactory.php
  29. +4
    -2
      Factory/User/UserFactory.php
  30. +65
    -0
      Form/User/ConfirmDeleteUserFormType.php
  31. +2
    -1
      Model/Ticket/TicketModel.php
  32. +1
    -1
      Model/User/UserModel.php
  33. +15
    -0
      Repository/AbstractRepositoryQuery.php
  34. +7
    -0
      Resources/translations/admin.fr.yaml
  35. +74
    -0
      Resources/views/adminlte/crud/delete.html.twig
  36. +0
    -2
      Resources/views/adminlte/crud/form_theme.html.twig

+ 6
- 2
Builder/User/UserBuilder.php Visa fil

namespace Lc\SovBundle\Builder\User; namespace Lc\SovBundle\Builder\User;


use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityManagerInterface;
use Lc\CaracoleBundle\Model\Address\AddressInterface;
use Lc\SovBundle\Doctrine\EntityInterface; use Lc\SovBundle\Doctrine\EntityInterface;
use Lc\SovBundle\Doctrine\Extension\BlameableInterface; use Lc\SovBundle\Doctrine\Extension\BlameableInterface;
use Lc\SovBundle\Factory\User\UserFactory; use Lc\SovBundle\Factory\User\UserFactory;
use Lc\SovBundle\Model\Newsletter\NewsletterInterface; use Lc\SovBundle\Model\Newsletter\NewsletterInterface;
use Lc\SovBundle\Model\Ticket\TicketInterface;
use Lc\SovBundle\Model\User\UserInterface; use Lc\SovBundle\Model\User\UserInterface;
use Lc\SovBundle\Repository\RepositoryQueryInterface;
use Lc\SovBundle\Repository\User\UserStore; use Lc\SovBundle\Repository\User\UserStore;
use Lc\SovBundle\Solver\User\UserSolver; use Lc\SovBundle\Solver\User\UserSolver;


} }




public function create( string $email, string $password, array $roles=[])
public function create(string $email, string $password, array $roles = [])
{ {
$user = $this->userFactory->create(); $user = $this->userFactory->create();
$user->setEmail($email); $user->setEmail($email);
} }
} }


public function setLastLogin(?UserInterface $user){
public function setLastLogin(?UserInterface $user)
{
if ($user instanceof UserInterface) { if ($user instanceof UserInterface) {
$user->setLastLogin(new \DateTime()); $user->setLastLogin(new \DateTime());
$this->entityManager->update($user); $this->entityManager->update($user);

+ 5
- 0
Component/DateComponent.php Visa fil

return $hour ; return $hour ;
} }


public function getTotalMinutes(\DateTimeInterface $time): int
{
return (int) $time->format('H') * 60 + (int) $time->format('i');
}

} }

+ 8
- 0
Container/File/FileContainer.php Visa fil



namespace Lc\SovBundle\Container\File; namespace Lc\SovBundle\Container\File;


use App\Entity\File\File;
use Lc\SovBundle\Factory\File\FileFactory; use Lc\SovBundle\Factory\File\FileFactory;
use Lc\SovBundle\Model\File\FileInterface;
use Lc\SovBundle\Repository\File\FileRepositoryQuery; use Lc\SovBundle\Repository\File\FileRepositoryQuery;
use Lc\SovBundle\Repository\File\FileStore; use Lc\SovBundle\Repository\File\FileStore;


$this->store = $store; $this->store = $store;
} }


public static function getEntityFqcn()
{
return File::class;
}

public function getFactory(): FileFactory public function getFactory(): FileFactory
{ {
return $this->factory; return $this->factory;
{ {
return $this->store; return $this->store;
} }

} }

+ 7
- 0
Container/Newsletter/NewsletterContainer.php Visa fil



namespace Lc\SovBundle\Container\Newsletter; namespace Lc\SovBundle\Container\Newsletter;


use App\Entity\Newsletter\Newsletter;
use Lc\SovBundle\Definition\Field\Newsletter\NewsletterFieldDefinition; use Lc\SovBundle\Definition\Field\Newsletter\NewsletterFieldDefinition;
use Lc\SovBundle\Factory\Newsletter\NewsletterFactory; use Lc\SovBundle\Factory\Newsletter\NewsletterFactory;
use Lc\SovBundle\Repository\Newsletter\NewsletterRepositoryQuery; use Lc\SovBundle\Repository\Newsletter\NewsletterRepositoryQuery;
$this->fieldDefinition = $fieldDefinition; $this->fieldDefinition = $fieldDefinition;
} }


public static function getEntityFqcn()
{
return Newsletter::class;
}


public function getFactory(): NewsletterFactory public function getFactory(): NewsletterFactory
{ {
return $this->factory; return $this->factory;

+ 6
- 0
Container/Reminder/ReminderContainer.php Visa fil



namespace Lc\SovBundle\Container\Reminder; namespace Lc\SovBundle\Container\Reminder;


use App\Entity\Reminder\Reminder;
use Lc\SovBundle\Factory\Reminder\ReminderFactory; use Lc\SovBundle\Factory\Reminder\ReminderFactory;
use Lc\SovBundle\Repository\Reminder\ReminderRepositoryQuery; use Lc\SovBundle\Repository\Reminder\ReminderRepositoryQuery;
use Lc\SovBundle\Repository\Reminder\ReminderStore; use Lc\SovBundle\Repository\Reminder\ReminderStore;
$this->store = $store; $this->store = $store;
} }


public static function getEntityFqcn()
{
return Reminder::class;
}

public function getFactory(): ReminderFactory public function getFactory(): ReminderFactory
{ {
return $this->factory; return $this->factory;

+ 7
- 0
Container/Setting/SiteSettingContainer.php Visa fil



namespace Lc\SovBundle\Container\Setting; namespace Lc\SovBundle\Container\Setting;


use App\Entity\Setting\SiteSetting;
use Lc\SovBundle\Definition\SiteSettingDefinition; use Lc\SovBundle\Definition\SiteSettingDefinition;
use Lc\SovBundle\Factory\Setting\SiteSettingFactory; use Lc\SovBundle\Factory\Setting\SiteSettingFactory;
use Lc\SovBundle\Repository\Setting\SiteSettingRepositoryQuery; use Lc\SovBundle\Repository\Setting\SiteSettingRepositoryQuery;
$this->settingSolver = $settingSolver; $this->settingSolver = $settingSolver;
} }



public static function getEntityFqcn()
{
return SiteSetting::class;
}

public function getFactory(): SiteSettingFactory public function getFactory(): SiteSettingFactory
{ {
return $this->factory; return $this->factory;

+ 6
- 0
Container/Site/NewsContainer.php Visa fil



namespace Lc\SovBundle\Container\Site; namespace Lc\SovBundle\Container\Site;


use App\Entity\Site\News;
use Lc\SovBundle\Definition\Field\Site\NewsFieldDefinition; use Lc\SovBundle\Definition\Field\Site\NewsFieldDefinition;
use Lc\SovBundle\Factory\Site\NewsFactory; use Lc\SovBundle\Factory\Site\NewsFactory;
use Lc\SovBundle\Repository\Site\NewsRepositoryQuery; use Lc\SovBundle\Repository\Site\NewsRepositoryQuery;
$this->fieldDefinition = $fieldDefinition; $this->fieldDefinition = $fieldDefinition;
} }



public static function getEntityFqcn()
{
return News::class;
}
public function getFactory(): NewsFactory public function getFactory(): NewsFactory
{ {
return $this->factory; return $this->factory;

+ 6
- 0
Container/Site/PageContainer.php Visa fil



namespace Lc\SovBundle\Container\Site; namespace Lc\SovBundle\Container\Site;


use App\Entity\Site\Page;
use Lc\SovBundle\Definition\Field\Site\PageFieldDefinition; use Lc\SovBundle\Definition\Field\Site\PageFieldDefinition;
use Lc\SovBundle\Factory\Site\PageFactory; use Lc\SovBundle\Factory\Site\PageFactory;
use Lc\SovBundle\Repository\Site\PageRepositoryQuery; use Lc\SovBundle\Repository\Site\PageRepositoryQuery;
$this->fieldDefinition = $fieldDefinition; $this->fieldDefinition = $fieldDefinition;
} }


public static function getEntityFqcn()
{
return Page::class;
}

public function getFactory(): PageFactory public function getFactory(): PageFactory
{ {
return $this->factory; return $this->factory;

+ 5
- 0
Container/Site/SiteContainer.php Visa fil



namespace Lc\SovBundle\Container\Site; namespace Lc\SovBundle\Container\Site;


use App\Entity\Site\Site;
use Lc\SovBundle\Factory\Site\SiteFactory; use Lc\SovBundle\Factory\Site\SiteFactory;
use Lc\SovBundle\Repository\Site\SiteRepositoryQuery; use Lc\SovBundle\Repository\Site\SiteRepositoryQuery;
use Lc\SovBundle\Repository\Site\SiteStore; use Lc\SovBundle\Repository\Site\SiteStore;
$this->store = $store; $this->store = $store;
} }


public static function getEntityFqcn()
{
return Site::class;
}
public function getFactory(): SiteFactory public function getFactory(): SiteFactory
{ {
return $this->factory; return $this->factory;

+ 7
- 0
Container/Ticket/TicketContainer.php Visa fil



namespace Lc\SovBundle\Container\Ticket; namespace Lc\SovBundle\Container\Ticket;


use App\Entity\Ticket\Ticket;
use Lc\SovBundle\Builder\Ticket\TicketBuilder; use Lc\SovBundle\Builder\Ticket\TicketBuilder;
use Lc\SovBundle\Definition\Field\Ticket\TicketFieldDefinition; use Lc\SovBundle\Definition\Field\Ticket\TicketFieldDefinition;
use Lc\SovBundle\Factory\Ticket\TicketFactory; use Lc\SovBundle\Factory\Ticket\TicketFactory;
$this->fieldDefinition = $fieldDefinition; $this->fieldDefinition = $fieldDefinition;
} }



public static function getEntityFqcn()
{
return Ticket::class;
}

public function getFactory(): TicketFactory public function getFactory(): TicketFactory
{ {
return $this->factory; return $this->factory;

+ 5
- 0
Container/Ticket/TicketMessageContainer.php Visa fil



namespace Lc\SovBundle\Container\Ticket; namespace Lc\SovBundle\Container\Ticket;


use App\Entity\Ticket\TicketMessage;
use Lc\SovBundle\Builder\Ticket\TicketMessageBuilder; use Lc\SovBundle\Builder\Ticket\TicketMessageBuilder;
use Lc\SovBundle\Factory\Ticket\TicketMessageFactory; use Lc\SovBundle\Factory\Ticket\TicketMessageFactory;
use Lc\SovBundle\Repository\Ticket\TicketMessageRepositoryQuery; use Lc\SovBundle\Repository\Ticket\TicketMessageRepositoryQuery;
$this->builder = $builder; $this->builder = $builder;
} }


public static function getEntityFqcn()
{
return TicketMessage::class;
}
public function getFactory(): TicketMessageFactory public function getFactory(): TicketMessageFactory
{ {
return $this->factory; return $this->factory;

+ 5
- 0
Container/User/GroupUserContainer.php Visa fil



namespace Lc\SovBundle\Container\User; namespace Lc\SovBundle\Container\User;


use App\Entity\User\GroupUser;
use Lc\SovBundle\Factory\User\GroupUserFactory; use Lc\SovBundle\Factory\User\GroupUserFactory;
use Lc\SovBundle\Repository\User\GroupUserRepositoryQuery; use Lc\SovBundle\Repository\User\GroupUserRepositoryQuery;
use Lc\SovBundle\Repository\User\GroupUserStore; use Lc\SovBundle\Repository\User\GroupUserStore;
$this->store = $store; $this->store = $store;
} }


public static function getEntityFqcn()
{
return GroupUser::class;
}
public function getFactory(): GroupUserFactory public function getFactory(): GroupUserFactory
{ {
return $this->factory; return $this->factory;

+ 5
- 0
Container/User/UserContainer.php Visa fil



namespace Lc\SovBundle\Container\User; namespace Lc\SovBundle\Container\User;


use App\Entity\User\User;
use Lc\SovBundle\Builder\User\UserBuilder; use Lc\SovBundle\Builder\User\UserBuilder;
use Lc\SovBundle\Definition\Field\User\UserFieldDefinition; use Lc\SovBundle\Definition\Field\User\UserFieldDefinition;
use Lc\SovBundle\Definition\RolesDefinitionInterface; use Lc\SovBundle\Definition\RolesDefinitionInterface;
$this->fieldDefinition = $fieldDefinition; $this->fieldDefinition = $fieldDefinition;
$this->rolesDefinition = $rolesDefinition; $this->rolesDefinition = $rolesDefinition;
} }
public static function getEntityFqcn()
{
return User::class;
}


public function getFactory(): UserFactory public function getFactory(): UserFactory
{ {

+ 24
- 1
Controller/AbstractAdminController.php Visa fil

use Symfony\Component\Form\FormInterface; use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;


abstract class AbstractAdminController extends EaAbstractCrudController abstract class AbstractAdminController extends EaAbstractCrudController
{ {
$filteredValue = ['value' => $context->getRequest()->query->get('q')]; $filteredValue = ['value' => $context->getRequest()->query->get('q')];
$filterManager->applyFilter($repositoryQuery, $field, $filteredValue); $filterManager->applyFilter($repositoryQuery, $field, $filteredValue);
$repositoryQuery->select('.' . $autocompleteContext['propertyName']); $repositoryQuery->select('.' . $autocompleteContext['propertyName']);
//dump($repositoryQuery->getQueryBuilder()->getQuery()->getDQL());


$responses = array(); $responses = array();
foreach ($repositoryQuery->find() as $result) { foreach ($repositoryQuery->find() as $result) {
return $this->createForm($class, $data, $options); return $this->createForm($class, $data, $options);
} }


public function eaBeforeCrudActionEventDelete(AdminContext $context): ?Response
{
$event = new BeforeCrudActionEvent($context);
$this->container->get('event_dispatcher')->dispatch($event);
if ($event->isPropagationStopped()) {
return $event->getResponse();
}

if (!$this->isGranted(Permission::EA_EXECUTE_ACTION, ['action' => Action::DELETE, 'entity' => $context->getEntity()])) {
throw new ForbiddenActionException($context);
}
if (!$context->getEntity()->isAccessible()) {
throw new InsufficientEntityPermissionException($context);
}

$csrfToken = $context->getRequest()->request->get('token');

if (!$this->isCsrfTokenValid('ea-delete', $csrfToken)) {
return $this->redirectToRoute($context->getDashboardRouteName());
}
return null;
}

} }



+ 49
- 49
Controller/ControllerTrait.php Visa fil

use Lc\SovBundle\Container\Ticket\TicketMessageContainer; use Lc\SovBundle\Container\Ticket\TicketMessageContainer;
use Lc\SovBundle\Container\User\GroupUserContainer; use Lc\SovBundle\Container\User\GroupUserContainer;
use Lc\SovBundle\Container\User\UserContainer; use Lc\SovBundle\Container\User\UserContainer;
use Lc\SovBundle\Definition\ApplicationDefinition;
use Lc\SovBundle\Field\Filter\FilterManager; use Lc\SovBundle\Field\Filter\FilterManager;
use Lc\SovBundle\Generator\PdfGenerator; use Lc\SovBundle\Generator\PdfGenerator;
use Lc\SovBundle\Repository\EntityRepository; use Lc\SovBundle\Repository\EntityRepository;
//TODO si vous avez une erreur avec le :array c'est qu'il faut passer à symfony 5.4. //TODO si vous avez une erreur avec le :array c'est qu'il faut passer à symfony 5.4.
//Suivez la procédure suivante : https://symfony.com/doc/current/setup/unstable_versions.html#upgrading-your-project-to-an-unstable-symfony-version //Suivez la procédure suivante : https://symfony.com/doc/current/setup/unstable_versions.html#upgrading-your-project-to-an-unstable-symfony-version
//En gros il faut changer tout les dépendances symfony/ qui sont en 5.3 par 5.4 dans composer.json //En gros il faut changer tout les dépendances symfony/ qui sont en 5.3 par 5.4 dans composer.json
public static function getSubscribedServices() :array
public static function getSubscribedServices(): array
{ {
return array_merge( return array_merge(
parent::getSubscribedServices(),
[
Environment::class => Environment::class,
Security::class => Security::class,
EntityManagerInterface::class => EntityManagerInterface::class,
UrlGeneratorInterface::class => UrlGeneratorInterface::class,
SessionInterface::class => SessionInterface::class,
PaginatorInterface::class => PaginatorInterface::class,
RequestStack::class => RequestStack::class,
EventDispatcherInterface::class => EventDispatcherInterface::class,
LoggerInterface::class => LoggerInterface::class,
ParameterBagInterface::class => ParameterBagInterface::class,
TranslatorInterface::class => TranslatorInterface::class,
PdfGenerator::class => PdfGenerator::class,
TranslatorAdmin::class => TranslatorAdmin::class,
FilterManager::class => FilterManager::class,
FlashBagTranslator::class => FlashBagTranslator::class,
MailjetTransport::class => MailjetTransport::class,
AdminUrlGenerator::class => AdminUrlGenerator::class,
SettingSolver::class => SettingSolver::class,
ComponentContainer::class => ComponentContainer::class,
FileContainer::class => FileContainer::class,
NewsletterContainer::class => NewsletterContainer::class,
ReminderContainer::class => ReminderContainer::class,
NewsContainer::class => NewsContainer::class,
PageContainer::class => PageContainer::class,
SiteContainer::class => SiteContainer::class,
TicketContainer::class => TicketContainer::class,
TicketMessageContainer::class => TicketMessageContainer::class,
GroupUserContainer::class => GroupUserContainer::class,
UserContainer::class => UserContainer::class,
SiteSettingContainer::class => SiteSettingContainer::class,
EntityRepository::class => EntityRepository::class,
FileComponent::class => FileComponent::class,
]
parent::getSubscribedServices(),
ApplicationDefinition::getSubscribedContainerServices(),
[
ApplicationDefinition::class => ApplicationDefinition::class,
Environment::class => Environment::class,
Security::class => Security::class,
EntityManagerInterface::class => EntityManagerInterface::class,
UrlGeneratorInterface::class => UrlGeneratorInterface::class,
SessionInterface::class => SessionInterface::class,
PaginatorInterface::class => PaginatorInterface::class,
RequestStack::class => RequestStack::class,
EventDispatcherInterface::class => EventDispatcherInterface::class,
LoggerInterface::class => LoggerInterface::class,
ParameterBagInterface::class => ParameterBagInterface::class,
TranslatorInterface::class => TranslatorInterface::class,
PdfGenerator::class => PdfGenerator::class,
TranslatorAdmin::class => TranslatorAdmin::class,
FilterManager::class => FilterManager::class,
FlashBagTranslator::class => FlashBagTranslator::class,
MailjetTransport::class => MailjetTransport::class,
AdminUrlGenerator::class => AdminUrlGenerator::class,
SettingSolver::class => SettingSolver::class,
ComponentContainer::class => ComponentContainer::class,
EntityRepository::class => EntityRepository::class,
FileComponent::class => FileComponent::class,
]
); );
} }


public function addFlashTranslator( public function addFlashTranslator(
string $type,
$translationKeyName,
$translationEntityName = null,
$translationParam = array()
): void
{
string $type,
$translationKeyName,
$translationEntityName = null,
$translationParam = array()
): void {
if ($translationEntityName === null && method_exists($this, 'getTranslationEntityName')) { if ($translationEntityName === null && method_exists($this, 'getTranslationEntityName')) {
$translationEntityName = $this->getTranslationEntityName(); $translationEntityName = $this->getTranslationEntityName();
} }




$this->get(FlashBagTranslator::class)->add( $this->get(FlashBagTranslator::class)->add(
$type,
$translationKeyName,
$translationEntityName,
$translationParam
$type,
$translationKeyName,
$translationEntityName,
$translationParam
); );
} }


return in_array($interfaceName, class_implements($this->getEntityFqcn())); return in_array($interfaceName, class_implements($this->getEntityFqcn()));
} }


public function generateEaUrl(string $controller = null, string $action = null, int $entityId = null, array $extraParam = array()): string
{
public function generateEaUrl(
string $controller = null,
string $action = null,
int $entityId = null,
array $extraParam = array()
): string {
$adminUrlGenerator = $this->get(AdminUrlGenerator::class); $adminUrlGenerator = $this->get(AdminUrlGenerator::class);
if ($controller) { if ($controller) {
$adminUrlGenerator->setController($controller); $adminUrlGenerator->setController($controller);
return $this->get(Environment::class); return $this->get(Environment::class);
} }


public function getApplicationDefinition(): ApplicationDefinition
{
return $this->get(ApplicationDefinition::class);
}

public function getEntityManager(): EntityManagerInterface public function getEntityManager(): EntityManagerInterface
{ {
return $this->get(EntityManagerInterface::class); return $this->get(EntityManagerInterface::class);
set_time_limit(0); set_time_limit(0);
} }


}
}

+ 120
- 0
Controller/User/UserAdminController.php Visa fil



namespace Lc\SovBundle\Controller\User; namespace Lc\SovBundle\Controller\User;


use Doctrine\DBAL\Exception\ForeignKeyConstraintViolationException;
use Doctrine\ORM\EntityManagerInterface;
use EasyCorp\Bundle\EasyAdminBundle\Collection\EntityCollection; use EasyCorp\Bundle\EasyAdminBundle\Collection\EntityCollection;
use EasyCorp\Bundle\EasyAdminBundle\Config\Action; use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
use EasyCorp\Bundle\EasyAdminBundle\Config\Actions; use EasyCorp\Bundle\EasyAdminBundle\Config\Actions;
use EasyCorp\Bundle\EasyAdminBundle\Config\Crud; use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
use EasyCorp\Bundle\EasyAdminBundle\Config\KeyValueStore;
use EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext;
use EasyCorp\Bundle\EasyAdminBundle\Event\AfterCrudActionEvent;
use EasyCorp\Bundle\EasyAdminBundle\Event\BeforeCrudActionEvent;
use EasyCorp\Bundle\EasyAdminBundle\Event\BeforeEntityDeletedEvent;
use EasyCorp\Bundle\EasyAdminBundle\Exception\EntityRemoveException;
use EasyCorp\Bundle\EasyAdminBundle\Exception\ForbiddenActionException;
use EasyCorp\Bundle\EasyAdminBundle\Exception\InsufficientEntityPermissionException;
use EasyCorp\Bundle\EasyAdminBundle\Field\ChoiceField; use EasyCorp\Bundle\EasyAdminBundle\Field\ChoiceField;
use EasyCorp\Bundle\EasyAdminBundle\Field\EmailField; use EasyCorp\Bundle\EasyAdminBundle\Field\EmailField;
use EasyCorp\Bundle\EasyAdminBundle\Field\TextField; use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
use EasyCorp\Bundle\EasyAdminBundle\Security\Permission;
use Lc\SovBundle\Container\User\UserContainer; use Lc\SovBundle\Container\User\UserContainer;
use Lc\SovBundle\Controller\AbstractAdminController; use Lc\SovBundle\Controller\AbstractAdminController;
use Lc\SovBundle\Definition\ActionDefinition; use Lc\SovBundle\Definition\ActionDefinition;
use Lc\SovBundle\Definition\ApplicationDefinition;
use Lc\SovBundle\Definition\RolesDefinition; use Lc\SovBundle\Definition\RolesDefinition;
use Lc\SovBundle\Definition\RolesDefinitionInterface; use Lc\SovBundle\Definition\RolesDefinitionInterface;
use Lc\SovBundle\Doctrine\EntityManager; use Lc\SovBundle\Doctrine\EntityManager;
use Lc\SovBundle\Doctrine\Extension\BlameableInterface;
use Lc\SovBundle\Factory\User\UserFactory; use Lc\SovBundle\Factory\User\UserFactory;
use Lc\SovBundle\Form\User\ConfirmDeleteUserFormType;
use Lc\SovBundle\Model\User\UserInterface;
use Lc\SovBundle\Translation\FlashBagTranslator;
use Lc\SovBundle\Translation\TranslatorAdmin; use Lc\SovBundle\Translation\TranslatorAdmin;
use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Session\SessionInterface; use Symfony\Component\HttpFoundation\Session\SessionInterface;
{ {
return $this->get(UserContainer::class)->getFactory()->create(); return $this->get(UserContainer::class)->getFactory()->create();
} }

public function delete(AdminContext $context)
{
$entityManager = $this->getEntityManager();

// Todo envisager un refactor similaire pour toutes les fonctions CRUD
$eaBeforeCrudActionEventDelete = $this->eaBeforeCrudActionEventDelete($context);
if (!is_null($eaBeforeCrudActionEventDelete)) {
return $eaBeforeCrudActionEventDelete;
}

$user = $context->getEntity()->getInstance();

$event = new BeforeEntityDeletedEvent($user);
$this->container->get('event_dispatcher')->dispatch($event);
if ($event->isPropagationStopped()) {
return $event->getResponse();
}

$user = $event->getEntityInstance();


// Creéer formulaire avec un champ confirm
$confirmDeleteUserForm = $this->createForm(ConfirmDeleteUserFormType::class, null, array(
'action' => $this->getAdminUrlGenerator()->generateUrl()
));
$confirmDeleteUserForm->handleRequest($context->getRequest());

$entityManager->delete($user);

$warningMessages = $this->getDeleteUserWarningMessageList($user);

//Avant la suppression on s'assure que l'utilisateur à confirmer et qu'il n'y aucun message d'erreur
if ($confirmDeleteUserForm->isSubmitted() && count($warningMessages['danger']) === 0) {
//Détecter les tables qui possède des relations avec un champ qui n'existe plus
//Dans le cas ci-dessous détecter les adresses lié à un utilisateur qui n'existe plus
//SELECT * FROM address a LEFT OUTER JOIN user u ON(u.id=a.user_id) WHERE u.id is null
try {
$entityManager->flush();
$this->addFlashTranslator('success', 'deleted');
} catch (ForeignKeyConstraintViolationException $e) {
throw new EntityRemoveException(['entity_name' => $context->getEntity()->getName(), 'message' => $e->getMessage()]);
}
return $this->redirect($this->getAdminUrlGenerator()->setAction(Crud::PAGE_INDEX)->setEntityId(null)->generateUrl());

}else{
if($confirmDeleteUserForm->isSubmitted()){
$this->addFlashTranslator('error', 'cannotDelete');
}
}

$responseParameters = $this->configureResponseParameters(KeyValueStore::new([
'pageName' => Crud::PAGE_DETAIL,
'templatePath' => '@LcSov/adminlte/crud/delete.html.twig',
'confirm_delete_user_form' => $confirmDeleteUserForm->createView(),
'global_actions' => array(),
'batch_actions' => array(),
'warning_message_list' => $warningMessages
]));

$event = new AfterCrudActionEvent($context, $responseParameters);
$this->get('event_dispatcher')->dispatch($event);
if ($event->isPropagationStopped()) {
return $event->getResponse();
}

return $responseParameters;
}

public function getDeleteUserWarningMessageList(UserInterface $user): array
{
$warningMessages = array();
$warningMessages['danger'] = [];
$warningMessages['warning'] = [];
$warningMessages['info'] = [];


$entityManager = $this->getEntityManager();

$entityToDeleteListCount = array();
$entityToDeleteListName = array();
foreach ($entityManager->getUnitOfWork()->getScheduledEntityDeletions() as $entityToDelete) {
if (isset($entityToDeleteListCount[(new \ReflectionClass($entityToDelete))->getShortName()])) {
$entityToDeleteListCount[(new \ReflectionClass($entityToDelete))->getShortName()]++;
} else {
$entityToDeleteListCount[(new \ReflectionClass($entityToDelete))->getShortName()] = 1;
}
$entityToDeleteListName[(new \ReflectionClass($entityToDelete))->getShortName()][] = $entityToDelete->getId();
}

foreach ($entityToDeleteListCount as $entityName => $entityToDeleteCount) {
$warningMessages['info'][] = $this->getTranslatorAdmin()->transFlashMessage(
'error',
'deleteEntityCascade',
'User',
array(
'%entity%' => $this->getTranslatorAdmin()->trans('entity.'.$entityName.'.label_plurial'),
'%count%' => $entityToDeleteCount
)
);
}

return $warningMessages;
}
} }

+ 88
- 0
Definition/ApplicationDefinition.php Visa fil

<?php

namespace Lc\SovBundle\Definition;

use Lc\SovBundle\Container\ComponentContainer;
use Lc\SovBundle\Container\File\FileContainer;
use Lc\SovBundle\Container\Newsletter\NewsletterContainer;
use Lc\SovBundle\Container\Reminder\ReminderContainer;
use Lc\SovBundle\Container\Setting\SiteSettingContainer;
use Lc\SovBundle\Container\Site\NewsContainer;
use Lc\SovBundle\Container\Site\PageContainer;
use Lc\SovBundle\Container\Site\SiteContainer;
use Lc\SovBundle\Container\Ticket\TicketContainer;
use Lc\SovBundle\Container\Ticket\TicketMessageContainer;
use Lc\SovBundle\Container\User\GroupUserContainer;
use Lc\SovBundle\Container\User\UserContainer;
use function Symfony\Component\String\u;

class ApplicationDefinition
{

public static function getContainerList(): array
{
return [
FileContainer::class,
NewsletterContainer::class,
ReminderContainer::class,
NewsContainer::class,
PageContainer::class,
SiteContainer::class,
TicketContainer::class,
TicketMessageContainer::class,
GroupUserContainer::class,
UserContainer::class,
SiteSettingContainer::class,
ComponentContainer::class
];
}

public function getContainerByEntityFqcn(string $entityFqcn)
{
foreach (static::getContainerList() as $containerFqcn){
if($this->isContainerManageEntity($containerFqcn)){
if ($containerFqcn::getEntityFqcn() == $entityFqcn) {
return $containerFqcn;
}
}
}
return null;
}

public function isContainerManageEntity(string $containerFqcn)
{
if(method_exists($containerFqcn, 'getEntityFqcn') ){
return true;
}
return false;
}

public static function getSubscribedContainerServices(): array
{
$array = [];


foreach (static::getContainerList() as $container) {
$array[$container] = $container;
}

return $array;
}


public static function getContainerListForTwigGlobals(): array
{
$array = [];

foreach (static::getContainerList() as $containerNamespace) {
//récupère le nom du fichier dans le namespace du container
$key = u(substr($containerNamespace, strrpos($containerNamespace, '\\')))->snake();

$array[$key->toString()] = '@' . $containerNamespace;
}

return $array;
}


}

+ 2
- 2
Doctrine/Extension/BlameableTrait.php Visa fil

/** /**
* @Gedmo\Blameable(on="create") * @Gedmo\Blameable(on="create")
* @ORM\ManyToOne(targetEntity="Lc\SovBundle\Model\User\UserInterface") * @ORM\ManyToOne(targetEntity="Lc\SovBundle\Model\User\UserInterface")
* @ORM\JoinColumn(nullable=true)
* @ORM\JoinColumn(nullable=true, onDelete="SET NULL")
*/ */
protected $createdBy; protected $createdBy;


/** /**
* @Gedmo\Blameable(on="update") * @Gedmo\Blameable(on="update")
* @ORM\ManyToOne(targetEntity="Lc\SovBundle\Model\User\UserInterface") * @ORM\ManyToOne(targetEntity="Lc\SovBundle\Model\User\UserInterface")
* @ORM\JoinColumn(nullable=true)
* @ORM\JoinColumn(nullable=true, onDelete="SET NULL")
*/ */
protected $updatedBy; protected $updatedBy;



+ 3
- 2
Factory/File/FileFactory.php Visa fil



namespace Lc\SovBundle\Factory\File; namespace Lc\SovBundle\Factory\File;


use App\Entity\File\File;
use Lc\SovBundle\Container\File\FileContainer;
use Lc\SovBundle\Factory\AbstractFactory; use Lc\SovBundle\Factory\AbstractFactory;
use Lc\SovBundle\Model\File\FileInterface; use Lc\SovBundle\Model\File\FileInterface;


{ {
public function create(): FileInterface public function create(): FileInterface
{ {
$file = new File();
$class = FileContainer::getEntityFqcn();
$file = new $class;


return $file; return $file;
} }

+ 3
- 2
Factory/Newsletter/NewsletterFactory.php Visa fil



namespace Lc\SovBundle\Factory\Newsletter; namespace Lc\SovBundle\Factory\Newsletter;


use App\Entity\Newsletter\Newsletter;
use Lc\SovBundle\Container\Newsletter\NewsletterContainer;
use Lc\SovBundle\Factory\AbstractFactory; use Lc\SovBundle\Factory\AbstractFactory;
use Lc\SovBundle\Model\Newsletter\NewsletterInterface; use Lc\SovBundle\Model\Newsletter\NewsletterInterface;


{ {
public function create(): NewsletterInterface public function create(): NewsletterInterface
{ {
$newsletter = new Newsletter();
$class = NewsletterContainer::getEntityFqcn();
$newsletter = new $class;


return $newsletter; return $newsletter;
} }

+ 3
- 3
Factory/Reminder/ReminderFactory.php Visa fil



namespace Lc\SovBundle\Factory\Reminder; namespace Lc\SovBundle\Factory\Reminder;


use App\Entity\Reminder\Reminder;
use Lc\SovBundle\Container\Reminder\ReminderContainer;
use Lc\SovBundle\Factory\AbstractFactory; use Lc\SovBundle\Factory\AbstractFactory;
use Lc\SovBundle\Model\Reminder\ReminderInterface; use Lc\SovBundle\Model\Reminder\ReminderInterface;


string $crudControllerFqcn = null, string $crudControllerFqcn = null,
int $entityId = null int $entityId = null
): ReminderInterface { ): ReminderInterface {
$reminder = new Reminder();
$class = ReminderContainer::getEntityFqcn();
$reminder = new $class;
$reminder->setCrudAction($crudAction); $reminder->setCrudAction($crudAction);
$reminder->setCrudControllerFqcn($crudControllerFqcn); $reminder->setCrudControllerFqcn($crudControllerFqcn);
$reminder->setEntityId($entityId); $reminder->setEntityId($entityId);

+ 3
- 2
Factory/Setting/SiteSettingFactory.php Visa fil



namespace Lc\SovBundle\Factory\Setting; namespace Lc\SovBundle\Factory\Setting;


use App\Entity\Setting\SiteSetting;
use Lc\SovBundle\Container\Setting\SiteSettingContainer;
use Lc\SovBundle\Factory\AbstractFactory; use Lc\SovBundle\Factory\AbstractFactory;
use Lc\SovBundle\Model\File\FileInterface; use Lc\SovBundle\Model\File\FileInterface;
use Lc\SovBundle\Model\Setting\SiteSettingInterface; use Lc\SovBundle\Model\Setting\SiteSettingInterface;
{ {
public function create(SiteInterface $site, string $name, string $text = null, \DateTime $date = null, FileInterface $file = null): SiteSettingInterface public function create(SiteInterface $site, string $name, string $text = null, \DateTime $date = null, FileInterface $file = null): SiteSettingInterface
{ {
$siteSetting = new SiteSetting();
$class = SiteSettingContainer::getEntityFqcn();
$siteSetting = new $class;


$siteSetting->setSite($site); $siteSetting->setSite($site);
$siteSetting->setName($name); $siteSetting->setName($name);

+ 3
- 3
Factory/Site/NewsFactory.php Visa fil



namespace Lc\SovBundle\Factory\Site; namespace Lc\SovBundle\Factory\Site;


use App\Entity\Site\News;
use Lc\SovBundle\Container\Site\NewsContainer;
use Lc\SovBundle\Factory\AbstractFactory; use Lc\SovBundle\Factory\AbstractFactory;
use Lc\SovBundle\Model\Site\NewsInterface; use Lc\SovBundle\Model\Site\NewsInterface;


{ {
public function create(): NewsInterface public function create(): NewsInterface
{ {
$news = new News();
$class = NewsContainer::getEntityFqcn();
$news = new $class;
$news->setStatus(1); $news->setStatus(1);


return $news; return $news;

+ 3
- 2
Factory/Site/PageFactory.php Visa fil



namespace Lc\SovBundle\Factory\Site; namespace Lc\SovBundle\Factory\Site;


use App\Entity\Site\Page;
use Lc\SovBundle\Container\Site\PageContainer;
use Lc\SovBundle\Factory\AbstractFactory; use Lc\SovBundle\Factory\AbstractFactory;
use Lc\SovBundle\Model\Site\PageInterface; use Lc\SovBundle\Model\Site\PageInterface;


{ {
public function create(): PageInterface public function create(): PageInterface
{ {
$page = new Page();
$class = PageContainer::getEntityFqcn();
$page = new $class;


$page->setStatus(1); $page->setStatus(1);



+ 3
- 2
Factory/Site/SiteFactory.php Visa fil



namespace Lc\SovBundle\Factory\Site; namespace Lc\SovBundle\Factory\Site;


use App\Entity\Site\Site;
use Lc\SovBundle\Container\Site\SiteContainer;
use Lc\SovBundle\Factory\AbstractFactory; use Lc\SovBundle\Factory\AbstractFactory;
use Lc\SovBundle\Model\Site\SiteInterface; use Lc\SovBundle\Model\Site\SiteInterface;


{ {
public function create(string $devAlias = null): SiteInterface public function create(string $devAlias = null): SiteInterface
{ {
$site = new Site();
$class = SiteContainer::getEntityFqcn();
$site = new $class;


$site->setDevAlias($devAlias); $site->setDevAlias($devAlias);



+ 3
- 2
Factory/Ticket/TicketFactory.php Visa fil



namespace Lc\SovBundle\Factory\Ticket; namespace Lc\SovBundle\Factory\Ticket;


use App\Entity\Ticket\Ticket;
use Lc\SovBundle\Container\Ticket\TicketContainer;
use Lc\SovBundle\Factory\AbstractFactory; use Lc\SovBundle\Factory\AbstractFactory;
use Lc\SovBundle\Model\Ticket\TicketInterface; use Lc\SovBundle\Model\Ticket\TicketInterface;
use Lc\SovBundle\Model\Ticket\TicketModel; use Lc\SovBundle\Model\Ticket\TicketModel;
{ {
public function create(): TicketInterface public function create(): TicketInterface
{ {
$ticket = new Ticket();
$class = TicketContainer::getEntityFqcn();
$ticket = new $class;


$ticketMessageFactory = new TicketMessageFactory(); $ticketMessageFactory = new TicketMessageFactory();
$ticketMessage = $ticketMessageFactory->create($ticket) ; $ticketMessage = $ticketMessageFactory->create($ticket) ;

+ 3
- 2
Factory/Ticket/TicketMessageFactory.php Visa fil



namespace Lc\SovBundle\Factory\Ticket; namespace Lc\SovBundle\Factory\Ticket;


use App\Entity\Ticket\TicketMessage;
use Lc\SovBundle\Container\Ticket\TicketMessageContainer;
use Lc\SovBundle\Factory\AbstractFactory; use Lc\SovBundle\Factory\AbstractFactory;
use Lc\SovBundle\Model\Ticket\TicketInterface; use Lc\SovBundle\Model\Ticket\TicketInterface;
use Lc\SovBundle\Model\Ticket\TicketMessageInterface; use Lc\SovBundle\Model\Ticket\TicketMessageInterface;
{ {
public function create(TicketInterface $ticket): TicketMessageInterface public function create(TicketInterface $ticket): TicketMessageInterface
{ {
$ticketMessage = new TicketMessage();
$class = TicketMessageContainer::getEntityFqcn();
$ticketMessage = new $class;


$ticketMessage->setTicket($ticket); $ticketMessage->setTicket($ticket);
$ticketMessage->setStatus(1); $ticketMessage->setStatus(1);

+ 3
- 2
Factory/User/GroupUserFactory.php Visa fil



namespace Lc\SovBundle\Factory\User; namespace Lc\SovBundle\Factory\User;


use App\Entity\User\GroupUser;
use Lc\SovBundle\Container\User\GroupUserContainer;
use Lc\SovBundle\Factory\AbstractFactory; use Lc\SovBundle\Factory\AbstractFactory;
use Lc\SovBundle\Model\User\GroupUserInterface; use Lc\SovBundle\Model\User\GroupUserInterface;


{ {
public function create(): GroupUserInterface public function create(): GroupUserInterface
{ {
$groupUser = new GroupUser();
$class = GroupUserContainer::getEntityFqcn();
$groupUser = new $class;


$groupUser->setStatus(1); $groupUser->setStatus(1);



+ 4
- 2
Factory/User/UserFactory.php Visa fil



namespace Lc\SovBundle\Factory\User; namespace Lc\SovBundle\Factory\User;


use App\Entity\User\User;
use Lc\SovBundle\Container\User\UserContainer;
use Lc\SovBundle\Factory\AbstractFactory; use Lc\SovBundle\Factory\AbstractFactory;
use Lc\SovBundle\Model\User\UserInterface; use Lc\SovBundle\Model\User\UserInterface;


{ {
public function create(): UserInterface public function create(): UserInterface
{ {
$user = new User();

$class = UserContainer::getEntityFqcn();
$user = new $class;


return $user; return $user;
} }

+ 65
- 0
Form/User/ConfirmDeleteUserFormType.php Visa fil

<?php

namespace Lc\SovBundle\Form\User;


use Lc\SovBundle\Doctrine\EntityManager;
use Lc\SovBundle\Translation\TranslatorAdmin;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ButtonType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class ConfirmDeleteUserFormType extends AbstractType
{

protected $em;
protected $translatorAdmin;

public function __construct(EntityManager $em, TranslatorAdmin $translatorAdmin)
{
$this->em = $em;
$this->translatorAdmin = $translatorAdmin;
}

/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{

$builder->add(
'confirmDelete',
CheckboxType::class,
[
'translation_domain' => 'admin',
]
);

$builder->add(
'delete',
SubmitType::class,
array(
'label'=> 'action.delete'
)

);
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
// enable/disable CSRF protection for this form
'csrf_protection' => true,
// the name of the hidden HTML field that stores the token
'csrf_field_name' => '_token',
// an arbitrary string used to generate the value of the token
// using a different string for each form improves its security
'csrf_token_id' => 'ea-delete',
'translation_domain'=> 'admin'
]);
}


}

+ 2
- 1
Model/Ticket/TicketModel.php Visa fil

protected $visitorToken; protected $visitorToken;


/** /**
* @ORM\OneToMany(targetEntity="Lc\SovBundle\Model\Ticket\TicketMessageInterface", mappedBy="ticket", orphanRemoval=true, cascade={"persist", "remove"})
* @ORM\OneToMany(targetEntity="Lc\SovBundle\Model\Ticket\TicketMessageInterface", mappedBy="ticket",cascade={"persist", "remove"}, orphanRemoval=true)
* @ORM\OrderBy({"id" = "ASC"}) * @ORM\OrderBy({"id" = "ASC"})
*/ */
protected $ticketMessages; protected $ticketMessages;
*/ */
protected $user; protected $user;



public function __construct() public function __construct()
{ {
$this->ticketMessages = new ArrayCollection(); $this->ticketMessages = new ArrayCollection();

+ 1
- 1
Model/User/UserModel.php Visa fil

protected $groupUsers; protected $groupUsers;


/** /**
* @ORM\OneToMany(targetEntity="Lc\SovBundle\Model\Ticket\TicketInterface", mappedBy="user")
* @ORM\OneToMany(targetEntity="Lc\SovBundle\Model\Ticket\TicketInterface", mappedBy="user", cascade={"remove"})
*/ */
protected $tickets; protected $tickets;



+ 15
- 0
Repository/AbstractRepositoryQuery.php Visa fil

use Doctrine\ORM\QueryBuilder; use Doctrine\ORM\QueryBuilder;
use Knp\Component\Pager\PaginatorInterface; use Knp\Component\Pager\PaginatorInterface;
use Lc\SovBundle\Doctrine\EntityInterface; use Lc\SovBundle\Doctrine\EntityInterface;
use Lc\SovBundle\Model\User\UserInterface;


abstract class AbstractRepositoryQuery implements RepositoryQueryInterface abstract class AbstractRepositoryQuery implements RepositoryQueryInterface
{ {
->setParameter('id', $id); ->setParameter('id', $id);
} }


public function filterByCreatedBy(UserInterface $user):self
{
return $this
->andWhere('.createdBy = :user')
->setParameter('user', $user);
}

public function filterByUpdatedBy(UserInterface $user):self
{
return $this
->andWhere('.updatedBy = :user')
->setParameter('user', $user);
}

public function andWhereEqual($field, $value) public function andWhereEqual($field, $value)
{ {
return $this->andWhere('.'.$field.' = :'.$field)->setParameter($field, $value); return $this->andWhere('.'.$field.' = :'.$field)->setParameter($field, $value);

+ 7
- 0
Resources/translations/admin.fr.yaml Visa fil

editWithTitle: 'Modifier "%label%" : %title% (#%id%)' editWithTitle: 'Modifier "%label%" : %title% (#%id%)'
detail: Voir "%label%" (#%id%) detail: Voir "%label%" (#%id%)
un_titre: Un titre un_titre: Un titre
delete: "Supprimer %label% : <br /> %title% (#%id%)"
account: account:
profile: Mes informations personnelles profile: Mes informations personnelles
change_password: Changer de mot de passe change_password: Changer de mot de passe
label_plurial: Utilisateurs label_plurial: Utilisateurs
fields: fields:
firstname: Prénom firstname: Prénom
ticketTypesNotification: Alerte par email lors de ticket de type
lastname: Nom lastname: Nom
gender: Sexe gender: Sexe
genderChoices: genderChoices:
birthdate: Date de naissance birthdate: Date de naissance
groupUsers: Groupe d'utilisateurs groupUsers: Groupe d'utilisateurs
isVerified: Actif isVerified: Actif
flashes:
error:
cannotDelete: L'utilisateur ne peut pas être supprimé, voir les élements dans suppression impossible.
Page: Page:
label: Page label: Page
label_plurial: Pages label_plurial: Pages
being-processed: En attente being-processed: En attente
closed: Fermé closed: Fermé
TicketMessage: TicketMessage:
label_plurial: Message de ticket
fields: fields:
message: Votre réponse message: Votre réponse
closeTicket: Fermer la demande closeTicket: Fermer la demande
default: default:
fields: fields:
id: Id id: Id
confirmDelete: Confirmer la suppression
createdAt: Créé le createdAt: Créé le
user: Utilisateur user: Utilisateur
firstname: Prénom firstname: Prénom

+ 74
- 0
Resources/views/adminlte/crud/delete.html.twig Visa fil

{# @var ea \EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext #}
{# @var entities \EasyCorp\Bundle\EasyAdminBundle\Collection\EntityDtoCollection #}
{# @var paginator \EasyCorp\Bundle\EasyAdminBundle\Orm\EntityPaginator #}
{% extends ea.templatePath('layout') %}

{% trans_default_domain ea.i18n.translationDomain %}

{% block content_title %}
{{ 'delete'|sov_trans_admin_title(translation_entity_name, {id: ea.getEntity().getInstance().getId(), title: ea.getEntity().getInstance()})|raw }}
{% endblock %}

{% block content_breadcrumb %}
{{ include('@LcSov/adminlte/block/breadcrumb.html.twig') }}
{% endblock content_breadcrumb %}


{% block page_actions %}
{% endblock page_actions %}

{% block main %}
{% block main_prepend %}{% endblock %}
<div class="col-12" id="{% block detail_id %}{% endblock detail_id %}">
{% block card_wrapper %}
<div class="card card-outline card-primary">
{% block card_header_wrapper %}
<div class="card-header">
<div class="btn-list float-sm-right">
</div>
</div>
{% endblock %}
{% block card_body_wrapper %}
<div class="card-body">
{% block detail_fields %}
{% for type, messageList in warning_message_list %}
{% if messageList|length >0 %}
<div class="alert alert-{{ type }}">
{% if type =='danger' %}
<h5><i class="icon fas fa-ban"></i> Suppresion impossible</h5>
{% elseif type =='warning' %}
<h5><i class="icon fas fa-exclamation-triangle"></i> À vérifier avant
suppression</h5>
{% elseif type =='info' %}
<h5><i class="icon fas fa-info"></i> Élements qui seront supprimés</h5>
{% endif %}

{% for message in messageList %}
<p>{{ message|raw }}</p>
{% endfor %}
</div>
{% endif %}
{% endfor %}
{% endblock %}
</div>
{% endblock %}
{% block card_footer_wrapper %}
<div class="card-footer">
<div class="row">
{% block delete_form %}
{% form_theme confirm_delete_user_form '@LcSov/adminlte/crud/form_theme.html.twig' %}
{{ form_start(confirm_delete_user_form) }}
<input type="hidden" name="token" value="{{ csrf_token('ea-delete') }}"/>
{{ form_end(confirm_delete_user_form) }}
{% endblock delete_form %}
</div>
</div>
{% endblock %}


</div>
{% endblock card_wrapper %}
</div>
{% block main_append %}{% endblock %}

{% endblock main %}

+ 0
- 2
Resources/views/adminlte/crud/form_theme.html.twig Visa fil

{% endif %} {% endif %}


<div class="col-12"> <div class="col-12">
{# {{ dump(form.vars) }} #}
{# {{ dump(form.vars.ea_crud_form.ea_field) }} #}
<div class="input-group"> <div class="input-group">
<div class="input-group-prepend"> <div class="input-group-prepend">
{% if form.parent.vars['row_attr']['data-sortable'] is defined %} {% if form.parent.vars['row_attr']['data-sortable'] is defined %}

Laddar…
Avbryt
Spara