我只想在Car对象中预设隐藏的“fkCar”字段,其id与url模式中的id匹配。因此,当用户点击汽车入口旁边的链接时,他可以直接向该汽车添加历史记录,而无需从下拉列表中选择该汽车ID。我可以在下拉列表中预设数据,但每当我尝试在FormType中使用HiddenType时,我都会收到以下错误消息:
“类型为”AdminBundle \ Entity \ Car“的预期参数,”string“给出”
从我注意到它就像那样,因为Car Object的实例是由__toString()魔术方法转换的,它返回“string”而不是Car对象。另一方面,同样的事情发生在下拉选择字段中,但没有抛出错误,它工作正常......
当我在我的FormType中使用->add('fkCar')
时,它工作正常,但我有一个我不想要的下拉列表
当我像这样使用HiddenType时:
->add('fkCar',HiddenType::class, [
// ...
])
我收到引用的错误消息。
这是我的代码:
我的FormType
<?php
namespace AdminBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Intl\DateFormatter\IntlDateFormatter;
class CarHistoryCarIdType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('issueDate', DateType::class,[
'format'=> IntlDateFormatter::LONG,
])
->add('invoiceNum')
->add('invoiceTotal')
->add('quoteNum')
->add('mileage')
->add('description')
// ->add('fkCar') // works - but dropdown choice field is there able to be edited
->add('fkCar',HiddenType::class, [ // generate above error message
// ...
])
;
}
/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AdminBundle\Entity\CarHistory'
));
}
}
我的控制器操作:
use AdminBundle\Form\CarHistoryCarIdType;
use AdminBundle\Entity\Car;
use AdminBundle\Entity\CarHistory;
...
/**
* Creates a new History for selected car.
*
* @Route("/new/history/{carId}", name="car_new_history")
* @Method({"GET", "POST"})
*/
public function newHistoryAction(Request $request, $carId)
{
// get car data
$car = $this->getDoctrine()->getRepository(Car::class)->find($carId);
dump($car); // test
dump(get_class($car)); // test
// create History Entity Object
$history = new CarHistory();
// set History Entity fkCar to Car Entity Object with id == $carId
$history->setFkCar($car);
$history->setIssueDate(new \DateTime('now'));
// build form and set data
$form = $this->createForm(CarHistoryCarIdType::class, $history);
dump($request->request->all()); // test
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($history);
$em->flush();
return $this->redirectToRoute('full_car_history', array('id' => $carId));
}
return $this->render('car/newCarHistory.html.twig', array(
'carId' => $carId,
'form' => $form->createView(),
));
}
这是我的转储测试结果。如您所见,该学说按预期返回汽车对象,但形式'fkCar'保持为空:
答案 0 :(得分:0)
问题是表单中的隐藏类型不允许编辑其中的数据。您必须更改类型,并且在视图中必须使用css隐藏字段。通常我这样做:
<div style="display:none">{{form_widget(form.fkCar)}}</div>
更改表单类中的类型并使用默认文本类型