【问题标题】:Twig - Iterating over Form fieldsTwig - 遍历表单字段
【发布时间】:2017-12-18 07:48:30
【问题描述】:

我在尝试迭代 Twig 表单主题中的所有表单元素时遇到了问题。实际上我用它来迭代它们:

{% for child in form.parent.children %}

我没有在文档中找到它,我只是转储了表单变量并找到了该路径上的字段。这实际上适用于所有表单,除非表单本身有一个名为 children 的参数。我不知道这是否是一个错误,因为如果你只是转储 form 对象,两种情况下的结构都是相同的:

但是,如果您尝试访问form.parent.children,当它内部有一个children 参数时,您将不会直接得到该数组,而是直接得到"children" 的结果:

正如您在本例中看到的那样,form.parent.children 直接引用表单的子元素(相同的标识符 #1592)。尽管如此,如果您尝试获取form.parent.children.parent.children,您将再次获得children 元素,因此如果表单包含名为children 的参数,则基本上使用这种方式无法遍历表单字段。

这是一个错误还是我错过了什么?也许还有另一种方法可以实现我想要的?

【问题讨论】:

    标签: php forms symfony twig


    【解决方案1】:

    是的,这是与 the way Twig accesses each attribute for convenience 相关的名称冲突,因为 FormView 被声明为 \ArrayAccess it has priority over object's properties。顺便说一句,parentvars 属性也会发生同样的情况,但让我们现在关注解决方案而不是问题。

    由于这是 Twig 的问题,因此解决方案应针对此方向。解决方法可能是 create a custom function 正确获取 FormView 的属性:

    public function getFunctions()
    {
        return array(
            new TwigFunction('formview_prop', array($this, 'getFormViewProperty')),
        );
    }
    
    public function getFormViewProperty(FormView $formView, string $prop)
    {
        // parent, children or vars
        return $formView->{$prop};
    }
    

    因此,使用此功能时,您可以访问视图的属性而不是表单的字段(如果存在名称冲突):

    {% for child in formview_prop(form, 'parent') %}
    

    然后,它将遍历父视图的所有字段元素(子)。但是,我更愿意通过创建三个函数 formview_parentformview_childrenformview_vars 来明确,并且不要传递第二个参数。


    从这个意义上说,您可能还需要验证表单是否具有父视图,因此由于Symfony 2.7.39, 2.8.32, 3.3.14, 3.4.1, 4.0.1 was introduced(作为错误修复)一个名为rootform 的新Twig 测试函数可以避免这种冲突,尤其是对于@ 987654336@财产:

    {% if form is rootform %}
    

    【讨论】:

    • 感谢您的解释和您链接的参考资料。
    • 我真的很喜欢,我需要这个功能,我从事一项任务,我动态创建表单,但不知道如何从表单子项中检索每个表单字段
    猜你喜欢
    • 1970-01-01
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    相关资源
    最近更新 更多