Конструктор форм Symfony - как поместить заголовок формы в селектор h2? - PullRequest
0 голосов
/ 31 октября 2018

Я хочу, чтобы заголовок моей формы отображался в селекторе 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 %}

1 Ответ

0 голосов
/ 31 октября 2018

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

Сначала расширяем 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 %}

Не стесняйтесь переопределить этот блок с вашими потребностями; -)

...