繁体   English   中英

EasyAdmin 3:如何检索编辑表单值

[英]EasyAdmin 3: how to retrieve edit form values

我正在使用 EasyAdmin 3,我正在尝试创建一个验证系统,其中:

  • ROLE_EDITOR 可以通过EasyAdmin(OperateurCrudCrontroller)编辑一个Entity(例如Operateur),并且这个Operator 的编辑数据保存在另一个临时表(Operateur_Temp)中。
  • 稍后,ROLE_ADMIN 可以通过 EasyAdmin 访问 Operateur_Temp 中保存的数据,并验证更改。 经验证的更改将添加到操作员表中。

在 OperateurCrudController 中,我创建了一个按钮 updateOperator 和一个与该按钮关联的名为 saveOperator 的函数。

我可以创建一个新的 OperateurTemp 对象并在其中保存一些数据。 我的问题是我不知道如何从 EasyAdmin 的编辑表单中获取数据。 我想检索编辑表单中所有字段的值,以便能够将它们保存在 OperateurTemp 表中。

这是我的 OperateurCrudController:

<?php

namespace App\Controller\Admin;

use App\Entity\Operateur;
use App\Entity\OperateurTemp;
use App\Entity\User;
use App\Form\OperateurType;
use EasyCorp\Bundle\EasyAdminBundle\Dto\ActionDto;
use EasyCorp\Bundle\EasyAdminBundle\Dto\CrudDto;
use EasyCorp\Bundle\EasyAdminBundle\Form\Type\CrudFormType;
use EasyCorp\Bundle\EasyAdminBundle\Provider\AdminContextProvider;
use EasyCorp\Bundle\EasyAdminBundle\Router\CrudUrlGenerator;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use App\Repository\OperateurRepository;
use App\Repository\OperateurTempRepository;
use App\Repository\UserRepository;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\QueryBuilder;
use EasyCorp\Bundle\EasyAdminBundle\Collection\FieldCollection;
use EasyCorp\Bundle\EasyAdminBundle\Collection\FilterCollection;
use EasyCorp\Bundle\EasyAdminBundle\Config\Filters;
use EasyCorp\Bundle\EasyAdminBundle\Config\KeyValueStore;
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\Field\TextField;
use EasyCorp\Bundle\EasyAdminBundle\Field\IdField;
use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField;
use EasyCorp\Bundle\EasyAdminBundle\Field\DateTimeField;
use EasyCorp\Bundle\EasyAdminBundle\Field\NumberField;
use EasyCorp\Bundle\EasyAdminBundle\Field\TextareaField;
use EasyCorp\Bundle\EasyAdminBundle\Field\EmailField;
use EasyCorp\Bundle\EasyAdminBundle\Field\TelephoneField;
use EasyCorp\Bundle\EasyAdminBundle\Field\UrlField;
use EasyCorp\Bundle\EasyAdminBundle\Field\TextEditorField;

use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
use EasyCorp\Bundle\EasyAdminBundle\Config\Actions;
use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
use EasyCorp\Bundle\EasyAdminBundle\Filter\EntityFilter;
use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Validator\Constraints\Date;

use EasyCorp\Bundle\EasyAdminBundle\Event\BeforeEntityUpdatedEvent;
use EasyCorp\Bundle\EasyAdminBundle\Event\BeforeCrudActionEvent;
use EasyCorp\Bundle\EasyAdminBundle\Factory\EntityFactory;
use EasyCorp\Bundle\EasyAdminBundle\Event\AfterCrudActionEvent;
use EasyCorp\Bundle\EasyAdminBundle\Orm\EntityUpdater;
use EasyCorp\Bundle\EasyAdminBundle\Event\AfterEntityUpdatedEvent;
use EasyCorp\Bundle\EasyAdminBundle\Event\BeforeEntityPersistedEvent;
use App\EventSubscriber\EasyAdminSubscriber;

class OperateurCrudController extends AbstractCrudController
{

    private $adminContextProvider;
    private $entityManager;

    public function __construct(AdminUrlGenerator $adminUrlGenerator, AdminContextProvider $adminContextProvider, EntityManagerInterface $entityManager)
    {
        $this->adminUrlGenerator = $adminUrlGenerator;
        $this->adminContextProvider = $adminContextProvider;
        $this->entityManager = $entityManager;
    }

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

