I'm using a DataMapper as per docs: https://symfony.com/doc/current/form/data_mappers.html to update a date from 1 of 3 fields in the form:
Form Class
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('period_start_daily', DateType::class, [
'widget' => 'single_text',
'label' => 'Day',
'html5' => false,
'attr' => ['class' => 'js-datepicker'],
'mapped' => false,
'required' => false
])
->add('period_start_weekly', DateType::class, [
'widget' => 'single_text',
'label' => 'Week',
'html5' => false,
'attr' => ['class' => 'js-datepicker'],
'mapped' => false,
'required' => false
])
->add('period_start_monthly', ChoiceType::class, [
'required' => true,
'label' => 'Month',
'choice_loader' => new CallbackChoiceLoader(function () {
$months = [];
for ($i = 0; $i <= 12; $i++) {
$month = strtotime('first day of this month + ' . $i . ' months');
$months[date('M Y', $month)] = date('Y-m-d', $month);
}
return $months;
}),
'mapped' => false,
'required' => false
])
...
$builder
->setDataMapper($this);
...
public function mapFormsToData($forms, &$data)
{
/** @var FormInterface[] $forms */
$forms = iterator_to_array($forms);
switch (intval($forms['Type']->getViewData())){
case 1:
$start = $forms['period_start_daily']->getNormData();
$end = clone $start;
break;
case 2:
$start = $forms['period_start_weekly']->getNormData();
$end = clone $start;
$end->add(new \DateInterval('P6D'));
break;
case 3:
$start = $forms['period_start_daily']->getNormData();
$end = (new \DateTime(
strtotime($this->getData()['period_start_monthly']->format('Y-m-d').' last day of month')
));
break;
}
$data = (new DataSet())
->setPeriodStart($start)
->setPeriodEnd($end)
->setType($forms['Type']->getNormData())
->setUpload($forms['upload']->getNormData());
Controller
$form = $this->createForm(DataSetType::class, $dataset);
$form->handleRequest($request->getCurrentRequest());
if ($form->isSubmitted() && $form->isValid()){
$dataset
->setPeriodStart($form->getNormData()->getPeriodStart())
->setPeriodEnd($form->getNormData()->getPeriodEnd());
$dataset->setType($form->getNormData()->getType());
$dataset->setActive(false);
$dataset->setUpload($form->getNormData()->getUpload());
$dataset->getPeriodStart()->setTime(0, 0, 0);
$dataset->getPeriodEnd()->setTime(0, 0, 0);
$em->persist($dataset);
$em->flush();
I expected the DataMapper to update my object directly, however I still have to copy over the data from $form->getNormData().
Symfony version is 4.2


