Witam,
kiedyś przeczytałem ten artykuł: http://https://blog.martinhujer.cz/symfony-forms-with-request-objects . Od tamtego czasu staram się używać w wszelkich formularzach właśnie modeli zamiast operować na encjach, lecz w obecnym projekcie jedna z encji jest klasą abstrakcyjną, którą wykorzystuję w kilku innych encjach. Zrobiłem też do tego modele, które działają w podobny sposób. Formularz stworzony za pomocą symfony forms wykorzystuje javascript, aby dynamicznie dodawać odpowiednie pola do formularza w zależności od tego jaki typ aktywności wybierze użytkownik. Z racji tego, że formularz ten w zależności od właśnie typu aktywności musi zwracać dane raz jednej klasy, a raz innej zostałem zmuszony do ustawienia data_class w formularzu na null. Wszystko działa jak należy, lecz mój problem pojawia się przy formularzu edycji, a raczej akcji edycji w kontrolerze, ponieważ normalnie bez używania modelu zrobiłbym to tak:
/** * @Route("/admin/activity/edit/{id}", name="admin_activity_edit", methods={"POST", "GET"}) */ public function edit(AbstractActivity $activity, Request $request, EntityManagerInterface $em) { $form = $this->createForm(ActivityFormType::class, $activity); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $activity = $form->getData(); $em->persist($activity); $em->flush(); $this->addFlash('success', 'Activity is updated!'); return $this->redirectToRoute('admin_activity_edit', [ 'id' => $activity->getId(), ]); } return $this->render('admin_activity/edit.html.twig', [ 'activityForm' => $form->createView() ]); }
//before I take entity Activity which user want update and by switch bind it to right Model class //of course model must implements /ArrayAccess in this case $form = $this->createForm(ActivityFormType::class, $activityFormModel); $form->handleRequest($request); if($request->isMethod('POST'){ $errors = $validator->validate($activityModel)' if (count($errors) > 0) { foreach ($errors as $error) { $formError = new FormError($error->getMessage()); $form->get($error->getPropertyPath())->addError($formError); } }else { if ($form->isSubmitted() && $form->isValid()) { $activityModel = $form->getData(); dd($activityModel); //bind model data back to entity and flush here return $this->redirectToRoute('admin_activity_edit', [ 'id' => $activity->getId(), ]); } } return $this->render('admin_activity/edit.html.twig', [ 'activityForm' => $form->createView() ]);
if ($form->isSubmitted() && $form->isValid()) { $data = $form->getData(); switch ($data['type']) { case 'Movement': $dataModel = ArrayConverter::toObject($data, new MovementActivityFormModel()); break; case 'Weight': $dataModel = ArrayConverter::toObject($data, new WeightActivityFormModel()); break; } $errors = $validator->validate($dataModel); if (http://www.php.net/count($errors) > 0) { foreach ($errors as $error) { $formError = new FormError($error->getMessage()); $form->get($error->getPropertyPath())->addError($formError); } return $this->render('admin_activity/add.html.twig', [ 'activityForm' => $form->createView(), ]); }
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)