【问题标题】:Render a choice field without form呈现没有表单的选择字段
【发布时间】:2015-10-13 08:25:47
【问题描述】:

我经常需要在我的一些模板中呈现非常简单的输入。

我想利用 twig 宏和表单块来呈现某些 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>

有简单的方法吗?


最终我还希望能够在其他地方重用这些字段(就像我们可以重用表单类型一样)

【问题讨论】:

  • 您是否测试过您的建议是否有效?
  • 不,我用这些参数发明了 FormField 类(灵感来自我们传递给表单的参数)

标签: symfony twig


【解决方案1】:

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

<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;或者您可以将其放在单独的 twig 模板中,然后使用 twig 中的{include ''} 命令读取。

【讨论】:

  • 谢谢,但首要目的是避免来自模板的硬编码输入。我需要让模板设计尽可能简单。
  • 树枝扩展可能是解决方案吗? symfony.com/doc/current/cookbook/templating/twig_extension.html
  • 您也可以将对象传递到树枝扩展中。这使您有机会将数据传递到扩展程序并从那里构建您的表单数据。
【解决方案2】:

这是我最终得到的结果:

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>

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

【讨论】:

  • 注意:MyInput 还可以帮助我使用像 return array_keys($this-&gt;values) 这样的吸气剂进行验证
【解决方案3】:

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

  • 创建完全空的树枝模板,
  • 只添加{{form(form)}}
  • 渲染此模板render()-&gt;getContent()
  • 在结果上做一个 preg 替换(我在 js 中做)formView = formView.replace(/&lt;(.*?)form(.*?)&gt;/, '');

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 2016-04-13
    • 2015-03-11
    • 1970-01-01
    相关资源
    最近更新 更多