CraueForm : doctrine veut enregistrer la classe "form data class"
Bonjour,
J'essaye de créer un formulaire avec plusieurs étapes et j'ai été conseillé sur ce forum à utiliser Craue Form Bundle :)
Tout marche magnifiquement bien sauf à l'étape où je sauvegarde mes entités ... En gros j'ai :
1) une classe "form data class" telle que :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| <?php
namespace VS\CrmBundle\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use VS\CrmBundle\Entity\MedicalRecord;
use VS\CrmBundle\Entity\Person;
use VS\CrmBundle\Entity\Relationship;
use Doctrine\ORM\Mapping as ORM;
/**
*
* Class AddChildWizard
* @package VS\CrmBundle\Entity
*/
class AddChildWizard
{
/**
* Step 1
*
* @var Relationship
*/
protected $currenUserChildRelationship;
/**
* Step 1
*
* @var Person
*/
protected $child;
/**
* Step 2
*
* @var MedicalRecord
*/
protected $childsMedicalRecord;
/**
* Step 3
*
* This is a collection of Relationship entities
*
* @var ArrayCollection
*/
protected $childsFamily;
public function __construct()
{
$this->childsFamily = new ArrayCollection();
} |
J'ai mon flow qui est :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
<?php
namespace VS\CrmBundle\Form\Wizard\AddChild;
use Craue\FormFlowBundle\Form\FormFlow;
use Craue\FormFlowBundle\Form\FormFlowInterface;
class AddChildFlow extends FormFlow {
protected function loadStepsConfig()
{
return array(
array(
'label' => 'ChildData',
'form_type' => 'VS\CrmBundle\Form\Wizard\AddChild\AddChildStep1'
),
array(
'label' => 'ChildMedicalRecord',
'form_type' => 'VS\CrmBundle\Form\Wizard\AddChild\AddChildStep2'
),
array(
'label' => 'ChildFamily',
'form_type' => 'VS\CrmBundle\Form\Wizard\AddChild\AddChildStep3'
),
array(
'label' => 'confirmation',
),
);
}
} |
Un exemple de formulaire avec le formulaire pour l'étape 1
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| <?php
namespace VS\CrmBundle\Form\Wizard\AddChild;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use VS\CrmBundle\Entity\Person;
use VS\CrmBundle\Entity\Relationship;
use VS\CrmBundle\Form\PersonChildType;
use VS\CrmBundle\Form\RelationshipFromCurrentUserType;
class AddChildStep1 extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('currenUserChildRelationship', RelationshipFromCurrentUserType::class, array(
'data_class' => Relationship::class
))
->add('child', PersonChildType::class, array(
'data_class' => Person::class
));
}
public function getBlockPrefix()
{
return 'AddChildStep1';
}
} |
et enfin mon action :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| public function addChildAction()
{
// Our form data class
$formData = new AddChildWizard();
// We call service (craue form flow)
$flow = $this->get('vs_crm.form.flow.add_child');
$flow->bind($formData);
$form = $flow->createForm();
if($flow->isValid($form))
{
$flow->saveCurrentStepData($form);
if($flow->nextStep())
{
$form = $flow->createForm();
}
else
{
$child = $formData->getChild();
$curentUserRel = $formData->getCurrenUserChildRelationship();
$currentUser = $this->get('security.token_storage')->getToken()->getUser();
$medicalRecord = $formData->getChildsMedicalRecord();
$family = $formData->getChildsFamily();
$curentUserRel->setSourceId($child);
$curentUserRel->setDestinationId($currentUser);
$medicalRecord->setPerson($child);
foreach($family as $member)
{
$member->setSourceId($child);
}
//return new JsonResponse(array($formData->getId()));
// flow finished
$em = $this->getDoctrine()->getManager();
$em->persist($formData);
$em->flush();
$flow->reset();
$this->addFlash('success', 'Your child has been saved.');
return $this->redirectToRoute('vs_crm_parent_dashboard');
}
}
return $this->render('VSCrmBundle:Parent:add-child.html.twig', array(
'form' => $form->createView(),
'flow' => $flow
));
} |
Tout est merveilleux jusqu'à ce que j'arrive à la dernière étape et que j'appuie sur Sauvegarder ! Doctrine me dit :
Citation:
Class "VS\CrmBundle\Entity\AddChildWizard" is not a valid entity or mapped super class.
et si je met les anotations @Entity Doctrine m'obllige à mettre un identifiant et à en faire une table de ma classe :( La table contient juste un identifiant que notre ami Doctrine veut à tout prix.
La question est : y a-t-il une autre manière de faire ou dois-je écouter céder aux caprices de Doctrine et le laisser faire sa table avec une seule colonne étant l'identifiant ?
Ok j'ai trouvé d'ou vient l'erreur. Au lieu de faire $em->persist($formData) il faut faire persist sur chaque entité contenue dans le formData.