Я пытаюсь реализовать что-то вроде этого:
<div> <input type="checkbox" name="checkbox" id="checkbox_id" /> <label for="checkbox_id">I agree to the <a href="/tos">Terms of Service</a></label> </div>
Самое близкое, что я придумал, это:
<div> {{ form_widget(form.agreeWithTos) }} <label for="{{ form.agreeWithTos.vars.id }}">I agree to the <a href="#">Terms of Service</a></label> </div>
Есть ли способ лучше? Необходимо указать {{form.agreeWithTos.vars.id}} неэлегантно. 🙂
Решила эту проблему, используя следующий код в моей форме-теме:
{# ---- form-theme.html.twig #} {% block checkbox_row %} {% spaceless %} <div> {{ form_errors(form) }} <label class="checkbox" for="{{ form.vars.id }}"> {{ form_widget(form) }} {{ label|default(form_label(form)) | raw }} </label> </div> {% endspaceless %} {% endblock %}
в вашем шаблоне формы вы можете использовать:
{% form_theme form '::form-theme.html.twig' %} {{form_row(form.termsOfServiceAccepted, { 'label' : 'I have read and agree to the <a href="#">Terms and conditions</a>' }) }}
таким образом, блок из формы-темы применим к любому флажку на странице. Если вам нужно также использовать тему по умолчанию, вы можете добавить параметр для включения специального рендеринга:
{# ---- form-theme.html.twig #} {% block checkbox_row %} {% spaceless %} {% if not useTosStyle %} {{ parent() }} {% else %} {# ... special rendering ... #} {% endif %} {% endspaceless %} {% endblock %}
который будет использоваться следующим образом:
{% form_theme form '::form-theme.html.twig' %} {{form_row(form.termsOfServiceAccepted, { 'useTosStyle' : true, 'label' : 'I have read and agree to the <a href="#">Terms and conditions</a>' }) }}
Я думаю, вы ищете форму . Таким образом, вы можете в {{ form_widget(form) }}
каждую часть формы в независимом файле, а затем просто визуализировать ее «элегантным» способом, по очереди с {{ form_row(form) }}
или просто с {{ form_widget(form) }}
. Это действительно зависит от вас, как вы его настроили.
Таким образом, оформление формы довольно сложно. Самое легкое, что я нашел, это просто подавить метку поля ( 'label'=> false
в классе формы Symfony), а затем просто добавить ярлык html в твист html.
Я бил головой об этом, а потом был момент эврики. Самый простой способ сделать это – BY FAR – создать расширение Twig.
Вот мой код Twig:
{# twig example #} {% block form_label %} {% set label = parent() %} {{ label|unescape|raw }} {% endblock %}
и PHP:
<?php new Twig_SimpleFilter('unescape', function($value) { return html_entity_decode($value); });
Пара отмечает:
extends
для вашей целевой формы темы в вашей собственной теме пользовательской формы, которую вы можете использовать в своих последующих формах. Поместите код ветви в тему пользовательской формы и замените ссылки на вашу другую тему темы / темы с этим. В целом это наименьшие строки кода для самого большого и лучшего результата, который я смог найти. Он также ультра-портативный и DRY: вы можете продлить любую тему формы, и ярлык изменится без изменения остальной части вашего кода.
Вы могли бы использовать форму в другом виде: вы можете переместить <label>
вне функции form_label()
.
Создайте специальную тему формы, и для form_label
переместите <label>
вне функции form_label
:
{% block checkbox_row %} <label>{{ form_label(form) }}</label> {{ form_errors(form) }} {{ form_widget(form) }} {% endblock checkbox_row %} {% block checkbox_label %} {{ label }} {% endblock checkbox_label %}
Теперь, в вашем тесте, переопределите label
вашего флажка и, таким образом, эффективно добавьте HTML в функцию метки:
{% form_theme form 'yourtheme.html.twig' _self %} {% block _your_TOS_checkbox_label %} I agree with <a href="#" target="_blank">terms and conditions</a> {% endblock _your_TOS_checkbox_label %}