如何使用现有的小部件表单模板块

How to use existing widget form template blocks

我正在创建自定义 Twig 表单模板块来进行一些特殊渲染。

到目前为止,我一直无法使用某些内置的表单块。具体来说,还有 {{ *_widget() }} 个块。

示例:

声明一个新的 Twig 函数。

/* src/SiteBundle/Library/TwigExtension.php - Bundle-specific Twig extension */
...
public function getFunctions
{
  $ret = [
    new \Twig_SimpleFunction( 'wwui_myBlock', null, ['node_class'=>'Symfony\Bridge\Twig\Node\RenderBlockNode, 'is_safe'=>['html']] )
  ];
  return $ret;
}

该扩展名已在 service.yml 文件中注册,并且由于没有关于未定义 wwui_myBlock 函数的错误,因此显然可以识别。

定义 Twig 块。

{# src/SiteBundle/Resources/views/Form/fields.html.twig - Custom form blocks #}
{% block wwui_myBlock %}
  <div class="formRow form-group-xs clearfix">
    <div class="col-xs-1"></div>
    {%- set label_attr = label_attr|merge({class: (label_attr.class|default('') ~ ' col-xs-2' )|trim}) -%}
    {{ form_label( form ) }}
    <div class="col-xs-9">
      {{ choice_widget( form ) }}
    </div>
  </div>
{% endblock wwui_myBlock %}

在页面模板中。

{# Page-specific template #}
...
  {{ form_start( form ) }}
    ...
    {{ wwui_myBlock( form.options ) }} {# options is a choice with radio buttons. #}
    ...
  {{ form_end( form ) }}

呈现此页面时抛出异常: The function "choice_widget" does not exist in SiteBundle:Form:fields.html.twig at line 62

我的 fields.html.twig 文件 "uses" bootstrap_3_horizontal_layout.html.twig。该文件 "uses" bootstrap_3_layout.html.twig 反过来,"uses" Twig 的默认值 form_div_layout.html.twig

为什么我的自定义块看不到 form_div_layout.html.twig 中定义的 choice_widget

事实证明,访问此类块的正确方法是使用 block() 函数。所以,而不是

{{ choice_widget( form ) }}

{{ block( 'choice_widget', form ) }}