这是我的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等)。
如何从表单字段而不是索引中获取值?
答案 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());