Twig - 为什么我不能访问我设置的变量?

时间:2014-07-13 19:02:15

标签: symfony variables twig

出于某种原因,在一个表单模板块中设置的变量我不能在子表单块中使用。

我有一个'实体'字段类型,用于显示选中的复选框,以允许用户选择相关项...

$builder
    ->add( 'title' )
    ->add(
        'apps',
        'entity',
        [
            'class'    => 'OurAdminBundle:App',
            'choices'  => $apps,
            'property' => 'title',
            'expanded' => true,
            'multiple' => true
        ]
    )

这是呈现表单的模板

// Effectively imported using the MopaBootstrapBundle
// {% form_theme form 'OurAdminBundle:Form:fields.html.twig %}

// Further in page theming
{% form_theme form _self %}

// Set variable when on the apps field, so it should be available to all child
// forms
{% block _gallery_apps_widget %}
    {% set custom_checkboxes = 1 %}
    {{ block('choice_widget') }}
{% endblock %}

// Attempt to retrieve the variable on the checkboxes within the apps entity 
/ field
{% block checkbox_widget %}
    {{ dump(custom_checkboxes|default(0) }}   // Displays 0
{% endblock checkbox_widget %}

这里是fields.html.twig文件中的代码(添加了少量调试......

{% block choice_widget_expanded %}
    {{ dump(custom_checkboxes|default(0)) }}
    {% set custom_checkboxes = custom_checkboxes|default(0) %}
    {{ dump(custom_checkboxes|default(0)) }}
{% spaceless %}
    {% set label_attr = label_attr|merge({'class': (label_attr.class|default(''))}) %}
    {% set label_attr = label_attr|merge({'class': (label_attr.class ~ ' ' ~ (widget_type != '' ? (multiple ? 'checkbox' : 'radio') ~ '-' ~ widget_type : ''))}) %}
    {% if expanded %}
        {% set attr = attr|merge({'class': attr.class|default(horizontal_input_wrapper_class)}) %}
    {% endif %}
    {% for child in form %}
        {% if widget_type != 'inline' %}
        <div class="{{ multiple ? 'checkbox' : 'radio' }}">
        {% endif %}
            <label{% for attrname, attrvalue in label_attr %} {{ attrname }}="{{ attrvalue }}"{% endfor %}>
                {{ form_widget(child, {'horizontal_label_class': horizontal_label_class, 'horizontal_input_wrapper_class': horizontal_input_wrapper_class, 'attr': {'class': attr.widget_class|default('')}}) }}
                {{ child.vars.label|trans({}, translation_domain) }}
            </label>
        {% if widget_type != 'inline' %}
        </div>
        {% endif %}
    {% endfor %}
{% endspaceless %}
{% endblock choice_widget_expanded %}

...成功显示&#39; 1&#39;在这两个方面。

我在这个问题上绞尽脑汁,但在我的生活中无法理解为什么我无法访问checkbox_widget块中的变量。请帮忙。

1 个答案:

答案 0 :(得分:1)

这是因为Symfony在调用form_widget()或任何其他form*系列函数时呈现表单字段。

Symfony创建一个新的单独作用域,它不共享父作用域(为了防止在渲染字段时出现作用域污染)。

如果您要将变量传递给复选框小部件,请修改form_widget中的choice_widget_expanded来电,以便custom_checkboxes传递{{ form_widget(child, { 'horizontal_label_class': horizontal_label_class, 'horizontal_input_wrapper_class': horizontal_input_wrapper_class, 'attr': {'class': attr.widget_class|default('')}, 'custom_checkboxes': custom_checkboxes }) }} (仅为了清晰起见,添加标签):< / p>

{{1}}