Symfony2表单:是否可以以“非常规方式”绑定表单?

时间:2012-06-25 08:05:10

标签: forms symfony

想象一下这种情况:在我们公司,有一名员工“玩”"围绕图形,CSS,HTML等。
我们的新项目将在symfony2下诞生,所以我们正在尝试一些愚蠢的 - 但是"真实的" - 东西(比如来自db的身份验证,从表单提交数据并将其保存到db等等)。

问题

据我所知,从symfony2" book"我在网站上找到了you can find it here),有一种用于创建和呈现表单的自动化方式:

1)以这种方式将表格构建到控制器中

$form = $this->createFormBuilder($task)
       ->add('task','text'),
       ->add('dueDate','date'),
       ->getForm();

return $this->render('pathToBundle:Controller:templateTwig',
        array('form'=>$form->createview());

2)进入templateTwig渲染模板

{{ form_widget(form) }} // or single rows method

3)进入控制器(具有可以提交数据的路径的控制器),收回提交的信息

if($rquest->getMethod()=='POST'){
 $form->bindRequest($request);
 /* and so on */
}

返回方案

我们的图形员工不想访问控制器,编写php和其他类似的东西。因此,他将使用"非常规"写一个树枝模板。 (从symfony2的角度来看,但从HTML的角度来看是常规的)方法:

/* into twig template */
<form action="{{ path('SestanteUserBundle_homepage') }}" method="post" name="userForm">
    <div>
        USERNAME: <input type="text" name="user_name" value="{{ user.username}}"/>
    </div>
    <div>
        EMAIL: <input type="text" name="user_mail" value="{{ user.email }}"/>
    </div>
    <input type="hidden" name="user_id" value="{{ id }}" />
    <input type="submit" value="modifica i dati">
  </form>

现在,如果进入处理数据提交的控制器,我们会做类似的事情

public function indexAction(Request $request)
    {
     if($request->getMethod() == 'POST'){ // sono arrivato per via di un submit, quindi devo modificare i dati prima di farli vedere a video
      $defaultData = array('message'=>'ho visto questa cosa in esempio, ma non capisco se posso farne a meno');
      $form = $this->createFormBuilder($defaultData)
           ->add('user_name','text')
           ->add('user_mail','email')
           ->add('user_id','integer')
           ->getForm();
      $form->bindRequest($request); //bindo la form ad una request
      $data = $form->getData(); //mi aspetto un'array chiave=>valore
      /* .... */

我们希望$data将包含一个数组,其中包含来自提交表单的键值 我们发现这不是真的。谷歌搜索一段时间后,尝试与其他&#34;坏&#34;想法,我们已经冻结了。

所以,如果你有一个&#34;图形办公室&#34;不能直接处理php代码,我们如何从表单到控制器进行接口?

更新
看来Symfony2对表单的字段名称和查询使用了不同的约定,一旦你提交了它。 特别是,如果我的表单名称为addUser且字段名为userName,则该字段的名称将为AddUser[username],因此它可能具有&#34 ;动态&#34;查找方法将提取表单的名称,字段名称,连接它们并查找值。
有可能吗?

2 个答案:

答案 0 :(得分:1)

Symfony 2基于twig作为模板语言。让他用它:

{{ form_label(form.field) }}

将生成如下内容:

<label for="field">field</label>

您可以使用所有可用功能来呈现表单:

{{ form_label() }}
{{ form_widget() }}
{{ form_errors() }}

如果要自定义这些函数呈现的内容,可以覆盖Symfony2 documentation中定义的twig模板。

否则如果你真的想要丑陋,你可以选择这种语法:

{{ myform.vars.value.myField }}

答案 1 :(得分:1)

您可以强制Symfony2设置表单字段的名称,但我不建议:$formBuilder->add('dummyfield', 'text', array( 'attr' => array('name' => 'yournamehere') ) );

或者(也是一个坏主意),您可以这样做,甚至不允许您使用表单API:$this->getRequest()->get('whatever_the_field_name_is');

或者你可以在绑定之前根据Sf2生成的名称添加元素(复制存在的值)。

或者您可以使用表单组件的绑定方法(而不是bindRequest),如文档here所示。

但严重的是......只需使用formbuilder api。你的生活会更容易,而不是框架的用途? :)

相关问题