0

我想在我的服务中生成一个无类表单。

我这样做的方式是:

class StepSummary implements StepInterface 
{
    public function __construct($container)
    {
        $this->container = $container;
    }

    public function getVariables()
    {
        $form = $this->container->get('form.factory')->createBuilder('text')
            ->add('accept')
            ->getForm();

        return array('form' => $form->createView());
    }
}

API中,我发现我需要将表单类型传递给FormBuilder- 我没有找到对它的任何引用,所以我放了假想的text字符串。现在它以这种方式呈现表单:

<input type="text" id="text" name="text" required="required" />

显然没有提到该accept领域。

4

3 回答 3

5

控制器的createForm()方法在这里很有帮助:

    public function createFormBuilder($data = null, array $options = array())
    {
        return $this->container->get('form.factory')->createBuilder('form', $data, $options);
    }

所以解决方案是:

$form = $this->container->get('form.factory')->createBuilder('form')
            ->add('accept')
            ->getForm();
于 2012-09-12T10:34:53.987 回答
2

查看 Symfony2 文档中名为Using a Form without a Class的章节。

基本上,您必须使用createFormBuilderand 而不是字符串或对象,您只需传递具有默认值的数组即可。

从前面提到的文档中:

// make sure you've imported the Request namespace above the class
use Symfony\Component\HttpFoundation\Request
// ...

public function contactAction(Request $request)
{
    $defaultData = array('message' => 'Type your message here');
    $form = $this->createFormBuilder($defaultData)
        ->add('name', 'text')
        ->add('email', 'email')
        ->add('message', 'textarea')
        ->getForm();

        if ($request->getMethod() == 'POST') {
            $form->bind($request);

            // data is an array with "name", "email", and "message" keys
            $data = $form->getData();
        }

    // ... render the form
}
于 2012-09-12T10:27:15.730 回答
1

如果您不想将表单绑定到任何特定对象,则不需要将任何对象传递给构建器,您可以执行以下操作:

    $form = $this->container->get('form.factory')->createBuilder()
        ->add('accept')
        ->getForm();

如果要为表单设置一些默认值,可以将表单绑定到数组。例如:

    $data['accept'] = 'default accept';

    $form = $this->container->get('form.factory')->createBuilder($data)
        ->add('accept')
        ->getForm();
于 2012-09-12T10:27:32.683 回答