Symfony2 - 从外部建立一个表单参数,因此用户无法修改

时间:2013-01-06 13:28:23

标签: symfony symfony-2.1 symfony-forms

我在Symfony2中有一个CRUD。为了创建一个新条目,我有两个控制器功能:

public function newAction($id) {

    $entity = new Clientes();

    // Get the reference to the Login entity using its ID
    $em = $this->getDoctrine()->getManager();
    $ref_login = $em->getReference('LoginBundle:Login', $id);       

    // Put the retrieved reference to the entity
    $entity->setLogin($ref_login);

    $form = $this->createForm(new ClientesType(), $entity);

    return $this
            ->render('MovinivelBundle:Persona/Clientes:new.html.twig',
                    array('entity' => $entity,
                            'form' => $form->createView(),));
}

public function createAction(Request $request) {

    $entity = new Clientes();

    $form = $this->createForm(new ClientesType(), $entity);
    $form->bind($request);

    if ($form->isValid()) {
        $em = $this->getDoctrine()->getManager();               

        $em->persist($entity);
        $em->flush();

        return $this->redirect($this->generateUrl('clientes'));
    }

    return $this
            ->render('MovinivelBundle:Persona/Clientes:new.html.twig',
                    array('entity' => $entity,
                            'form' => $form->createView(),));
}

在前面的代码中,我将$ id输入参数添加到newAction()函数中,因为我希望它是从外部建立的,因为每个Clientes都是Login的附加信息,必须链接。

在ClientesType表单中,我有以下内容:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('login')
        ->add('direccion')
        ->add('localidad')
        ->add('provincia')
        ->add('telefono')
    ;
}

到目前为止它的确有效。在我的表单中,根据$ id值选择login参数。但问题是我希望在创建表单后修复login参数,因此用户不能从表单中修改它,而只能使用适当的值调用newAction($ id)函数。

问题是如果我在FormType中删除 - > add('login')行,它就不再起作用了。我想到了两个选择:

  • 以某种方式隐藏表单中的“登录”,但保持其正常工作,虽然我不知道如何,或者
  • 将$ id参数连同$ request参数作为输入参数传递给createAction,但我无法弄清楚它是如何做的。

对此有何想法?

2 个答案:

答案 0 :(得分:0)

我认为您正在寻找hidden字段类型:

public function buildForm(...)
{
    $builder
        ->add('login', 'hidden')
        // ...
    ;
}

答案 1 :(得分:0)

好的,我出来了解决方案。我所寻找的只是以下内容:

<div style="display:none">
{{ form_rest(form) }}
</div>

在明确显示任何其他表单字段后在模板末尾键入此内容可以避免任何用户修改我不想要的字段,同时它仍然使用$ POST方法发送信息。