У меня есть задача показать пользователю дату окончания срока действия страницы. Для этого я создал тип формы, который содержит два поля, первое из которых позволяет выбирать между 1 неделей, 1 месяцем и 1 годом и обычаем. если клиент выбирает пользовательский, отображается другое поле календаря.
после того, как я использовал преобразователь данных, потому что первое поле возвращает строку (‘1week’, ‘1year’ …), а второе поле будет либо нулевым, либо датой
проблема в том, что метод обратного преобразования работает отлично, но параметр метода преобразования равен нулю, т. е. когда пользователь хочет редактировать страницу, он не видит последние значения двух полей.
class ExpiryDateType extends AbstractType {
public function buildForm(\Symfony\Component\Form\FormBuilderInterface $builder, array $options) {
$builder ->add("chosen", \Symfony\Component\Form\Extension\Core\Type\ChoiceType::class,array(
'choices' => array(
'1 week' => '7',
'1 month' => '30',
"1 year"=>"365",
"custom"=>"custom")))
->add('ExpiryDate', 'sonata_type_date_picker', array('format' => 'yyyy-MM-dd', 'label' => '', 'required' => false))
->addModelTransformer(new \ADS\CoreBundle\Form\DataTransformer\ExpiryDateTransformer());
}
public function configureOptions(\Symfony\Component\OptionsResolver\OptionsResolver $resolver) {}
public function buildView(\Symfony\Component\Form\FormView $view, \Symfony\Component\Form\FormInterface $form, array $options) {
parent::buildView($view, $form, $options);
}
public function getBlockPrefix()
{
return 'expirydate';
}
}
и это трансформатор
class ExpiryDateTransformer implements DataTransformerInterface {
public function transform($date) {
//date is null !!!!
}
public function reverseTransform($array) {
if ($array["chosen"] == "7") {
$date = new \DateTime("now");
$date->modify("+1 week");
$date->format('Y-m-d H:i:s');
return($date);
} else if ($array["chosen"] == "30") {
$date = new \DateTime("now");
$date->modify("+1 month");
$date->format('Y-m-d H:i:s');
return($date);
} else if ($array["chosen"] == "365") {
$date = new \DateTime("now");
$date->modify("+1 year");
$date->format('Y-m-d H:i:s');
return($date);
} else {
return($array["ExpiryDate"]);
}
}
}
Задача ещё не решена.
Других решений пока нет …