php - createform - symfony 2.3 form
Creador de formularios Symfony2: elimine la etiqueta, hágala marcador de posición (11)
Estoy jugando con el generador de formularios de Symfony, y no puedo encontrar una manera de no mostrar una etiqueta. Además, estoy interesado en establecer un marcador de posición para cada cuadro de entrada. es posible? Investigué un poco y no encontré nada.
Mi forma:
<form action="{{ path(''searchPeople'') }}" method="post" class="form-inline">
{{ form_errors(form) }}
{{ form_row(form.first_name) }}
{{ form_row(form.last_name) }}
{{ form_rest(form) }}
<br />
<button type="submit" class="btn btn-primary" /><i class="icon-search"></i>Search</button>
</form>
EDIT: ¡Resuelto! Todas las soluciones a continuación ayudaron, pero di la respuesta al comentario útil principal. Agradezco toda la ayuda. Para cualquier otra persona que se encuentre con esto, este es mi código de trabajo final:
<form action="{{ path(''searchPeople'') }}" method="post" class="form-inline">
{{ form_errors(form) }}
{{ form_errors(form.first_name) }}
{{ form_widget(form.first_name, {''attr'': {''placeholder'': ''First Name''} }) }}
{{ form_errors(form.last_name) }}
{{ form_widget(form.last_name, {''attr'': {''placeholder'': ''Last Name''} }) }}
{{ form_rest(form) }}
<br />
<button type="submit" class="btn btn-primary" /><i class="icon-search icon-white"></i>Search</button>
</form>
Symfony 2.8 y superior
Eliminar form_label
{% block form_row %} <div> {{ form_errors(form) }} {{ form_widget(form) }} </div> {% endblock form_row %}
Añadir un marcador de posición
{% block form_widget_simple %} {% set type = type|default(''text'') %} <input placeholder="{{ translation_domain is same as(false) ? label : label|trans({}, translation_domain) }}" type="{{ type }}" {{ block(''widget_attributes'') }} {% if value is not empty %}value="{{ value }}" {% endif %}/> {% endblock form_widget_simple %}
¡Hice esto recientemente! :) Querrá crear una nueva plantilla de campos, para form_row y una para form_widget. A continuación, elimine la parte form_label y agregue su marcador de posición.
http://symfony.com/doc/current/cookbook/form/form_customization.html
Puede hacerlo por campo o configurarlo para todos.
O también puede saltarse la eliminación de form_label de la plantilla form_row, y simplemente hacer form_widget () donde está llamando a form_row ()
Ampliando la respuesta de Léo:
{% use ''form_div_layout.html.twig'' %}
{% block widget_attributes %}
{% spaceless %}
{% set attr = attr|merge({''placeholder'': label}) %}
{{ parent() }}
{% endspaceless %}
{% endblock widget_attributes %}
trans
filtro trans
ha sido eliminado porque está incluido en el padre .
Convertir etiqueta en marcador de posición
{% use ''form_div_layout.html.twig'' with widget_attributes as base_widget_attributes %}
{% block widget_attributes %}
{% set attr = {''placeholder'': label|trans({}, translation_domain)} %}
{{- block(''base_widget_attributes'') -}}
{% endblock widget_attributes %}
Debe renderizar el formulario manualmente.
Aquí hay un ejemplo:
<form id="form-message" action="{{ path(''home'') }}" method="post" {{ form_enctype(form) }}>
{{ form_label(form.name) }}
{% if form_errors(form.name) %}
<div class="alert alert-error">
{{ form_errors(form.name) }}
</div>
{% endif %}
{{ form_widget(form.name) }}
{{ form_row(form._token) }}
<input type="submit" class="btn" value="Submit">
</form>
Para aquellos que NO usan form_row
, siempre puede agregar el marcador de posición como atributo directamente al agregar la entrada al generador. Al igual que:
$task = new Task();
$form = $this->createFormBuilder($task)
->add(''first_name'', ''text'', array(
''required'' => true,
''trim'' => true,
''attr'' => array(''placeholder'' => ''Lorem Ipsum'')
)->getForm();
Para resumirlo:
La respuesta de Titi es la más simple;
Las respuestas de Mick , Léo y Quolonel son las más efectivas, pero están incompletas (para symfony> 2.6):
Si usa la opción label_format
en su *Type::configureOptions
, su solución no funciona. Necesita agregar el contenido del bloque form_label
para manejar todas las posibilidades de etiquetas. La respuesta completa y más efectiva (código utilizado w / symfony 3.3):
Eliminar form_label
{% block form_row %} <div> {{ form_errors(form) }} {{ form_widget(form) }} </div> {% endblock form_row %}
Edite el bloque
widget_attribute
{% block widget_attributes %} {% spaceless %} {% if label is not same as(false) -%} {% if label is empty -%} {%- if label_format is not empty -%} {% set label = label_format|replace({ ''%name%'': name, ''%id%'': id, }) %} {%- else -%} {% set label = name|humanize %} {%- endif -%} {%- endif -%} {% set attr = attr|merge({''placeholder'': label}) %} {%- endif -%} {{ parent() }} {% endspaceless %} {% endblock widget_attributes %}
Notas :
No traduzca las etiquetas al bloque
widget_attributes
, de lo contrario, aparecerán como traducciones faltantes.La solución no funciona para las casillas de verificación ni los botones de opción, querrá agregar algo como:
{%- block checkbox_widget -%} {{ parent() }} {{- form_label(form) -}} {%- endblock checkbox_widget -%}
Sé que ya está respondido, pero podría ayudar a alguien que está buscando una solución diferente para los marcadores de posición, si no quiere cambiar nada en su plantilla ramita:
$builder->add(
''name'',
''text'',
array(
''attr'' => array(
''placeholder'' => ''Your name'',
),
''label'' => false,
)
);
Si está sacando el campo con form_rest, tendrá que establecer la etiqueta para el campo en falso en el generador de formularios con algo así como
$builder->add(''first_name'', ''text'', array(
''label'' => false,
));
Si imprime los campos individualmente, puede omitir form_label para ese campo en la plantilla twig o establecerlo en una cadena vacía.
{{ form_label(form.first_name, '''') }}
También puede copiar las etiquetas en el atributo marcador de posición antes de representar el formulario:
$formView = $form->createView();
foreach($formView->getIterator() as $item) {
/** @var $item FormView */
if ($item->vars[''label'']) {
$item->vars[''attr''][''placeholder''] =$item->vars[''label''];
}
}
para otros que se encuentran con esta etiqueta-pregunta: puede usar el tema del formulario para anular la etiqueta form_row para cada forma que desee. Sin embargo, recomiendo simplemente configurarlo para la optimización del lector de página. mi ejemplo con bootstrap:
{% block form_row %}
{% spaceless %}
{{ form_label(form, null, {''label_attr'': {''class'': ''sr-only''}}) }}
{{ form_errors(form) }}
{{ form_widget(form) }}
{% endspaceless %}
{% endblock form_row %}
no olvides incluir tu formthetheme en config.yml y template.