Symfony2 createFormBuilder - 动态高级搜索表单

时间:2012-11-12 03:06:37

标签: symfony

我正在使用API​​,它作为响应的一部分,返回一个名为“form”的数组。这是一个字段名称,数据类型和值的数组。

这些字段的数量和名称可能会有所不同,具体取决于当前正在使用的API端点。但是表单数组的结构总是一样的。因此,就Symfony而言,这个过程如下:

  1. 创建表单对象
  2. 遍历表单数组并将数组元素添加为字段
  3. 将数组发送到视图
  4. 基本上,此表单只不过是一种高级搜索表单。系统中的实体绝对没有链接。

    所以,对Symfony2不熟悉,在阅读本文档(http://symfony.com/doc/2.0/book/forms.html#building-the-form)后,我尝试通过创建控制器来完成此操作以下功能:

    /**
     * Generate a form for each field passed in an array.
     * 
     * @param array $formArray A custom array of fields do be shown in the form
     * @return formView
     */
    private function generateForm($formArray)
    {
    
        // Simple demo for testing
        $formArray = array(
            0 => array(
                'name' => 'FirstName', 'type' =>'text'
                ),
            1 => array(
                'name' => 'LastName', 'type' =>'text'
                )
            ); 
    
        $form = $this->createFormBuilder($formArray);
    
        foreach($formArray as $field) {
            $form->add($field['name'], $field['type']);
        }        
    
        $form->getForm();
    
    
        return $form->createView();
    
    }
    

    我从中得到的是

    Fatal error: Call to undefined method Symfony\Component\Form\FormBuilder::createView() in .... (my controller file)
    

    奇怪的是,如果我按照文档示例添加字段和getForm()调用链,那就没关系。

    我在这里做错了什么?

1 个答案:

答案 0 :(得分:6)

啊想通了。这一行

$form->getForm();

该方法返回一个Form对象,而我将其视为一个setter。

所以工作控制器功能如下:

 /**
 * Generate a form for each field passed in an array.
 * 
 * @param array $formArray A custom array of fields do be shown in the form
 * @return formView
 */
private function generateForm($formArray)
{

    $formBuilder = $this->createFormBuilder($formArray);

    foreach($formArray as $field) {
        $formBuilder->add($field['name'], $field['type']);
    }        

    $form = $formBuilder->getForm();

    return $form->createView();

}