src/Admin/UserAdmin.php line 45

Open in your IDE?
  1. <?php
  2. namespace App\Admin;
  3. use App\Entity\User;
  4. use App\Security\Roles;
  5. use DateTime;
  6. use Doctrine\ORM\QueryBuilder;
  7. use Exception;
  8. use FOS\UserBundle\Model\UserManagerInterface;
  9. use FOS\UserBundle\Util\TokenGeneratorInterface;
  10. use Sonata\AdminBundle\Datagrid\DatagridMapper;
  11. use Sonata\AdminBundle\Datagrid\ListMapper;
  12. use Sonata\AdminBundle\Datagrid\ProxyQueryInterface;
  13. use Sonata\AdminBundle\Form\FormMapper;
  14. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  15. use Symfony\Component\Form\Extension\Core\Type\PasswordType;
  16. use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
  17. use Symfony\Component\Validator\Constraints\NotBlank;
  18. class UserAdmin extends AbstractAdmin
  19. {
  20.     /** @var UserManagerInterface */
  21.     private $userManager;
  22.     /** @var TokenGeneratorInterface */
  23.     private $tokenGenerator;
  24.     /**
  25.      * userAdmin constructor.
  26.      *
  27.      * @param string $code
  28.      * @param string $class
  29.      * @param string $baseControllerName
  30.      * @param UserManagerInterface $userManager
  31.      * @param TokenGeneratorInterface $tokenGenerator
  32.      */
  33.     public function __construct(
  34.         string $code,
  35.         string $class,
  36.         string $baseControllerName,
  37.         UserManagerInterface $userManager,
  38.         TokenGeneratorInterface $tokenGenerator
  39.     ) {
  40.         parent::__construct($code$class$baseControllerName);
  41.         $this->userManager $userManager;
  42.         $this->tokenGenerator $tokenGenerator;
  43.     }
  44.     /**
  45.      * @param ProxyQueryInterface $query
  46.      * @return ProxyQueryInterface
  47.      */
  48.     protected function configureQuery(ProxyQueryInterface $query): ProxyQueryInterface
  49.     {
  50.         /** @var ProxyQueryInterface | QueryBuilder $query */
  51.         if (!$this->isSupervisor()) {
  52.             $alias $query->getRootAliases()[0];
  53.             $field sprintf('%s.%s'$alias'roles');
  54.             $query->andWhere($query->expr()->notLike($field':roles'))
  55.                 ->setParameter(':roles''%'.Roles::ROLE_SUPERVISOR_ADMIN.'%');
  56.         }
  57.         return $query;
  58.     }
  59.     /**
  60.      * @param ListMapper $listMapper
  61.      *
  62.      * @return void
  63.      */
  64.     protected function configureListFields(ListMapper $listMapper): void
  65.     {
  66.         $listMapper
  67.             ->add('email')
  68.             ->add(
  69.                 'enabled',
  70.                 null,
  71.                 [
  72.                     'header_style' => 'text-align: center',
  73.                     'row_align' => 'center',
  74.                     'editable' => true,
  75.                 ]
  76.             )
  77.             ->add('lastLogin'null, [
  78.                 'format' => 'Y-m-d',
  79.             ])
  80.             ->add(
  81.                 '_action',
  82.                 'actions',
  83.                 [
  84.                     'actions' => [
  85.                         'edit' => [],
  86.                         'delete' => [],
  87.                     ],
  88.                 ]
  89.             )
  90.         ;
  91.     }
  92.     /**
  93.      * @param DatagridMapper $filter
  94.      *
  95.      * @return void
  96.      */
  97.     protected function configureDatagridFilters(DatagridMapper $filter): void
  98.     {
  99.         $filter
  100.             ->add('email')
  101.             ->add('enabled');
  102.     }
  103.     /**
  104.      * @param FormMapper $form
  105.      *
  106.      * @return void
  107.      */
  108.     protected function configureFormFields(FormMapper $form): void
  109.     {
  110.         $constraints = [];
  111.         /** @var User $subject */
  112.         $subject $this->getSubject();
  113.         if (!$subject->getId()) {
  114.             $constraints[] = new NotBlank();
  115.         }
  116.         $form->tab('admin.form.section.user.base_settings', [
  117.             'label' => 'admin.form.section.user.base_settings'
  118.         ]);
  119.         $form
  120.             ->with('admin.form.section.user.basic_data', [
  121.                 'class' => 'col-md-6',
  122.                 'label' => 'admin.form.section.user.basic_data'
  123.             ])
  124.             ->add(
  125.                 'email',
  126.                 null,
  127.                 [
  128.                     'constraints' => [
  129.                         new NotBlank(),
  130.                     ],
  131.                 ]
  132.             )
  133.             ->end();
  134.         $form->with('admin.form.section.user.password', ['class' => 'col-md-6''label' => 'admin.form.section.user.password'])
  135.             ->add(
  136.                 'plainPassword',
  137.                 RepeatedType::class,
  138.                 [
  139.                     'type' => PasswordType::class,
  140.                     'required' => false,
  141.                     'first_options' => ['label' => 'form.label_new_password'],
  142.                     'second_options' => ['label' => 'form.label_new_password_confirmation'],
  143.                     'invalid_message' => 'fos_user.password.mismatch',
  144.                     'constraints' => $constraints,
  145.                 ]
  146.             )
  147.             ->end();
  148.         $form
  149.             ->with('admin.form.section.user.enabled', ['class' => 'col-md-6 pull-right''label' => 'admin.form.section.user.enabled'])
  150.             ->add('enabled')
  151.             ->end();
  152.         $form->end();
  153.         if ($this->isGrantedRole(Roles::ROLE_VINCOTECH_ADMIN)) {
  154.             $form->tab('admin.form.section.user.role_settings', ['label' => 'admin.form.section.user.role_settings']);
  155.             $form
  156.                 ->with('admin.form.section.user.roles', ['class' => 'col-md-6''label' => 'admin.form.section.user.roles'])
  157.                 ->add(
  158.                     'roles',
  159.                     ChoiceType::class,
  160.                     [
  161.                         'label' => false,
  162.                         'multiple' => true,
  163.                         'expanded' => true,
  164.                         'choices' => Roles::getRolesWithTokenIds($this->isSupervisor()),
  165.                     ]
  166.                 )
  167.                 ->end();
  168.             $form->end();
  169.         }
  170.     }
  171.     /**
  172.      * @param User $object
  173.      *
  174.      * @return void
  175.      *
  176.      * @throws Exception
  177.      */
  178.     public function prePersist($object): void
  179.     {
  180.         $object
  181.             ->setPassword(''// settings password by event listener automatically
  182.             ->setConfirmationToken($this->tokenGenerator->generateToken())
  183.             ->setPasswordRequestedAt(new DateTime())
  184.             ->addRole(Roles::ROLE_ADMIN);
  185.     }
  186.     /**
  187.      * @param User $object
  188.      *
  189.      * @return void
  190.      */
  191.     public function preUpdate($object): void
  192.     {
  193.         $object->addRole(Roles::ROLE_ADMIN);
  194.         if ($object->getPlainPassword()) {
  195.             $this->userManager->updatePassword($object);
  196.         }
  197.     }
  198. }