authorizationHelper->getReachableCenters($this->getUser(), PersonVoter::CREATE); $dto = $this->personCreateDTOFactory->createPersonCreateDTO($person); if (1 === \count($authorizedCenters)) { $dto->center = $authorizedCenters[0]; } $form = $this->createForm(CreationPersonType::class, $dto) ->add('editPerson', SubmitType::class, [ 'label' => 'Add the person', ])->add('createPeriod', SubmitType::class, [ 'label' => 'Add the person and create an accompanying period', ])->add('createHousehold', SubmitType::class, [ 'label' => 'Add the person and create a household', ]); $form->handleRequest($request); if (Request::METHOD_GET === $request->getMethod()) { $this->lastPostDataReset($session); } elseif ( Request::METHOD_POST === $request->getMethod() && $form->isValid() ) { $alternatePersons = $this->similarPersonMatcher ->matchPerson($person); $createHouseholdButton = $form->get('createHousehold'); $createPeriodButton = $form->get('createPeriod'); $editPersonButton = $form->get('editPerson'); if (!$createHouseholdButton instanceof ClickableInterface) { throw new \UnexpectedValueException(); } if (!$createPeriodButton instanceof ClickableInterface) { throw new \UnexpectedValueException(); } if (!$editPersonButton instanceof ClickableInterface) { throw new \UnexpectedValueException(); } if ( false === $this->isLastPostDataChanges($form, $request, $session) || 0 === \count($alternatePersons) ) { $this->personCreateDTOFactory->mapPersonCreateDTOtoPerson($dto, $person); $this->em->persist($person); $this->em->flush(); $this->lastPostDataReset($session); $address = $dto->address; $addressForm = $dto->addressForm; if (null !== $address && $addressForm) { $household = new Household(); $member = new HouseholdMember(); $member->setPerson($person); $member->setStartDate(new \DateTimeImmutable()); $household->addMember($member); $household->setForceAddress($address); $this->em->persist($member); $this->em->persist($household); $this->em->flush(); if ($createHouseholdButton->isClicked()) { return $this->redirectToRoute('chill_person_household_members_editor', [ 'persons' => [$person->getId()], 'household' => $household->getId(), ]); } } if ($createPeriodButton->isClicked()) { return $this->redirectToRoute('chill_person_accompanying_course_new', [ 'person_id' => [$person->getId()], ]); } if ($createHouseholdButton->isClicked()) { return $this->redirectToRoute('chill_person_household_members_editor', [ 'persons' => [$person->getId()], ]); } return $this->redirectToRoute( 'chill_person_general_edit', ['person_id' => $person->getId()] ); } } elseif (Request::METHOD_POST === $request->getMethod() && !$form->isValid()) { $this->addFlash('error', $this->translator->trans('This form contains errors')); } return $this->render( '@ChillPerson/Person/create.html.twig', [ 'form' => $form->createView(), 'alternatePersons' => $alternatePersons ?? [], ] ); } private function isLastPostDataChanges(FormInterface $form, Request $request, SessionInterface $session): bool { if (!$session->has('last_person_data')) { return true; } $newPost = $this->lastPostDataBuildHash($form, $request); $isChanged = $session->get('last_person_data') !== $newPost; $session->set('last_person_data', $newPost); return $isChanged; } /** * build the hash for posted data. * * For privacy reasons, the data are hashed using sha512 */ private function lastPostDataBuildHash(FormInterface $form, Request $request): string { $fields = []; $ignoredFields = ['form_status', '_token', 'identifiers']; foreach ($request->request->all()[$form->getName()] as $field => $value) { if (\in_array($field, $ignoredFields, true)) { continue; } $fields[$field] = \is_array($value) ? \implode(',', $value) : $value; } ksort($fields); return \hash('sha512', \implode('&', $fields)); } private function lastPostDataReset(SessionInterface $session): void { $session->set('last_person_data', ''); } }