Конструктор форм symfony - как поместить заголовок формы в селектор h2?

Я хочу, чтобы заголовок моей формы отображался в селекторе h2. Я сделал что-то подобное, но это выдает ошибку «исключение:» Исключение было выброшено во время рендеринга шаблона («Примечание: неопределенное смещение: -1») ».

 // how should I change THIS part? To change only the main form title/label?
 // I made it work somehow but then it changes all labels... Is there some 
 // selector which allows to style MAIN title of the form?
{% block form_label %}
    {% spaceless %}
        <h2>{{ form_label(form) }}</h2>
    {% endspaceless %}
{% endblock form_label %}

Я слышал, что мне не следует помещать его в свой файл проекта в селектор h2 только в шаблоне формы. Это чище, и хотя документация не запрещает, мне предлагали сделать это по-другому, и я хочу попробовать именно так.

{% form_theme form 'Forms/base_form.html.twig' %}
{{ form_start(form) }}

    {{ form_label(form, 'Project title', { 'label_attr': {'class': 'main-form-label'} }) }} 
  // so as I shouldn't put all that line in <h2> can I somehow do it in template between  {% block form_label %} ?

    {{ form_row(form.title, {'label': 'My title'}) }}
    {{ form_row(form.isComplete, {'label': 'Dropdown'}) }}
    {{ form_row(form.comment, {'label': 'Comment'}) }}
    {{ form_row(form.submit, {'label': 'Submit'}) }}


{{ form_end(form) }}

Также ... В чем разница / что использовать - {% block form_label %} или {%- block form_label -%}

Весь мой шаблон:

{% block form_label %}
    {% spaceless %}
        <h2>{{ form_label(form) }}</h2>
    {% endspaceless %}
{% endblock form_label %}

{% block form_row %}
    {% spaceless %}
        {{ form_widget(form) }}
        {{ form_errors(form) }}
    {% endspaceless %}
{% endblock form_row %}

{% block submit_row %}
    {% spaceless %}
        <div class="col-12">
            {{ form_widget(form) }}
        </div>
    {% endspaceless %}
{% endblock submit_row %}

{% block text_widget %}
    {% spaceless %}
        <div class="col-12">
            <div>
                {{ form_label(form) }}
            </div>
            {{ form_widget(form) }}
        </div>
    {% endspaceless %}
{% endblock text_widget %}

{% block choice_widget %}
    {% spaceless %}
        <span>
            {{ form_label(form) }}

            {% if expanded %}
                {{ block('choice_widget_expanded') }}
            {% else %}
                {{ block('choice_widget_collapsed') }}
            {% endif %}
            {{ form_errors(form) }}
        </span>
    {% endspaceless %}
{% endblock choice_widget %}

Привет, вы пытались изменить свой шаблон? после symfony.com/doc/current/form/form_customization.html Что вы пробовали до сих пор?

S. Bureau 31.10.2018 13:34

@ S.Bureau Ага, я только что опубликовал весь шаблон, который я сделал.

Aerogirl 31.10.2018 13:37

Я предполагаю, что ваш шаблон уже расширяет другой ... Не могли бы вы попробовать этот {% block form_label -%}<h2>{{- parent() -}}</h2>{%- endblock form_label %}

S. Bureau 31.10.2018 13:41

Очевидно, я не расширяю еще один: P 400, исключение: «Вызов« родителя »в шаблоне, который не расширяется, ни« использование »другого шаблона запрещено».

Aerogirl 31.10.2018 13:55

Упс, извините за такое предположение: p Что ж, вы можете попробовать добавить следующую строку в начало вашего шаблона: {% use "form_div_layout.html.twig" %} Этот файл является основным макетом, включенным в поставку symfony / twig, так что вы должны найти его без проблем. Другое решение - переопределить {%- block form_label -%} из этого файла.

S. Bureau 31.10.2018 14:01

Хм, я только что прочитал ваше обновление первого блока кода ... Я не понял, что вам нужна только первая метка в теге <h2>. Не могли бы вы рассказать, как вы определили этот заголовок в своем FormType?

S. Bureau 31.10.2018 14:06

