#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. Я думаю, было бы лучше создать подписчика