EasyAdmin автоматически устанавливает поле при создании / обновлении

#symfony4

#symfony4

Вопрос:

Я очень новичок в symfony, и у меня есть уже наполовину готовый проект со многими объектами, которыми можно управлять с помощью пакета easyadmin от symfony, и различные действия, связанные с этими объектами, одинаковы, и они записаны внутри одного контроллера: AdminController.php Я заметил, что NewAction() отсутствует вэтот файл, поэтому я предполагаю, что мы используем тот, который упоминается здесь по умолчанию: https://github.com/EasyCorp/EasyAdminBundle/blob/1.x/src/Controller/AdminController.php

Мой вопрос: у меня есть специальная сущность «schooltrip» со многими полями, среди которых: departurelocation, arrivallocation, schooltripdate, supervisorname. Я помещу ниже свой файл admin.yml. Недавно меня попросили добавить новое поле SchoolTripIdentifier, которое должно быть автоматически установлено на основе вышеуказанных полей, чтобы SchoolTripIdentifier = supervisorname-schooltripdate-departurelocation-arrivallocation До этого момента, и на основе того, что я добавил в admin.yml, я вижу это поле в представлении списка и в представлениях редактирования и созданияэтого объекта. Я хочу автоматически устанавливать это поле при создании / обновлении объекта. Для обновления я добавил следующий код в editAction() , так что теперь, когда я впервые вхожу в режим редактирования определенной школьной поездки, я вижу, что SchoolTripIdentifier автоматически устанавливается и содержит правильное значение, однако я думаю, что код неуместен, потому что, если при обновлении школьной поездки яизмените имя супервизора например, SchoolTripIdentifier не изменяется и по-прежнему сохраняет старое имя супервизора. Итак, это для части обновления, теперь для создания в AdminController нет NewAction(), есть только следующие методы: DeleteAction , searchAction, editAction, updateEntityProperty, existAlias, createSearchQueryBuilder, executeDynamicMethod, findBy должен ли я создать один NewAction() в моем контроллере? если да, что я должен поместить в него? Если нет, что я могу сделать вместо этого, чтобы установить поле при создании объекта? Должен ли я создать подписчика события?

Ps: пожалуйста, скажите мне, должен ли я добавить persist в код, связанный с SchoolTripIdentifier, вместе с flush().

