如何使用关系数据在表单'HiddenType :: class'字段上预设数据?

时间:2016-08-02 23:46:02

标签: forms symfony

我只想在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'保持为空:

enter image description here

1 个答案:

答案 0 :(得分:0)

问题是表单中的隐藏类型不允许编辑其中的数据。您必须更改类型,并且在视图中必须使用css隐藏字段。通常我这样做:

<div style="display:none">{{form_widget(form.fkCar)}}</div>

更改表单类中的类型并使用默认文本类型