The problem
I was making some improvements to the
PlanIT project that I'm redesigning all the source code to work with
AngularJS and
Symfony.
In the project I have some date time forms parameters that are sent in JSON like this :
{"user":1,"name":"Test project #3","description":"Test project #3","begin":"2012-12-12 10:00:00","end":"2013-12-12 10:00:00"}
I wanted to use Symfony form validation to valid my fields and save the entity to database. I used the FOS Rest Bundle in my project to get the form parameters this way :
$project["name"] = $request->request->get('name');
$project["description"] = $request->request->get('description');
$project["begin"] = $request->request->get('begin');
$project["end"] = $request->request->get('end');
$form->bind($project);
if ($form->isValid()) {
// Save entity
}
The problem I had is that the Datetime parameters was just ignored and transformed to null values.
The solution
After some researches online, I found that you need to generate the bound datetime form value in a different manner : the object should have defined the year, month, day, hour, minute and seconds separately in order to be bound successfully. So there is the solution I opted for :
$project["name"] = $request->request->get('name');
$project["description"] = $request->request->get('description');
$tmpDatetime = new \DateTime($request->request->get('begin'));
$project["begin"] = array();
$project["begin"]["year"] = $tmpDatetime->format('Y');
$project["begin"]["month"] = $tmpDatetime->format('m');
$project["begin"]["day"] = $tmpDatetime->format('d');
$project["begin"]["hour"] = $tmpDatetime->format('H');
$project["begin"]["minute"] = $tmpDatetime->format('i');
$project["begin"]["second"] = $tmpDatetime->format('s');
$tmpDatetime = new \DateTime($request->request->get('end'));
$project["end"] = array();
$project["end"]["year"] = $tmpDatetime->format('Y');
$project["end"]["month"] = $tmpDatetime->format('m');
$project["end"]["day"] = $tmpDatetime->format('d');
$project["end"]["hour"] = $tmpDatetime->format('H');
$project["end"]["minute"] = $tmpDatetime->format('i');
$project["end"]["second"] = $tmpDatetime->format('s');
$form->bind($project);
if ($form->isValid()) {
// Save Entity
}
I hope that this will help you to bind date and datetime base JSON parameters to your Symfony form.
Greetings.