2

我想使用 Symfony2 的 FormBuilder 组件在服务类中构建动态表单。但是,这些表单不会立即链接到任何实体(所以我认为表单类服务类型不适用。)

我需要根据问题的回答方式向我们的用户提出一系列具有无数结果的问题。(例如:你喜欢芝士蛋糕吗?如果是,用户将被引导到另一个表单询问什么样的芝士蛋糕;如果不,问你是否喜欢冰淇淋……等等。)为此,我创建了一个 Dialoguer 服务,该服务使用 FormFactory 服务进行实例化。来自 services.yml:

dialoguer:
    class: My\MainBundle\Services\Dialoguer    
    arguments: ['@forms.factory']

对话过程的每一步都由不同的对话类处理——所有这些都是 AbstractDialogue 类的子类。对话服务查看已经回答的数据并找到合适的对话来询问下一个问题。

对话器服务将@forms.factory 服务传递给适当的对话类,在本例中为 Start:

namespace My\MainBundle\Services\Dialoguer\Individual;

use My\MainBundle\Services\Dialoguer\AbstractDialogue as AbstractDialogue;

class Start extends AbstractDialogue
{
    static $stem = 'check_registration';    
    protected $fields = array(
        'over_thirtyfive' => array(
        'type' => 'choice',
        'options' => array( 
            'label' => 'Are you over 35?', 
            'choices'=>array('yes'=>'Yes','no'=>'No'), 
            'expanded'=> true, 
            'multiple'=>false 
            )
        )
    );
....

function __construct( $formFactory )
{
    $this->formFactory = $formFactory;
}

从父类 AbstractDialogue 类开始,get_form 方法遍历每个字段,并根据上述规范将其添加到表单中。

public function get_form( $form_data = array() )
{       
    $defaults = array_merge( $this->defaults, $form_data );

    $builder = $this->formFactory->create();
    $builder->setData( $defaults );
    foreach( $this->fields as $field => $type_ar )
    {
        $builder = $builder->add( $field, $type_ar['type'], $type_ar['options'] );
    }
    //return $builder->getForm();
    return $builder;
}

最后,在控制器类中:

$dialogue = $this->get('dialoguer')->process($request, 'Individual');
$form = $dialogue->get_form()->getView();
$args = compact('form');
return $this->render("MyMainBundle:Forms:process_app.form.html.twig", $args);

最后,问题出在:上面,我的 get_form 方法传递了一个 Symfony\Component\Form\Form 实例,它没有 getView 方法——所以它抛出了一个错误。

使用这种创建表单的非传统方法,我需要做什么才能获得表单视图?(或者这不起作用?)

4

1 回答 1

1

我的控制器中有一个错字,导致表单无法访问视图。“getView”应更改为“createView”。哎呀。

我还对我的服务进行了更改,将 '$this->formFactory->create()' 更改为 '$this->formFactory->createBuilder();'

对于未来的人们,我将介绍服务类中的脚本和随附的 api:

public function get_form( $form_data = array() )
{       
$defaults = array_merge( $this->defaults, $form_data );

$builder = $this->formFactory->createBuilder();

正如我在原始帖子中提到的 - 通过我的服务配置导入“@form.factory”,我的班级可以使用 $this->formFactory。那就是 createBuilder 实例化 Symfony\Component\Form\FormBuilder 的一个实例 ~ http://api.symfony.com/2.0/Symfony/Component/Form/FormBuilder.html

$builder->setData( $defaults );
foreach( $this->fields as $field => $type_ar )
{
    $builder = $builder->add( $field, $type_ar['type'], $type_ar['options'] );
}
return $builder->getForm();
}

getForm 方法实例化 Symfony\Component\Form\Form 的一个实例 ~ http://api.symfony.com/2.0/Symfony/Component/Form/Form.html

然后在我的控制器中 -

$form = $dialogue->get_form()->createView();

createView 方法创建了一个 Symfony\Component\Form\FormView 的实例,它可以在 Twig 中渲染:

{{ form(form) }} 

有用。

于 2013-10-31T15:37:24.520 回答