2013-08-30 2 views
4

У меня есть логическое поле, которое я поставил в виде поля выбора (да или нет). Я бы получил 0 или 1 без трансформатора данных. Я добавил вид BooleanToStringTransformer (который казался разумным):Symfony2 Forms BooleanToStringTransformer Issue

$builder 
     ->add(
      $builder->create('myBooleanField', 'choice', array(
       'choices' => array(true => 'Yes', false => 'No'), 
      )) 
      ->addViewTransformer(new BooleanToStringTransformer('1')) 
     ) 

И когда я пытаюсь отобразить форму, я получаю ошибку «Прогнозный булева.». Мое поле имеет значение false, прежде чем создавать форму.

Я попытался установить его как модельный трансформатор: форма отправлена, но когда я отправлю ее, мое поле объявлено недействительным.

Что я делаю неправильно?

Редактировать: Я почти получил его сейчас.

  • Я использовал модель трансформатора вместо того, чтобы вид трансформатора (поле выбора работы со строками или целыми числами, а не булевы)
  • Я изменил свой список выбора из array(true => 'Yes', false => 'No') в array('yes' => 'Yes', 'no' => 'No')

Поэтому код теперь выглядит как ->addModelTransformer(new BooleanToStringTransformer('yes'))

Работа трансформации данных, за исключением того, что мое поле всегда установлено в true, независимо от того, какое значение я выбираю.

Что случилось?

ответ

5

Ответ: Я не должен был думать, что по умолчанию работала Symfony BooleanToStringDataTransformer. Он возвращает значение null для ложного значения вместо строки.

Так что я создал свой собственный datatransformer:

<?php 

use Symfony\Component\Form\DataTransformerInterface; 
use Symfony\Component\Form\Exception\TransformationFailedException; 

class BooleanToStringTransformer implements DataTransformerInterface 
{ 
    private $trueValue; 
    private $falseValue; 

    public function __construct($trueValue, $falseValue) 
    { 
     $this->trueValue = $trueValue; 
     $this->falseValue = $falseValue; 
    } 

    public function transform($value) 
    { 
     if (null === $value) { 
      return null; 
     } 

     if (!is_bool($value)) { 
      throw new TransformationFailedException('Expected a Boolean.'); 
     } 

     return true === $value ? $this->trueValue : $this->falseValue; 
    } 

    public function reverseTransform($value) 
    { 
     if (null === $value) { 
      return null; 
     } 

     if (!is_string($value)) { 
      throw new TransformationFailedException('Expected a string.'); 
     } 

     return $this->trueValue === $value; 
    } 
} 
1

Вы, кажется, использовали трансформатор вида вместо трансформатора модели. Вам понадобится обратное преобразование 0/1 в boolean в трансформаторе модели, если базовая модель ожидает логические значения.

.. или вы, возможно, пропустили реализацию метода обратного преобразования в вашем трансформаторе вида.

Подробнее о различии между трансформаторами View и Model here.

+0

Может не булевы значения можно использовать в качестве нормализованных данных? Кстати, BooleanToStringTransformer является частью расширения ядра форм Symfony, я его не реализовал. – Nanocom

0

Другой обходной путь может быть:

->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) { 
    $data = $event->getData(); 

    if (isset($data['myBooleanField'])) { 
     $data['myBooleanField'] = (bool) $data['myBooleanField']; 

     $event->setData($data); 
    } 
})