渲染没有表单的选择字段

时间:2015-10-13 08:25:47

标签: symfony twig

我经常需要在我的一些模板中渲染非常简单的imputs。

我想利用树枝宏和表单块来呈现某些HTML输入,而不涉及整个Symfony表单机制。

例如来自控制器:

$templateContext = array(
    'my_input' = new FormField('my_input', 'choice', array(
        'choices' => array('value1', 'value2', 'my_value'),
        'value' => 'my_value',
    ));
);

在模板中:

<div>{{ form_widget(my_input) }}</div>

会呈现:

<div>
    <select name="my_input">
        <option>value1</option>
        <option>value2</option>
        <option selected="selected">my_value</option>
    </select>
</div>

有一种简单的方法吗?

最后,我还希望能够在其他地方重用这些字段(比如我们可以重用表单类型)

3 个答案:

答案 0 :(得分:1)

有很多方法可以解决这个问题。最简单的方法是将纯HTML写入您的树枝模板。

<form method="post">
<div>
    <select name="my_input">
        <option>value1</option>
        <option>value2</option>
        <option selected="selected">my_value</option>
    </select>
</div>
</form>

然后在你的控制器中读回值。

    $request = $this->getRequest();
    if($request->getMethod() == 'POST'){
        $data = $request->get('my_input')

        //Do whatever you want with $data
    }

如果您想重新使用html,可以在PHP中的某个地方构建它,并在需要时将其传递给Twig;或者您可以将它放在一个单独的树枝模板中,并使用树枝中的{include ''}命令读取它。

答案 1 :(得分:0)

这是我最终的结果:

Class MyInput {
    public static values = array(
        'value1',
        'value2',
        'my_value',
    );
}

class MyInputType extends AbstractType
{
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'choices' => MyInput::$value,
        ));
    }

    public function getParent() { return 'choice'; }
    public function getName() { return 'my_input_type'; }
}

从控制器使用的字段类型(在将其注册为服务之后)

public function MyAction(Request $request)
{
    $form = $this->createForm('my_input_type');
    $form->handleRequest($request);
    $templateContext['myForm'] = $form->createView();
    // ...
}

渲染到模板中的输入

<div>{{ form(myForm) }}</div>

总结:我没有表格机制就无法呈现输入,但实际形式仍然相当简单。

答案 2 :(得分:0)

我找到了自己的解决方案,因为我需要从现有表单创建子表单。

  • 创建完全空的树枝模板,
  • 仅添加{{form(form)}}
  • 呈现此模板render()->getContent()
  • 对结果进行预浸(我用js完成)formView = formView.replace(/<(.*?)form(.*?)>/, '');

是的-我知道正则表达式并不完美,所以在有人说出来之前-我自己说,可以自己更改,因为它也可以捕获“ form-group”类等。

这只是我的解决方案的展示