Не работает, все еще выдает сообщение «Во время рендеринга шаблона возникло исключение (« Примечание: неопределенное смещение: -1 »).». Можно ли стилизовать ТОЛЬКО главный заголовок формы? Мне кажется, что весь блок form_label относится ко всем ярлыкам, в том числе и к тем, которые используются в виджетах.

Aerogirl 31.10.2018 14:10

Да, я добавил еще один комментарий, я понял, что вы хотели, после прочтения вашего обновления OP -__- '(извините ...). Не могли бы вы рассказать, как вы определяете метку, которую хотите отображать в своем FormType?

S. Bureau 31.10.2018 14:12

Я не видел ни одного типа, который позволил бы мне независимо стилизовать заголовок формы, поэтому ... я не добавил его туда. Просто вот так воткнули в мою ветку {{ form_label(form, 'Project title', { 'label_attr': {'class': 'main-form-label'} }) }} . Думаю, я просто усложняю дело, чем должно быть. Я просто помещаю его между h2 в моем файле и избегаю создания шаблона. Это всего лишь один маркер, который мне нужно добавить для каждой формы :)

Aerogirl 31.10.2018 14:16

Я не знаю, как вы определяете свой «Главный заголовок» в своем FormType, но если вы это сделаете, вы можете передать атрибут из своего FormType в шаблон формы. В вашем шаблоне вы проверяете наличие этого атрибута, если это так, вы помещаете свою метку между тегами <h2>, если нет, вы просто делаете то же самое, что и в любом другом месте.

S. Bureau 31.10.2018 14:18

Что это должен быть за атрибут? Класс будет нормально? Вы имеете в виду что-то вроде этого ->add('title',TextType::class, [ 'attr' => ['class' => 'mainTitle']]) - в конструкторе форм и в моем шаблоне: {%- block form_label -%} {% if form.parent class 'mainTitle' %} <h2>{{ form_label(form) }}</h2> {% endif %} {%- endblock form_label -%}?

Aerogirl 31.10.2018 14:26

Да, класс будет в порядке :) (в атрибуте label_attr внутри вашего FormType, чтобы быть чище)

S. Bureau 31.10.2018 14:27

Как мне проверить, есть ли у этого элемента класс в шаблоне? Конструктор форм не работает с hasClass ()

Aerogirl 31.10.2018 14:35

Дайте мне одну минуту, чтобы дать полный ответ ;-)

S. Bureau 31.10.2018 14:36
0
14
341
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

На случай, если где-то застряли;) Мы делаем это таким образом (когда нам нужен индивидуальный рендеринг).

Сначала мы расширяем FormType:

namespace App\Form\Extension;

use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\Extension\Core\Type\FormType;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\OptionsResolver\OptionsResolver;

class FormTypeExtension extends AbstractTypeExtension
{
    public function getExtendedType()
    {
        return FormType::class;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefault('main_title', false);
        $resolver->setAllowedTypes('main_title', 'boolean');
    }

    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        $view->vars['main_title'] = $options['main_title'];
    }
}

Подумайте зарегистрировать свое расширение в Symfony!

Затем вы можете использовать его в своем конструкторе форм следующим образом:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add(
        'myField',
        TextType::class,
        array(
            'main_title' => true
        ));
}

Наконец, в вашем шаблоне:

{% block form_row -%}
{% spaceless %}

    {% if main_title %}
        <h2>{{ form_label(form) }}</h2>
    {% else %}
        {{ form_label(form) }}
        {{ form_widget(form) }}
    {% endif %}

{% endspaceless %}
{%- endblock form_row %}

Не стесняйтесь переопределить этот блок под свои нужды ;-)

Вау! Теперь, я думаю, что мой пример слишком мал, чтобы использовать его только для h2, но он дает гораздо больше места для настройки всего, если он создает действительно классную форму! Спасибо чувак! Пользовательские типы форм кажутся немного менее черной магией;)

Aerogirl 31.10.2018 14:58

Очень рад это прочитать! Symfony - это волшебство !!! : D На работе мы часто используем расширения под свои нужды ;-)

S. Bureau 31.10.2018 14:59

Другие вопросы по теме