HTML в формах Symfony2 вместо простого текста - PullRequest
14 голосов
/ 26 сентября 2011

Я пытаюсь реализовать что-то вроде этого:

<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}} неэлегатна.:)

Ответы [ 8 ]

11 голосов
/ 06 марта 2012

Решил эту проблему, используя следующий код в моей форме-теме:

{# ---- 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>'
    })
}}

таким образом, блок изтема формы будет применяться к любому флажку на странице.Если вам нужно также использовать default-theme, вы можете добавить параметр для включения специального рендеринга:

{# ---- 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>'
    })
}}
3 голосов
/ 26 августа 2017

Я бился головой об этом, потом был момент эврика.Самый простой способ сделать это - 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);
});

Aпара замечаний:

  • Отключает весь ранее экранированный код.После этого вам, безусловно, следует при необходимости повторить процедуру.
  • Для этого требуется тег extends для целевой темы формы в вашей собственной пользовательской теме формы, которую вы можете использовать в последующих формах.Поместите код веточки в собственную тему формы и замените ссылки на другую тему / темы формы этой.

В целом, это наименьшее количество строк кода для самого большого и лучшего результата, который у меня есть.удалось найти.Он также ультрапортативный и СУХОЙ: вы можете расширить любую тему формы, и метка изменится без изменения остального кода.

2 голосов
/ 05 апреля 2018

Другой очень простой подход - переопределить тему формы непосредственно в шаблоне, который отображает форму. Используя {% form_theme form _self %} это так просто:

{% form_theme form _self %}

{% block form_label %}
    {{ label | raw }}
{% endblock %}

{{ form_start(form) }}

См. Соответствующий раздел в документации:

https://symfony.com/doc/current/form/form_customization.html#method-1-inside-the-same-template-as-the-form

Самый простой способ настроить блок [...] - настроить его непосредственно в шаблоне, который фактически отображает форму.

Используя специальный тег {% form_theme form _self%}, Twig ищет внутри одного и того же шаблона любые переопределенные блоки формы. [...]

Недостатком этого метода является то, что настраиваемый блок формы нельзя использовать повторно при отображении других форм в других шаблонах. Другими словами, этот метод наиболее полезен при создании настроек формы, специфичных для одной формы в вашем приложении. Если вы хотите повторно использовать настройку формы для нескольких (или всех) форм в вашем приложении, читайте следующий раздел.

1 голос
/ 12 октября 2018

Другой подход заключается в использовании простой замены Twig:

{% set formHtml %}
   {{ form(oForm) }}
{% endset %}

{{ formHtml|replace({'[link]': '<a href=" ... ">', '[/link]': '</a>'})|raw }}

В вашей форме у вас есть что-то вроде этого, чтобы заставить его работать:

$formBuilder->add('conditions', CheckboxType::class, [
        'label' => 'Yes, I agree with the [link]terms and conditions[/link].'
    ]
);

Конечно, вы можете изменить [ссылку] на что-то еще. Обратите внимание, что вы не используете теги HTML ;-)

1 голос
/ 15 октября 2011

Я думаю, что вы ищете от темы . Таким образом, вы можете стилизовать каждую часть формы в отдельном файле, как вам угодно, а затем просто отобразить ее «элегантным» способом, строка за строкой с помощью {{ form_row(form) }} или просто с помощью {{ form_widget(form) }}. Вам решать, как вы это настроите.

0 голосов
/ 14 мая 2019

Symfony 4.2

TWIG:

{% block main %} 
   .... 
   {% form_theme form _self %}
...
 {{ form_row(form.policy, {'label': 'security.newPassword.policy'|trans({"%policyLink%":policyLink, "%termsLink%":termsLink})}) }}
   ...
{% endblock %}

{% block checkbox_radio_label %}
    <label{% with { attr: label_attr } %}{{ block('attributes') }}{% endwith %}>
        {{- widget|raw }} {{ label|unescape|raw }}
    </label>
{% endblock checkbox_radio_label %}

PHP:

use Twig\Extension\AbstractExtension;
use Twig\TwigFilter;

class AppExtension extends AbstractExtension
{
    public function getFilters()
    {
        return [
            new TwigFilter('unescape', function ($value) {
                return html_entity_decode($value);
            }),
        ];
    }
}
0 голосов
/ 25 октября 2017

Вы можете использовать форму темы другим способом: вы можете переместить тег <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 %}

Теперь, в вашем teplate, переопределите 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 %}
0 голосов
/ 12 сентября 2016

Так что оформить тему довольно сложно.Самая простая вещь, которую я нашел, это просто подавить метку поля ('label'=> false в классе форм Symfony), а затем просто добавить метку html в html веточки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...