Intento representar una entrada de formulario en una vista, pero en lugar de separar label, errors y widget, muestra la row completa de la entrada.

MyType.php

/**
 * {@inheritdoc}
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('email', EmailType::class, [
            'label' => 'Email',
            'required' => true,
        ])
        ->add('emailIsPublic', CheckboxType::class, [
            'label' => 'Make e-mail public (can be seen by everyone)',
            'required' => false,
            'attr' => [
                'class' => 'switch',
            ]
        ])
        ->add('submit', SubmitType::class, [
            'label' => 'Save changes',
            'attr' => [
                'class' => 'btn btn-outline-primary float-right',
            ]
        ]);
}

My-view.html.twig

{{ form_start(edit_form) }}
    <div>
        {{ form_label(edit_form.emailIsPublic) }}
    </div>
    <div>
        {{ form_errors(edit_form.emailIsPublic) }}
    </div>
    <div>
        {{ form_widget(edit_form.emailIsPublic) }}
    </div>
{{ form_end(edit_form, {'render_rest': false}) }}

HTML generado

<form name="appbundle_my" method="post">
    <div></div>
    <div></div>
    <div>
        <div class="form-check">
            <label class="form-check-label">
                <input id="appbundle_my_emailIsPublic" name="appbundle_my[emailIsPublic]" class="switch form-check-input" value="1" type="checkbox"> Make e-mail public (can be seen by everyone)
            </label>
        </div>
    </div>
</form>

Como podemos ver en el HTML generado, form_label y form_errors están vacíos y form_widget representa lo que form_row debería representar. ¿Por qué?

1
darckcrystale 16 feb. 2018 a las 16:03

2 respuestas

La mejor respuesta

Como vi aquí: https://github.com/symfony/symfony/issues / 26540 # issuecomment-375232354

Este comportamiento parece ser un error específico del uso del tema Bootstrap 4 Form.

Eso es específico del tema Bootstrap 4 y parece estar relacionado con los cambios realizados en # 26591 [TwigBridge] Make sure we always render errors. Eventhough labels are disabled.

Esperaré una actualización de Symfony para resolver esto.

0
darckcrystale 22 mar. 2018 a las 12:35

No estoy muy acostumbrado a ramitar y formar temas, pero estoy bastante seguro de que no puedes dividir la fila en estas 3 palmaditas debido al tipo de casilla. Cuando se usa un widget de casilla de verificación, la etiqueta se integra en la representación del widget. Al representar un form_row, representa la etiqueta de 3 partes, el error y el widget, mientras que el widget de casilla de verificación también representa la etiqueta. Lo que tiene sentido dado que la etiqueta es una información fundamental sobre el uso de la casilla de verificación.

{% block checkbox_widget -%}
    {%- set parent_label_class = parent_label_class|default(label_attr.class|default('')) -%}
    {%- set attr = attr|merge({class: (attr.class|default('') ~ ' form-check-input')|trim}) -%}
    {% if 'checkbox-inline' in parent_label_class %}
        {{- form_label(form, null, { widget: parent() }) -}}
    {% elseif 'form-check-inline' in parent_label_class %}
        <div class="form-check{{ not valid ? ' form-control is-invalid' }} form-check-inline">
            {{- form_label(form, null, { widget: parent() }) -}}
        </div>
    {% else -%}
        <div class="form-check{{ not valid ? ' form-control is-invalid' }}">
            {{- form_label(form, null, { widget: parent() }) -}}
        </div>
    {%- endif -%}
{%- endblock checkbox_widget %}

Puede intentar sobrescribir el bloque para este caso de uso específico agregando algo como esto en la plantilla:

{% form_theme form _self %}

{% block _edit_form_emailIsPublic_row %}
  {% spaceless %}
    ####build your markup for the checkbox here, use default on hot to access the needed informations etc.####
  {% endspaceless %}
{% endblock %}

O simplemente renderícelo por completo sin redefinir el bloque usado, escribiendo el marcado usted mismo y simplemente obtenga algunas cosas vitales como nombre, valores de etiqueta, etc.del objeto de formulario (edit_form.emailIsPublic.vars.label por ejemplo) sin llamar a ningún ayudante y configure el campo para que se procese después {% edit_form.emailIsPublic.setRendered %} si desea eliminar el render_rest: false

Espero que esto pueda llevarlo en la dirección correcta. Las formas pueden ser bastante molestas.

0
Joe 16 feb. 2018 a las 13:47