表单字段值而不是它的索引

时间:2015-09-22 00:24:20

标签: symfony

这是我的FormBuilder:

-mmacosx-version-min=10.10

这是来自实体:

         // EditUserFormType.php
         $builder
                ->add('eduStartYear', 'choice', array(
                    'label' => false,
                    'choices' => range(date('Y'),1956)
                ))
                ->add('eduEndYear', 'choice', array(
                    'label' => false,
                    'choices' => range(date('Y'),1957),
                ))
                ->add('save', 'submit');

这是控制器的一部分:

    /**
     * @ORM\Column(type="date", nullable=true)
     */
    protected $eduStartYear;

    /**
     * @ORM\Column(type="date", nullable=true)
     */
    protected $eduEndYear;

我在保存时收到此错误:

  

DateType.php第53行中的FatalErrorException:

     

错误:在非对象上调用成员函数format()

在我使用调试器完成所有过程后,我注意到传递给

的值

$user = $this->getUser(); $form = $this->createForm(new EditUserFormType(), $user); $form->handleRequest($request); if ($form->isValid()) { $em = $this->getDoctrine()->getManager(); $em->persist($user); $em->flush(); }

实际上是整数,此整数是表单值的索引(例如0 = 2015,1 = 2014等)。

如何从表单字段而不是索引中获取值?

1 个答案:

答案 0 :(得分:1)

为什么不按照数组键==值的文档创建一个选择列表。

E.g。

$builder->add('eduStartYear', 'choice', array(
    'choices' => array(
        '1990'   => '1990',
        '1991'   => '1991',
        '1992'   => '1992', // of course you have to generate this array - just an example
    ),
));

Doctrine仍然期望您的日期字段有DateTime对象,但这会导致错误 - >格式。您可以查看data transformer以将YYYY值转换为DateTime对象并返回。

我没有检查过这种语法,但它应该可以正常工作或接近工作。

class YearToDateTransformer implements DataTransformerInterface
{
    private $manager;

    public function __construct(ObjectManager $manager)
    {
        $this->manager = $manager;
    }

    /**
     * Transforms an object (\DateTime) to a string (year).
     *
     * @param  \DateTime|null $date
     * @return string
     */
    public function transform($date)
    {
        if (null === $date) {
            return '';
        }

        return $date->format('Y');
    }

    /**
     * Transforms a year to a \DateTime
     *
     * @param  string $year
     * @return \DateTime|null
     * @throws TransformationFailedException if object (\DateTime) is not found.
     */
    public function reverseTransform($year)
    {
        if (!$year) {

            return;
        }

        $date = \DateTime::createFromFormat('Y', $year);

        if (!$date instanceof \DateTime) {
            throw new TransformationFailedException(sprintf(
                'Coul not convert year %s to \DateTime',
                $year
            ));
        }

        return $date;
    }
}

然后您可以将它附加到您的表单字段,如下所示:

  $builder->get('eduStartYear')
            ->addModelTransformer(new YearToDateTransformer());