Добавить преобразователь модели, который преобразует несколько полей во встроенной форме - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь прочитать \DateInterval из 2 полей ввода, как показано ниже:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('name', TextType::class, ['label' => "Name"])
        ->add('duration', DateIntervalType::class, ['label' => false])
    ;
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(['data_class' => NamedInterval::class]);
}

Вот мой DateIntervalType::buildForm:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('amount', IntegerType::class)
        ->add('kind', ChoiceType::class, ['choices' => ['Year' => 'Y', 'Month' => 'M', 'Week' => 'W']])
    ;
}

А вот преобразователь Iпопытка:

$builder->get('duration')->addModelTransformer(new CallbackTransformer(
    function ($property) {
        return new \DateInterval('P' . $property['amount'] . $property['kind']);
    },
    function ($property) {
        /* compute $specString from $property assuming it's a \DateInterval */
        /* ... */
        return ['amount' => 1, 'kind' => 'W'];
    }
));

Следовательно, это не работает, мой $property всегда null после проверки формы при преобразовании данных формы в \DateInterval, и я даже не уверен, что когда-либо использовалпреобразователь из \DateInterval для формирования данных, что я делаю не так?

1 Ответ

1 голос
/ 23 апреля 2019

Похоже, что CallbackTransformer инвертировано:

$builder->get('duration')->addModelTransformer(new CallbackTransformer(
    function ($property) {
        /* compute specString from $property assuming it's a \DateInterval */
        /* ... */
        return ['amount' => 1, 'kind' => 'W'];
    },
    function ($property) {
        if (!$property) return null;
        return new \DateInterval('P' . $property['amount'] . $property['kind']);
    }
));

Теперь это работает как шарм!

РЕДАКТИРОВАТЬ: поскольку \DateInterval преобразует недели в дни, в списке параметров также должна быть опция 'Day' => 'D'.

...