php - Symfony 2. Controller's createForm does not bind Model to submodels -
i have 2 models, , 2 types. formtype "eventschedule" subform of "event". when tried use $this->createform(new eventtype(), $event);
in controller, got form eventschedules(that part of event) have no links related events.
/** * event * * @orm\table() * @orm\entity(repositoryclass="voulidance\sharedbundle\repository\eventrepository") */ class event extends baseentity { /** * @var integer * * @orm\column(name="id", type="integer") * @orm\id * @orm\generatedvalue(strategy="auto") */ private $id; /** * * @var string * * @orm\column(name="name", type="string", length=255) * @assert\length(max = "50", maxmessage="the value long. should have maximum {{ limit }} characters") * @assert\notblank() */ private $name; /** * * @var \datetime * * @orm\column(name="start_date", type="datetime") * @assert\datetime(message = "the date should in format 'mm/dd/yyyy'.") * @assert\notblank(message = "start date field should not blank.") */ private $startdate; /** * * @var \datetime * * @orm\column(name="end_date", type="datetime") * @assert\datetime(message = "the date should in format 'mm/dd/yyyy'.") * @assert\notblank(message = "end date field should not blank.") */ private $enddate; /** * @orm\onetomany(targetentity="eventschedule", mappedby="event", cascade={"persist"}) * @orm\orderby({"dayofweek" = "asc", "starttime" = "asc"}) */ protected $eventschedules; public function __construct() { $this->eventschedules = new arraycollection(); } public function getid() { return $this->id; } public function getname() { return $this->name; } public function getstartdate() { return $this->startdate; } public function getenddate() { return $this->enddate; } public function geteventschedules() { return $this->eventschedules; } public function setid($id) { $this->id = $id; } public function setname($name) { $this->name = $name; } public function setstartdate($startdate) { $this->startdate = $startdate; } public function setenddate($enddate) { $this->enddate = $enddate; } public function seteventschedules($eventschedules) { $this->eventschedules = $eventschedules; } public function addeventschedule(eventschedule $eventschedule) { $this->eventschedules->add($eventschedule); } public function removeeventschedule(eventschedule $eventschedule) { $this->eventschedules->removeelement($eventschedule); } /** * eventschedule * * @orm\table() * @orm\entity(repositoryclass="voulidance\sharedbundle\repository\eventschedulerepository") */ class eventschedule extends baseentity{ /** * @var integer * * @orm\column(name="id", type="integer") * @orm\id * @orm\generatedvalue(strategy="auto") */ private $id; /** * @var \datetime * * @orm\column(name="starttime", type="time", nullable=true) * @assert\time() * @assert\notblank(message="please, fill in fields.") */ private $starttime; /** * @var \datetime * * @orm\column(name="endtime", type="time", nullable=true) * @assert\time() * @assert\notblank(message="please, fill in fields.") */ private $endtime; /** * @var integer * * @orm\column(name="dayofweek", type="integer") * @assert\notblank(message="please, fill in fields.") */ private $dayofweek; /** * @orm\manytoone(targetentity="event", inversedby="eventschedules") * @orm\joincolumn(name="event_id", referencedcolumnname="id") * @assert\valid * @assert\notblank(message="please, fill in fields.") */ protected $event; //assert\notblank(message="please, fill in fields.") public function getid() { return $this->id; } public function getstarttime() { return $this->starttime; } public function getendtime() { return $this->endtime; } public function getdayofweek() { return $this->dayofweek; } public function getevent() { return $this->event; } public function setid($id) { $this->id = $id; return $this; } public function setstarttime($starttime) { $this->starttime = $starttime; return $this; } public function setendtime($endtime) { $this->endtime = $endtime; return $this; } public function setdayofweek($dayofweek) { $this->dayofweek = $dayofweek; return $this; } public function setevent($event) { $this->event = $event; return $this; } } class eventtype extends abstracttype{ public function buildform(formbuilderinterface $builder, array $options){ $builder->add('name', null, array( 'label' => false, 'attr' => array('id'=>"page-name", 'size'=>"24", 'class'=>'auth'), 'required'=>true ))->add('startdate', 'date', array( 'widget' => 'single_text', 'label' => false, 'format' => 'mm/dd/yyyy', 'invalid_message' => "start date format should 'mm/dd/yyyy'.", 'attr' => array('data-date'=>"", 'placeholder'=>"mm/dd/yyyy", 'size'=>"18",'class'=>"auth date holiday-start-date hasdatepicker", 'id'=>"holiday-start-date") ))->add('enddate', 'date', array( 'widget' => 'single_text', 'label' => false, 'format' => 'mm/dd/yyyy', 'invalid_message' => "end date format should 'mm/dd/yyyy'.", 'attr' => array('data-date'=>"", 'placeholder'=>"mm/dd/yyyy", 'size'=>"18",'class'=>"auth date holiday-start-date hasdatepicker", 'id'=>"holiday-start-date") ))->add('eventschedules', 'collection', array( 'type' => new eventscheduletype(), 'cascade_validation' => true, 'allow_add' => true, 'allow_delete' => true, 'by_reference' => false, 'label' => false, 'error_bubbling'=>false ))->add('id', 'hidden'); } public function setdefaultoptions(optionsresolverinterface $resolver) { $resolver->setdefaults(array( 'data_class' => 'voulidance\sharedbundle\entity\event', 'cascade_validation' => false, 'validation_groups' => false )); } public function getname() { return 'event'; } } class eventscheduletype extends abstracttype { public function buildform(formbuilderinterface $builder, array $options) { $builder->add('starttime', 'us_time', array( 'widget' => 'text', 'label' => 'from', 'attr' => array('maxlength' => '2', 'placeholder' => 'hh:mm'), 'invalid_message' => 'time value not valid.', 'error_bubbling' => false ))->add('endtime', 'us_time', array( 'widget' => 'text', 'label' => 'to', 'attr' => array('maxlength' => '2', 'placeholder' => 'hh:mm'), 'invalid_message' => 'time value not valid.', 'error_bubbling' => false ))->add('dayofweek', 'choice', array( 'choices' => array( 1 => 'everyday', 2 => 'sunday', 3 => 'monday', 4 => 'tuesday', 5 => 'wednesday', 6 => 'thursday', 7 => 'friday', 8 => 'saturday', ), 'label' => false, 'attr' => array('size'=>'15'), 'multiple' => false, 'error_bubbling' => false ))->add('id', 'hidden', array('label' => false)); } public function setdefaultoptions(optionsresolverinterface $resolver) { $resolver->setdefaults(array( 'data_class' => 'voulidance\sharedbundle\entity\eventschedule', 'cascade_validation' => false, 'validation_groups' => false )); } public function getname() { return 'eventschedule'; } } /** * save event * * @route("/save", name="admin_event_save") * @template("voulidanceadminbundle:event:index.html.twig") */ public function saveaction(request $request) { $em = $this->getdoctrine()->getmanager(); $eventrepository = $em->getrepository("voulidancesharedbundle:event"); $event = new event(); $form = $this->createform(new eventtype(), $event); $form->handlerequest($request); $schedules = $form->get('eventschedules')->getdata(); foreach($schedules $schedule){ $schedule->setevent($event); } if ($form->isvalid()) { $errors = $this->validateschedules($schedules); if(count($errors) > 0){ return new jsonresponse(array('subformerror'=>true, 'errors'=>$errors)); } $em->persist($event); $em->flush(); return new jsonresponse(array('success' => true, 'events'=>$eventrepository->findall())); } return new jsonresponse(array('error' => true, 'errors'=>(string)$form->geterrors(true))); }
although can't test code right now, think can see problem , answer question maybe can work on it.
$schedules = $form->get('eventschedules')->getdata();
should be:
$schedules = $event-> geteventschedules();
because need mapped data $form->handlerequest($request); filling $event object.
Comments
Post a Comment