1

想象一下这样的场景:我们公司有一个员工在“玩”图形、css、html等。
我们的新项目将在 symfony2 下诞生,所以我们正在尝试一些愚蠢但“真实”的东西(比如来自 db 的身份验证、从表单提交数据并将其持久化到 db 等等..)

问题

据我所知,从我在网站上找到的 symfony2 “书”中了解到(您可以在此处找到),有一种“自动”的方式来创建和呈现表单:

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 的角度来看是传统的)方法编写一个 twig 模板:

/* 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它将包含一个数组,其中包含来自提交表单的键、值。
我们发现这不是真的。在谷歌搜索了一段时间并尝试了其他“坏”想法之后,我们被冻结了。

所以,如果你有一个不能直接处理 php 代码的“图形办公室”,我们如何从表单连接到控制器?

更新
似乎 Symfony2 对表单的字段名称和查找使用不同的约定,一旦您提交了该约定。特别是,如果我的表单名称为addUser且字段名称为userName,则该字段的名称AddUser[username]可能为“动态”查找方法,该方法将提取表单名称、字段名称、连接它们并查找值。
可能吗?

4

2 回答 2

1

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

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

或者,您可以在绑定之前根据 Sf2 生成的名称将元素添加到请求中(复制存在的值)。

或者,您可以使用此处记录的表单组件的绑定方法(而不是 bindRequest) 。

但说真的……只需使用 formbuilder api。你的生活会更轻松,这不就是框架的用途吗?:)

于 2012-06-27T00:52:09.893 回答
1

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

{{ form_label(form.field) }}

会产生这样的东西:

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

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

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

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

否则,如果你真的想要丑陋的东西,你可以使用这种语法:

{{ myform.vars.value.myField }}
于 2012-06-25T10:56:58.507 回答