    public function configureFields(string $pageName): iterable
    {
        return [
            IdField::new('id')->hideOnForm(),
            TextField::new('name', 'Nom'),
            TextEditorField::new('description', 'Description')->hideOnIndex(),
            TextareaField::new('address', 'Adresse'),
            TextField::new('city', 'Ville')->hideOnIndex(),
            TextField::new('postal_code', 'Code Postal')->hideOnIndex(),
            TextField::new('email', 'Email'),
            TelephoneField::new('phone', 'Téléphone'),
            UrlField::new('website', 'Site Web')->hideOnIndex(),
            TextEditorField::new('opening_hours', 'Horaires d\'Ouverture'),
            NumberField::new('latitude', 'Latitude')->hideOnIndex()->setNumDecimals(15),
            NumberField::new('longitude', 'Longitude')->hideOnIndex()->setNumDecimals(15),
            TextField::new('slug', 'Slug')->hideOnIndex()->setPermission('ROLE_ADMIN'),
            DateTimeField::new('created_at', 'Date Création')->onlyOnIndex(),
            DateTimeField::new('updated_at', 'Date Modification')->onlyOnIndex(),
            AssociationField::new('thematiques', 'Thématiques')

        ];
    }

    public function configureActions(Actions $actions): Actions
    {
        $batchAction = Action::new('approve', 'Approuver', 'fa fa-user-check')
            ->linkToUrl('approveOperators');

        $updateOperator = Action::new('update', 'Enregistrer les modifications', 'fa fa-save')
            ->linkToCrudAction('saveOperator');


        if ($this->isGranted('ROLE_ADMIN')) {
            return $actions
                // ->add(Crud::PAGE_INDEX, $batchAction)
                ->add(Crud::PAGE_INDEX, Action::DETAIL)
                ->setPermission(Action::DELETE, 'ROLE_ADMIN')
                ->setPermission(Action::NEW, 'ROLE_ADMIN')
                ->setPermission(Action::EDIT, 'ROLE_ADMIN')
                ->setPermission($batchAction, 'ROLE_ADMIN');
        }

        if ($this->isGranted('ROLE_EDITOR')) {
            return $actions
                ->add(Crud::PAGE_INDEX, Action::DETAIL)
                ->add(Crud::PAGE_EDIT, $updateOperator)
                ->setPermission(Action::DELETE, 'ROLE_ADMIN')
                ->setPermission(Action::NEW, 'ROLE_ADMIN')
                ->setPermission($updateOperator, 'ROLE_EDITOR')
                ->disable(Action::SAVE_AND_RETURN, Action::SAVE_AND_CONTINUE);
        }
    }

    public function approveOperators(): Response
    {
        $this->addFlash('notice', '<span style="color: green"><i class="fa fa-check"></i>Modification effecuté </span>');

        $url = $this->adminUrlGenerator
            ->setAction(Action::INDEX)
            ->generateUrl();

        return $this->redirect($url);
    }

    public function saveOperator(AdminContext $context): Response
    {   
        $operator = $context->getEntity()->getInstance();

        $operator_name = $operator->getName();
        $operator_description = $operator->getDescription();
        $operator_latitude = $operator->getLatitude();
        $operator_longitude = $operator->getLongitude();

        $operator_temp = new OperateurTemp();
        $operator_temp->setName($operator_name);
        $operator_temp->setDescription($operator_description);
        $operator_temp->setLatitude($operator_latitude);
        $operator_temp->setLongitude($operator_longitude);

        $em = $this->getDoctrine()->getManager();
        $em->persist($operator_temp);
        $em->flush();

        //$this->addFlash('notice', '<span style="color: green"><i class="fa fa-check"></i>Modification prise en compte ! </span>');

        //Create my own save button in page edit

        $url = $this->adminUrlGenerator
            ->setAction(Action::INDEX)
            ->generateUrl();

        return $this->redirect($url);
    }


    public function configureCrud(Crud $crud): Crud
    {
        return $crud
            ->setEntityPermission('ROLE_EDITOR');
    }



    public function createIndexQueryBuilder(SearchDto $searchDto, EntityDto $entityDto, FieldCollection $fields, FilterCollection $filters): QueryBuilder
    {
        $response = parent::createIndexQueryBuilder($searchDto, $entityDto, $fields, $filters);
        if (!$this->isGranted('ROLE_ADMIN')) {
            $response->where('entity.id = :id');
            $response->setParameter('id', $this->getUser()->getOperateur());
        }

        return $response;
    }

    public function updateEntity(EntityManagerInterface $entityManager, $entityInstance): void
    {
        parent::updateEntity($entityManager, $entityInstance); // TODO: Change the autogenerated stub
    }
}

我尝试使用 EasyAdminSubscriber 和 BeforeEntityUpdatedEvent; 但它没有用。 我的印象是 updateOperateur 函数从未执行过。 这是我的 EasyAdminSubscriber.php 文件:

<?php

namespace App\EventSubscriber;

use App\Entity\User;
use App\Entity\Operateur;
use App\Entity\OperateurTemp;
use Doctrine\ORM\EntityManagerInterface;
use EasyCorp\Bundle\EasyAdminBundle\Event\BeforeEntityPersistedEvent;
use EasyCorp\Bundle\EasyAdminBundle\Event\BeforeEntityUpdatedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;

class EasyAdminSubscriber implements EventSubscriberInterface
{

