Symfony FormBuilder - настраиваемый параметр для дополнительного элемента?

Я только недавно начал использовать Symfony (Symfony3) и нахожусь в процессе преобразования своего старого веб-сайта для использования Symfony. В настоящее время с моими элементами формы у меня есть добавление элемента сообщения об ошибке проверки, а также элемент справки/информации (информационный символ, который показывает текст при нажатии).

<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 стандартно обрабатывает элемент сообщения об ошибке проверки, но я не вижу способа легко добавить дополнительный информационный текст. В идеале я хотел бы, чтобы это была дополнительная опция, которую я могу затем передать методу «добавить» FormBuilder. Например.

->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>'
)

Это возможно? Вместо того, чтобы добавлять его непосредственно в мои шаблоны веток.


person Community    schedule 12.02.2016    source источник


Ответы (2)


Попробуйте следующее:

->add('username', TextType::class, 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>'
)

Если это не работает с этим типом поля, посмотрите на следующее расширение формы

person chalasr    schedule 12.02.2016
comment
Помощь по параметрам не существует. Определенные параметры: ... - я попробую HelpExtension. - person ; 12.02.2016
comment
Это, безусловно, более простая альтернатива (не требует переопределения полей по умолчанию) - person chalasr; 12.02.2016
comment
Я только что понял, что это то же расширение, на которое я уже смотрел, и оно не будет установлено - проект отображается как устаревший. - person ; 12.02.2016

Я разработал собственное решение...

Я добавил атрибут «помощь» в обязательные поля. Например.

->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>'
    ),
    )
)

Затем мне пришлось перезаписать блок form_row, чтобы добавить окно справки/информации и содержимое. Обратите внимание на использование «сырого» фильтра — мне это было нужно, так как мой текст справки включает теги html, которые необходимо отобразить, поэтому при использовании этого фильтра теги не будут экранированы.

{# \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 %}

Это заставило информационное окно отображаться правильно. Однако он оставил исходный текст в атрибуте «помощь» поля, поэтому я удалил его, перезаписав блок widget_attributes и проигнорировав вывод атрибута «помощь».

{# \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 -%}
person Community    schedule 13.02.2016