将Symfony表单上的字段绑定到参数

时间:2017-03-24 22:02:43

标签: php symfony twig

我有一个名单实体的新(创建)方法,并希望从另一个服务用户实体导航到此方法,将服务用户作为参数传递。然后,我想将名单的serviceUserId设置为服务用户对象的ID。

我的控制器方法从服务用户实体路由到名册,并正确地将服务用户对象传递给表单。

/**
     * Creates a new roster entity.
     *
     * @Route("/newfromsu/serviceUser={serviceUser}", name="roster_new_su")
     * @Method({"GET", "POST"})
     */
    public function newActionfromServiceUser(Request $request, ServiceUser $serviceUser)
    {
        $roster = new Roster();
        $form = $this->createForm('AppBundle\Form\RosterType', $roster);
        $form->handleRequest($request);


        if ($form->isSubmitted() && $form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($roster);
            $em->flush($roster);

            return $this->redirectToRoute('roster_show', array('id' => $roster->getId()));
        }

        return $this->render('roster/newfromsu.html.twig', array(
            'roster' => $roster,
            'serviceUser'=>$serviceUser
        ,'form' => $form->createView(),
        ));
    }

新的名册模板页面和RosterType类目前是使用模板化代码默认创建的

   {% extends '_base.html.twig' %}

{% block body %}
    {{ dump() }}
    <h1>Roster creation</h1>

    {{ form_start(form) }}
    {{ form_widget(form) }}
    <input type="submit" value="Create" />
    {{ form_end(form) }}

    <ul>
        <li>
            <a href="{{ path('roster_index') }}">Back to the list</a>
        </li>
    </ul>
{% endblock %}

    class RosterType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('serviceUserId')->add('rosterStartTime')->add('rosterEndTime')->add('rosterStatus')->add('numberResourcesNeeded')->add('customerId');

    }

我的问题: 如何将新表单中的serviceUserId值设置为传入serviceUser对象的ID

我可以在formBuilder中执行此操作,还是需要手动创建一个Twig表单,该表单列出每个属性并将相关控件绑定在那里。

谢谢!

1 个答案:

答案 0 :(得分:3)

Controller :: createForm函数的第三个参数是带有选项的数组。

$form = $this->createForm('AppBundle\Form\RosterType', $roster, array(
    'serviceUser' => $serviceUser
));

现在在formType类中,您需要为$ options ['serviceUser']设置默认值:

class RosterType extends AbstractType
{

    // ...

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\Roster',
            'serviceUser' => NULL
        ));
    }
}

现在您可以在buildForm方法中使用该选项:

class RosterType extends AbstractType
{

    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('serviceUserId', null, array(
                'data' => $options['serviceUser']
            ))
            ->add('rosterStartTime')
            ->add('rosterEndTime')
            ->add('rosterStatus')
            ->add('numberResourcesNeeded')
            ->add('customerId')
        ;

    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\Roster',
            'serviceUser' => NULL
        ));
    }
}