Admin.php Часть редактирования :

  protected function editAction()
    {
        $this->dispatch(EasyAdminEvents::PRE_EDIT);

        $id = $this->request->query->get('id');
        $easyadmin = $this->request->attributes->get('easyadmin');
        $entity = $easyadmin['item'];
        /********************************my part : set SchoolTripIdentifier  **/
        $entity_name = $this->entity['name'];
        if($entity_name amp;amp; $entity_name == "schooltrip"){
        /** @var schooltrip $schooltrip*/
        $schooltrip= $this->em->getRepository('SchoolBundle:schooltrip')->find($entity);
        $supervisorname= $schooltrip->getSupervisor()->getName();
        $departurelocation= $schooltrip->gettripdeparture();
        $arrivallocation= $schooltrip->gettriparrival();
        $schooltripdate= $schooltrip->getschooltripDate()->format('d/m/y');
        $SchoolTripIdentifier =  $supervisorname.$arrivallocation.$departurelocation. $schooltripdate; 
        $schooltrip->setSchoolTripIdentifier ($SchoolTripIdentifier );
        $this->em->flush($schooltrip); 
        }
        /*********************************end of my part : set SchoolTripIdentifier  **/     
        if ($this->request->isXmlHttpRequest() amp;amp; $property = $this->request->query->get('property')) {
            $newValue = 'true' === mb_strtolower($this->request->query->get('newValue'));
            $fieldsMetadata = $this->entity['list']['fields'];

            if (!isset($fieldsMetadata[$property]) || 'toggle' !== $fieldsMetadata[$property]['dataType']) {
                throw new InvalidArgumentException(sprintf('The type of the "%s" property is not "toggle".', $property));
            }

            $this->updateEntityProperty($entity, $property, $newValue);

            return new Response((string)$newValue);
        }

        $fields = $this->entity['edit']['fields'];

        $editForm = $this->executeDynamicMethod('create<EntityName>EditForm', array($entity, $fields));
        $deleteForm = $this->createDeleteForm($this->entity['name'], $id);

        $editForm->handleRequest($this->request);
        if ($editForm->isSubmitted() amp;amp; $editForm->isValid()) {
            $this->dispatch(EasyAdminEvents::PRE_UPDATE, array('entity' => $entity));
            try {
                $this->executeDynamicMethod('update<EntityName>Entity', array($entity));
                $this->em->flush();
            } catch (ForeignKeyConstraintViolationException $e) {
                $this->addFlash('error', $this->get('translator')->trans('common.exception.update_violation_constraint'));

            }

            $this->dispatch(EasyAdminEvents::POST_UPDATE, array('entity' => $entity));

            $refererUrl = $this->request->query->get('referer', '');

            return !empty($refererUrl)
                ? $this->redirect(urldecode($refererUrl))
                : $this->redirect($this->generateUrl('easyadmin', array('action' => 'list', 'entity' => $this->entity['name'])));
        }

        $this->dispatch(EasyAdminEvents::POST_EDIT);

        return $this->render($this->entity['templates']['edit'], array(
            'form' => $editForm->createView(),
            'entity_fields' => $fields,
            'entity' => $entity,
            'delete_form' => $deleteForm->createView(),
        ));
    }

    /**
     * It updates the value of some property of some entity to the new given value.
     *
     * @param mixed $entity The instance of the entity to modify
     * @param string $property The name of the property to change
     * @param bool $value The new value of the property
     * @throws DoctrineORMOptimisticLockException
     * @throws Throwable
     * @throws TypeError
     */
    protected function updateEntityProperty($entity, $property, $value)
    {
        $entityConfig = $this->entity;

        // the method_exists() check is needed because Symfony 2.3 doesn't have isWritable() method
        if (method_exists($this->get('easyadmin.property_accessor'), 'isWritable') amp;amp; !$this->get('easyadmin.property_accessor')->isWritable($entity, $property)) {
            throw new UnexpectedValueException(sprintf('The "%s" property of the "%s" entity is not writable.', $property, $entityConfig['name']));
        }

        $this->dispatch(EasyAdminEvents::PRE_UPDATE, array('entity' => $entity, 'newValue' => $value));

        $this->get('easyadmin.property_accessor')->setValue($entity, $property, $value);
        try {
            $this->em->persist($entity);
            $this->em->flush();
        } catch (ForeignKeyConstraintViolationException $e) {
            $this->addFlash('error', $this->get('translator')->trans('common.exception.update_violation_constraint'));

        }

        $this->dispatch(EasyAdminEvents::POST_UPDATE, array('entity' => $entity, 'newValue' => $value));

        $this->dispatch(EasyAdminEvents::POST_EDIT);
    }




 

и вот мой admin.yml:

         schooltrip:
            label: "school trips"
            class: SchoolBundleEntityschooltrip
            form:
                fields:
                   - { property: 'supervisorname', label: "Supervisor" }
                   - { property: 'departurelocaltion', label: "Departure" }
                   - { property: 'arrivallocaltion', label: "Arrival" }
                   - { property: 'tripdate', label: "Date" }
                   - { property: 'SchoolTripeIdentifier', label: "SchoolTripeIdentifier" }

            edit:
                fields: ['supervisorname','departurelocaltion','tripdate','SchoolTripeIdentifier','arrivallocaltion']
            list:
                title: "listing school trips"
                fields:
                   - { property: 'supervisorname', label: "Supervisor" }
                   - { property: 'departurelocaltion', label: "Departure" }
                   - { property: 'arrivallocaltion', label: "Arrival" }
                   - { property: 'tripdate', label: "Date" }
                   - { property: 'SchoolTripeIdentifier', label: "SchoolTripeIdentifier" }
            templates:
                    list: "SchoolBundle:Admin:list.html.twig"
            search:
                fields:
                   - { property: 'supervisorname', label: "Supervisor" }
                   - { property: 'departurelocaltion', label: "Departure" }
                   - { property: 'arrivallocaltion', label: "Arrival" }
                   - { property: 'tripdate', label: "Date" }
                   - { property: 'SchoolTripeIdentifier', label: "SchoolTripeIdentifier" }

 

Комментарии:

1. Я думаю, было бы лучше создать подписчика