validar validacion solo pattern numeros letras formularios formulario ejemplos con forms symfony twig

forms - validacion - validar solo letras en html



Symfony 2 tipo de campo de formulario personalizado: ¿cómo agregar javascript y css solo una vez? (4)

Así es como lo uso. Espero que sea lo que estás buscando.

base.html.twig

<head> {% block stylesheets %} css... {% endblock %} </head>

foo.html.twig

{% extends ''::base.html.twig'' %} {% block stylesheets %} {{ parent() }} css that you need in foo.html.twig {% endblock %}

Deseo usar javascript en la extensión de tipo de campo de formulario personalizada de Symfony 2. Entonces, tengo la plantilla de extensión Twig así:

{% block some_widget %} <input ... /> <script src="some.js"></script> <link href="some.css" /> {% endblock %}

Pero quiero tener estos guiones y etiquetas de enlace solo una vez en mi HTML, idealmente en la etiqueta principal, sin modificar la plantilla base. Intenté extender los bloques de Twig, pero no tengo acceso a bloques de plantillas de acciones dentro de la plantilla de formulario. O tal vez algo como esto:

{# widget tempate #} {% block some_widget %} <input ... /> {{ use_javascript(''some.js'') }} {{ use_css(''some.css'') }} {% endblock %} {# main action template #} ... <head> {{ dump_javascripts() }} {{ dump_css() }} </head> ...

¿Cómo hacer esto con Symfony 2 Forms + Twig?

PD: Lo siento por mi mal inglés.


La mejor manera es proporcionar la plantilla separada con la carga de css y scripts. Con los comentarios en Léame, lo único que debe hacer el desarrollador es

{% block stylesheets %} {{ parent() }} include "@MyBestBundle/Resources/view/styles.html.twig" {% endblock %}

o intente interceptar la representación del formulario con DI y agregar los activos. Pero es más difícil de hacer, si es posible implementarlo.


Tuve que escribir un widget de formulario independiente que requiere javascript, pude lograr lo que está intentando hacer a través del event_dispatcher escuchando en kernel.response para agregar el javascript al final de Symfony/Component/HttpFoundation/Response . Aquí hay un fragmento de mi tipo de formulario:

<?php namespace AcmeBundle/Form; use Symfony/Component/Form/AbstractType; use Symfony/Component/EventDispatcher/EventDispatcherInterface; use Symfony/Component/Form/FormView; use Symfony/Component/Form/FormInterface; class AcmeFileType extends AbstractType{ private $twig; private $dispatcher; public function __construct(/Twig_Environment $twig, EventDispatcherInterface $dispatcher){ $this->twig = $twig; $this->dispatcher = $dispatcher; } public function buildView(FormView $view, FormInterface $form, array $options){ $javascriptContent = $this->twig->render(''AcmeBundle:Form:AcmeFileType.js.twig'', array()); $this->dispatcher->addListener(''kernel.response'', function($event) use ($javascriptContent) { $response = $event->getResponse(); $content = $response->getContent(); // finding position of </body> tag to add content before the end of the tag $pos = strripos($content, ''</body>''); $content = substr($content, 0, $pos).$javascriptContent.substr($content, $pos); $response->setContent($content); $event->setResponse($response); }); } ...

Cuando define su tipo de formulario en su services.yml se ve así:

acme.form.acme_file_type: class: AcmeBundle/Form/AcmeFileType arguments: - @twig - @event_dispatcher tags: - { name: form.type, alias: acmefile }

Entonces, cada vez que construyas un formulario con acmefile el javascript se agregará al <body> . Sin embargo, esta solución no evita que el javascript esté presente varias veces , pero debería poder mejorarlo fácilmente para adaptarlo a sus necesidades.

También puede jugar con el objeto $response para modificar los encabezados si lo desea.


Encontré un método "sucio" utilizado por muchas personas en otras situaciones. Verificamos la carga de script en el lado del cliente. En caso de que tengamos un archivo zlkladr.js, que tenga un objeto global ''zlkladr''

{% block our_widget %} {% spaceless %} ... <script> // We must load the script only once, even if many widgets on form if ( !window.zlkladr ) { document.write(''<script src="{{ asset(''bundles/kladr/js/zlkladr.js'') }}"></sc''+''ript>''); } </script> {% endspaceless %} {% endblock %}