2014-03-12 117 views
3

我想我的所有标签转换为到的占位符输入:Symfony的窗体Label渲染

例:

这是标准的:

<div> 
    <label>FooBar</label> 
    <input type="text"/> 
</div> 
<div> 
    <label>FooBar2</label> 
    <input type="checkbox"/> 
</div> 

这就是我想要的东西:

<div> 
    <input type="text" placeholder="FooBar"/> 
</div> 
<div> 
    <label>FooBar2</label> 
    <input type="checkbox"/> 
</div> 

我试图通过覆盖部分树枝表单模板来实现此目的,但一直不成功。这里有一个尝试:

{% block form_widget_simple %} 
    {% set type = type|default('text') %} 

     {% if type == 'text' %} 
        {% block form_label %}{% endblock %} 
     {% endif %} 

    <input placeholder="{{ label|trans({}, translation_domain) }}" data-test="formtest" type="{{ type }}" {{ block('widget_attributes') }} {% if value is not empty %}value="{{ value }}" {% endif %}/> 
{% endblock form_widget_simple %} 

谢谢!

回答

1

离开这个坐了一会儿,学习了更多的树枝后,我终于回到了它,并做到了正确的方式。

IMO,这是应该怎么做:

{% extends 'form_div_layout.html.twig' %} 


{# override label creation, remove all labels from inputs and text areas #} 

{% block form_row %} 
{% spaceless %} 
    <div> 
    {% if form.vars.block_prefixes[1] != 'text' %} 
     {{ form_label(form) }} 
    {% endif %} 
    {{ form_errors(form) }} 
    {{ form_widget(form) }} 
    </div> 
{% endspaceless %} 
{% endblock form_row %} 


{# widgets #} 
{% block form_widget_simple %} 
    {% set type = type|default('text') %} 
    <input placeholder="{{ label|trans({}, translation_domain) }}" type="{{ type }}" {{ block('widget_attributes') }} {% if value is not empty %}value="{{ value }}" {% endif %}/> 
{% endblock form_widget_simple %} 

{% block textarea_widget %} 
{% spaceless %} 
    <textarea placeholder="{{ label|trans({}, translation_domain) }}" {{ block('widget_attributes') }}>{{ value }}</textarea> 
{% endspaceless %} 
{% endblock textarea_widget %} 

就像一个魅力!

0

会这样的工作?

{{ form_widget(form.yourFormField, {'attr': {'placeholder': twigVariableYouWantToUseAsPlaceHolder}}) }} 

我通常使用的form_widget功能有超过正由Symfony的形式创建的HTML元素的完全控制。

有一个更完整的例子在这里: http://symfony.com/doc/current/cookbook/form/form_customization.html

+0

我认为他想要一个一杆解决方案。有了这个,它必须为每个小部件完成。 – ncrocfer

+0

感谢您的回应!是的,我正在寻找一种通用的解决方案。 – Jacob

0

你告诉嫩枝使用您的自定义模板,以主题形式? 您可以在其中添加这一行包含一个表单每个页面做到这一点:

{% form_theme form 'AcmeDemoBundle:Form:fields.html.twig' %} 

或者您的所有形式的config.yml文件做一次:

twig: 
    form: 
     resources: 
      - 'AcmeCoreBundle::fields.html.twig' 
+0

我已经添加了树枝配置来使用我的自定义主题,我让它呈现我的主题,我只是没有按照我想要的方式呈现它:P – Jacob

0

也许在widget_attributes块:

{% block widget_attributes %} 
    {% spaceless %} 

    {% set type = type|default('text') %} 

    {% for attrname,attrvalue in attr %}{{attrname}}="{{attrvalue}}" {% endfor %} 

    {% if type == 'text' %} 
     placeholder="{{ label|trans }}" 
    {% endif %} 

    {% endspaceless %} 
{% endblock widget_attributes %} 
+0

如果我这样做,我将如何关闭呈现标签非文本输入表单字段? – Jacob

0

我创建了一个具有a dedicated option for that的Bootstrap包。您可以搜索the form theme以了解labels_to_placeholders这个术语的用法。或者,如果您自己使用Bootstrap,只需使用我的捆绑软件即可。 ;)

+0

谢谢!我会检查出来,如果我得到它的工作,我会接受你的答案。 – Jacob

0

更短的方式和保持原始块代码(仍然有更新)。

{% use 'form_div_layout.html.twig' with widget_attributes as base_widget_attributes %} 
{% block widget_attributes %} 
    {% set attr = {'placeholder': label|trans({}, translation_domain)} %} 
    {{- block('base_widget_attributes') -}} 
{% endblock widget_attributes %} 
0

如果您正在使用新的系统启动主题:

{% extends 'bootstrap_3_layout.html.twig' %} 

{% block form_row -%} 
    <div class="form-group{% if (not compound or force_error|default(false)) and not valid %} has-error{% endif %}"> 
     {% if form.vars.block_prefixes[1] != 'text' %} 
      {{ form_label(form) }} 
     {% endif %} 
     {{ form_widget(form) }} 
     {{ form_errors(form) }} 
    </div> 
{%- endblock form_row %} 

{% block form_widget_simple -%} 
    {% if attr.placeholder is not defined or attr.placeholder == '' %} 
     {% set attr = attr|merge({placeholder: label|trans({}, translation_domain)|trim(':')|trim}) %} 
    {% endif %} 

    {% if type is not defined or 'file' != type %} 
     {% set attr = attr|merge({class: (attr.class|default('') ~ ' form-control')|trim}) %} 
    {% endif %} 
    {{- parent() -}} 
{%- endblock form_widget_simple %} 

{% block textarea_widget -%} 

    {% if attr.placeholder is not defined or attr.placeholder == '' %} 
     {% set attr = attr|merge({placeholder: label|trans({}, translation_domain)|trim(':')|trim}) %} 
    {% endif %} 

    {% set attr = attr|merge({class: (attr.class|default('') ~ ' form-control')|trim}) %} 
    {{- parent() -}} 
{%- endblock textarea_widget %} 

注:我添加|trim(':')从由FOSUserBundle产生的结束标签删除冒号。

也为我的项目,我想大投入,所以我说input-lg这里(既简单又textarea的):

{% set attr = attr|merge({class: (attr.class|default('') ~ ' input-lg form-control')|trim}) %}