【问题标题】:call twig function from custom twig function从自定义树枝函数调用树枝函数
【发布时间】:2020-06-04 05:36:59
【问题描述】:

我在 AppExtension 类中创建了一个自定义 twig 函数。我需要从这个新函数中调用 form_label() 。 ¿ 可能吗?我试过了,还是不行:

来自我调用的模板:
{{ myFunc(form.someField) }}

public function myFunc( $field )
{
   $html = form_label($field);
}

这个想法是以不同于 form_widget(form) twig 函数的顺序/方式呈现每个表单字段。 “form_label()”函数没有被重新定义。

感谢您的任何建议。

【问题讨论】:

  • 表单标签不是某种功能 - 它是一个 Twig 块。为什么不简单地覆盖它?
  • 听起来更像是您应该熟悉表单主题,因为您所做的并不是函数的预期用途。

标签: symfony twig custom-function


【解决方案1】:

我觉得这是处理此问题的错误方法。扩展是用于转换数据并非真正以操纵表单定义本身。

首先,订单被定义为表单类型,因此您可以交换它们。要以不同方式呈现字段,您可以使用form themes,甚至是rendering a custom form type

或者,如果它是一次性的(您也可以为此创建一个宏),您也可以代替form_widget(form),以您喜欢的方式订购它们。

{{ form_start(form) }}
    {{ form_row(form.field3) }}
    {{ form_row(form.field1, { attr: { class: 'im-different' } }) }}
    {{ form_row(form.field2) }}
{{ form_end(form) }}

甚至更深入。

{{ form_start(form) }}
    {{ form_row(form.field3) }}

    <div>
        {{ form_label(form.field1) }}
        {{ form_widget(form.field1) }}
        {{ form_errors(form.field1) }}
    </div>

    {{ form_row(form.field2) }}
{{ form_end(form) }}

要查看这些函数以及默认情况下它们是如何呈现的,您可以查看form_div_layout.html.twig

【讨论】:

  • 感谢您的留言。我的目标是用函数改变 form_row 元素的顺序。我想要的不是标签、小部件、错误:错误、标签、小部件。但我想通过一个简单的函数调用来做到这一点。再次感谢。
  • 你应该用表单主题而不是函数来做到这一点。你可以简单地在自定义主题中覆盖form_row
【解决方案2】:

我同意 Jenne van der Meer 和 Nico Haase 的观点,即您的方法并不是特别理想。如果我可以选择,我会走一条不同的路线:不是在你的函数中渲染,而是在 twig 中渲染,然后将结果传递给函数(如{{ myFunc(form_label(form), form) }})。由于您忽略了您的功能实际需要和/或所做的事情,因此很难提供进一步的建议。但是,我绝对确定,可以在输入函数之前或之后通过宏/块,甚至可能是表单主题在 twig 中完成渲染。

但是,如果您真的需要您的函数来呈现表单字段...以下内容可能会对您有所帮助。我强烈建议不要这样做,可能有更合适的解决方案。

form_label 函数比简单函数稍微复杂一些。相反,it uses twig's compile mechanismsgenerate specific php code。最终会call

FormRenderer::searchAndRenderBlock(FormView $view, string $blockNameSuffix, array $variables = [])

深入编译器,模板调用form_label(form, options)会变成:

$this->env->getRuntime('Symfony\Component\Form\FormRenderer')->searchAndRenderBlock(
    $form, 'label', $options
);

$this-&gt;env 似乎是树枝环境。这意味着,在你的树枝扩展 you need to have access to the proper Twig environment 中调用它,然后它应该已经可以使用我刚刚提供的配方了。特别是如果你可以省略 options 参数,我没有深入研究它是如何组装的(但它可能只是直截了当)。

所以你的 twig 函数必须通过以下方式定义:

    public function getFunctions(): array
    {
        return [
            new TwigFunction('myFunc', [&$this, 'myFunc'], [
                'needs_environment' => true,  // <--- this!
                'is_safe' => ['html'],
            ]),
        ];
    }

    public function myFunc(\Twig\Environment $env, $field) {
        // other stuff

        $html = $env->getRuntime(\'Symfony\Component\Form\FormRenderer\')->searchAndRenderBlock(
            $field, 'label', $options
        );

        return $html;
    }

【讨论】:

  • 感谢您的回答。又学到了新东西:)
  • 感谢您的留言。我的目标是用函数改变 form_row 元素的顺序。我想要的不是标签、小部件、错误:错误、标签、小部件。但我想通过一个简单的函数调用来做到这一点。再次感谢。
  • @jluishg 使用宏,或重新定义/覆盖 form_row。真正看看表单主题。
猜你喜欢
  • 2013-09-20
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 2012-07-27
  • 2015-04-22
  • 1970-01-01
相关资源
最近更新 更多