doushi3454 2016-02-12 17:16
浏览 218
已采纳

Symfony FormBuilder - 附加元素的自定义选项?

I've only recently started using Symfony (Symfony3) and I'm in the process of converting my old website to use Symfony. Currently with my form elements I have the addition of a validation error message element, plus a help/information element (an info symbol that shows the text on clicking).

<div id="info-username" class="additional-info">
    <p>Your username will be used as a way of <em>uniquely</em> identifying you when you log into your account. You can still log in using your email address in case you forget your username.</p>
    <p>It must be between 2-25 characters long and start with a letter. The following characters are permitted: letter, number, dot, underscore, dash.</p>
</div>

Symfony handles the validation error message element as standard but I can't see a way of easily adding extra info text. Ideally I would like this as an extra option I can then pass to the 'add' method of the FormBuilder. E.g.

->add('username', TextType::class, array(
    'info' => '<p>Your username will be used as a way of <em>uniquely</em> identifying you when you log into your account. You can still log in using your email address in case you forget your username.</p>
<p>It must be between 2-25 characters long and start with a letter. The following characters are permitted: letter, number, dot, underscore, dash.</p>'
)

Is that possible? Rather than adding it directly in my twig templates.

  • 写回答

2条回答 默认 最新

  • dtziv24262 2016-02-13 10:45
    关注

    I've worked out my own solution...

    I added a 'help' attribute to the required fields. E.g.

    ->add('username', TextType::class, array(
        'attr' => array(
            'help' => '<p>Your username will be used as a way of <em>uniquely</em> identifying you when you log into your account. You can still log in using your email address in case you forget your username.</p>
    <p>It must be between 2-25 characters long and start with a letter. The following characters are permitted: letter, number, dot, underscore, dash.</p>'
        ),
        )
    )
    

    I then had to overwrite the form_row block to add my help/info box and contents. Note the use of the 'raw' filter - I needed this as my help text includes html tags that need to be rendered so using this filter the tags will not be escaped.

    {# \app\Resources\views\form\form_div_layout.html.twig #}
    {% block form_row %}
      {% spaceless %}
        <div class="form-group">
          {{ form_label(form) }}
          <div class="col-sm-10">
            {{ form_widget(form) }}
            {{ form_errors(form) }}
            {% for attrname,attrvalue in attr %}
              {% if attrname == 'help' %}
                <div id="info-{{ id }}" class="additional-info alert alert-info alert-dismissible">
                  <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>
                  {{ attrvalue | raw }}
                </div>
              {% endif %}
            {% endfor %}
          </div>
        </div>
      {% endspaceless %}
    {% endblock form_row %}
    

    This got the info box to display correctly. However, it left the original text in a 'help' attribute of the field, so I removed that by overwriting the widget_attributes block and ignored outputting the 'help' attribute.

    {# \app\Resources\views\form\form_div_layout.html.twig #}
    {%- block widget_attributes -%}
        id="{{ id }}" name="{{ full_name }}"
        {%- if disabled %} disabled="disabled"{% endif -%}
        {%- if required %} required="required"{% endif -%}
        {%- for attrname, attrvalue in attr -%}
            {%- if attrname == 'help' -%}
              {# Prevent output of the help attribute #}
            {%- else -%}
              {{- " " -}}
              {%- if attrname in ['placeholder', 'title'] -%}
                  {{- attrname }}="{{ translation_domain is same as(false) ? attrvalue : attrvalue|trans({}, translation_domain) }}"
              {%- elseif attrvalue is same as(true) -%}
                  {{- attrname }}="{{ attrname }}"
              {%- elseif attrvalue is not same as(false) -%}
                  {{- attrname }}="{{ attrvalue }}"
              {%- endif -%}
            {%- endif -%}
        {%- endfor -%}
    {%- endblock widget_attributes -%}
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库
  • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
  • ¥15 请问怎么才能复现这样的图呀