【问题标题】:How to get a Doctrine2 Entity method from a Symfony2 Form in Twig如何从 Twig 中的 Symfony2 表单获取 Doctrine2 实体方法
【发布时间】:2011-10-31 08:15:09
【问题描述】:

我在一个 Twig 模板中,我有一个表示 Doctrine2 实体表单的“表单”变量。

该实体具有映射到表单中的属性,但该实体还有一些我想从我的 Twig 模板访问的方法。

我很想做这样的事情:

{{ form.myMethod }}

或者可能是这样的:

{{ form.getEntity.myMethod }}

但不幸的是它不起作用。

我怎样才能达到我的需要?

【问题讨论】:

    标签: php symfony twig


    【解决方案1】:

    对象方法应该可以在 twig 中使用,我知道我在某些项目中使用过它们。

    尝试使用()

    点赞{{ form.myMethod() }}

    【讨论】:

    • 表单由 FOSUserBundle 管理。我尝试了您的建议,这是我遇到的错误:第 20 行的“FOSUserBundle:Profile:edit_content.html.twig”中不存在对象“Symfony\Component\Form\FormView”的方法“myMethod”
    • 这个错误意味着 twig 确实尝试调用 form.myMethod() 方法,但没有找到它。换句话说,现在你只需要正确地实现它。
    • 我最终覆盖了 FOSUserBundle 控制器并将实体传递给模板。这样我就可以使用方法了。
    • 如何将参数传递给myMethod()?我正在尝试做myMethod(100,50),但它似乎不起作用,而且我不知道如何调试它......有什么想法吗?谢谢!
    【解决方案2】:

    使用{{ form.getData.myMethod }}

    【讨论】:

    • 第 20 行的“FOSUserBundle:Profile:edit_content.html.twig”中不存在对象“Symfony\Component\Form\FormView”的方法“getData”
    【解决方案3】:

    要在树枝模板中从 FormView 访问您的实体,您可以使用以下代码

    {{ form.get('value') }}
    

    form 是您的 FormView 对象。这将返回您的实体,您可以从那里调用任何方法。如果您在表单中嵌入实体集合或单个实体,则可以以相同的方式访问它

    {{ form.someembedform.get('value') }}
    

    {% for obj in form.mycollection %}
      {{ obj.get('value').someMethod }}
    {% endif %}
    

    【讨论】:

    • 如果“mycollection”是实体字段怎么办?
    • 请注意,我刚刚遇到了 Symfony 2.3 的问题:{{ form.cp.get('id') }} 不起作用,但 {{ form.cp.vars.id }} 起作用。所以 Philipp Rieber 的回答似乎更准确。
    • 在 Sf2.3 中,这似乎也不再起作用了。无法访问Twig中的实体,只能访问实体id
    • Symfony 2.6 继续使用 {{ form.cp.vars.id }}
    【解决方案4】:

    一种更方便的语法来获取底层实体,而不是

    {{ form.get('value') }}
    

    这是:

    {{ form.vars.value }}
    

    然后你可以像这样调用任何实体方法:

    {{ form.vars.value.someMethod }}
    

    另请参阅 Symfony2 文档中的表单章节:

    http://symfony.com/doc/current/book/forms.html#rendering-a-form-in-a-template

    【讨论】:

      【解决方案5】:

      花了几个小时试图弄清楚发生了什么以及为什么

      {{ form.vars.value }}
      

      为空。

      如果您有 form.element(不是表单对象本身)对象,例如,如果您要覆盖传递 form.row 对象的 form_row 模板,您可以像这样获取实体:

      {{ form.getParent().vars.value.MyEntityMethod }}
      

      希望对某人有所帮助!

      编辑:一年后 - 另一个有用的提示:

      {% block sonata_type_collection_widget %}
          {% for child in form %}
              {{ child.vars.form.vars.value.name }}
          {% endfor %}
      {% endblock %}
      

      【讨论】:

      • 它有帮助,谢谢!请注意,对于 SF2.3,getParent() 不存在,替换为“parent”,例如form.parent.vars.value.getId()
      【解决方案6】:

      只是为了更新主题:

      form.get('value')
      

      自 symfony 2.1 起已弃用。从 Symfony\Component\Form\FormView 复制:

      /*
       * @deprecated Deprecated since version 2.1, to be removed in 2.3. Access
       *             the public property {@link vars} instead.
       */
      public function get($name, $default = null) ....
      

      我猜

      form.vars.value.youMethod()
      

      应该是要走的路。它对我有用。

      ... 这是我的第一篇文章。希望有帮助!

      【讨论】:

        【解决方案7】:

        版本 2.6.7 中,上述方法均不适用于我。我使用customised form widgets 来实现这一点:

        {# src/AppBundle/Resources/views/Form/fields.html.twig #}
        {% extends 'form_div_layout.html.twig' %}
        
        {%- block entity_widget -%}
            <div {{ block('widget_container_attributes') }}>
            {%- for n, child in form %}
                {{- form_widget(child, {
                    'entity': form.vars.choices[n].data
                }) -}}
                {{- form_label(child) -}}
            {% endfor -%}
            </div>
        {%- endblock %-}
        
        {%- block radio_widget -%}
        {# You now have access to entity #}
        {%- endblock %-}
        

        【讨论】:

          【解决方案8】:

          似乎在某些时候 value 实际上是 null。所以你可以使用

          {{ (form.vars.value != null) ? form.vars.value.yourEntityMethod():'' }}
          

          在 SF v3.0.6 中测试。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-01-11
            • 1970-01-01
            相关资源
            最近更新 更多