    private $entityManager;
    private $passwordEncoder;

    public function __construct(EntityManagerInterface $entityManager, UserPasswordEncoderInterface $passwordEncoder)
    {
        $this->entityManager = $entityManager;
        $this->passwordEncoder = $passwordEncoder;
    }

    public static function getSubscribedEvents()
    {
        return [
            BeforeEntityPersistedEvent::class => ['addUser'],
            BeforeEntityUpdatedEvent::class => ['updateUser'],
            BeforeEntityUpdatedEvent::class => ['updateOperateur'],
        ];
    }

    public function updateUser(BeforeEntityUpdatedEvent $event)
    {
        $entity = $event->getEntityInstance();

        if (!($entity instanceof User)) {
            return;
        }
        $this->setPassword($entity);
    }

    public function updateOperateur(BeforeEntityUpdatedEvent $event)
    {
        $entity = $event->getEntityInstance();
        if (!($entity instanceof Operateur)) {
            return;
        }
        $this->setOperateurTemp($entity);
    }

    public function addUser(BeforeEntityPersistedEvent $event)
    {
        $entity = $event->getEntityInstance();

        if (!($entity instanceof User)) {
            return;
        }
        $this->setPassword($entity);
    }

    /**
     * @param User $entity
     */
    public function setPassword(User $entity): void
    {
        $pass = $entity->getPassword();

        $entity->setPassword(
            $this->passwordEncoder->encodePassword(
                $entity,
                $pass
            )
        );
        $this->entityManager->persist($entity);
        $this->entityManager->flush();
    }

    /**
     * @param Operateur $entity
     */
    public function setOperateurTemp(Operateur $entity): void
    {
        $operator_temp = new OperateurTemp();

        $operator_temp->setName($entity->getName());
        $operator_temp->setDescription($entity->getDescription());
        $operator_temp->setLatitude($entity->getLatitude());
        $operator_temp->setLongitude($entity->getLongitude());

        var_dump($entity);
        var_dump($operator_temp);

        $this->entityManager->persist($operator_temp);
        $this->entityManager->flush();
    }
}

我也一直在检查 EasyAdminBundle 文件中的 AbstractCrudController.php 文件来检查主编辑、新建等功能,以了解如何检索表单值或如何获取表单及其属性,但没有成功。

如果有人知道如何在 EasyAdmin 3 中获取编辑表单及其值,我们将不胜感激。

提前致谢

我不能评论,所以我回答。 这是我的建议。

使用 BeforeEntityUpdatedEvent。 创建一个验证布尔字段,如果 role = ROLE_EDITOR,则将其设置为 false。

ROLE_ADMIN 必须能够看到这个验证字段并且只需要更改它。 因此,在您的实体中添加可为空字段,并在控制器中添加:

  BooleanField::new('Validate')->setPermission('ROLE_ADMIN')

完成后,设置您的 BeforeEntityPersistedEvent

public function prePostChargeActuelle(BeforeEntityPersistedEvent $event){

    $entity=$event->getEntityInstance();

    $user = $this->getUser();
    $userRole = $user->getRole();

    if ($entity instanceof Operateur) {

           if($userRole == "ROLE_EDITOR){
                    $entity->setValidate(false);
             }
    }

为了防止这些非验证操作符显示在错误用户的 crud 中,请在您的存储库中创建:

 public function getValidateOperator($user,$role)
    {
      if($role == "ROLE_ADMIN"){
        return $this->createQueryBuilder('t')
          ->select('t')
          ->andWhere('t.validate = false')
          ->orderBy('t.id', 'DESC')
          ->setMaxResults(5)
          ->getQuery()
          ->getResult()
          ;
      }elseif($role == "ROLE_EDITOR"){
        return $this->createQueryBuilder('t')
        ->select('t')
        ->andWhere('t.validate = false')
        ->orderBy('t.id', 'DESC')
        ->setMaxResults(5)
        ->getQuery()
        ->getResult()
          ;
      }

在您的 crudController 字段中添加它以显示它:

TextField::new('getNonValidateOperator'),

因此,您的验证对象只能由编辑器或您想要的任何其他角色可见,而 no validate 只能由管理员可见,管理员必须对其进行验证。 我的代码可能包含一些错误并且可以更好/更干净,我很快就做到了。 如果您有什么不明白的地方,请随时问我!

您是否考虑过不同的方法来实现这一目标? 也许您应该创建另一个类 (OperatorEdited),它将使用附加的布尔值扩展运算符类,例如 $isValid。 然后在您的操作员 CRUD 控制器中,而不是更新操作员的当前实例,而是使用 $isValided = false 创建一个新的 OperatorEdit 实例。 您将分离这些数据。

在另一个编辑器验证 Operator 实例的版本(当前存储为 OperatorEdit)之后,您将覆盖它并从 DB 中删除 OperatorEdit 实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM