theme plantillas form_div_layout form email symfony render twig

email - plantillas - symfony using form



Cómo renderizar la plantilla de Twig desde la base de datos en symfony2 (10)

Estoy trabajando en una aplicación escrita en symfony2 y quiero enviar un correo electrónico después de alguna acción / evento ... el problema es que los usuarios pueden definir algo así como "plantillas de correo electrónico" que almacena en db como una cadena simple, por ejemplo: "Esto es un correo electrónico de {{user}} "y necesito presentar el cuerpo para el correo electrónico desde esa plantilla ... En la documentación de Symfony desde este enlace: http://symfony.com/doc/2.0/cookbook/email.html#sending-emails el http://symfony.com/doc/2.0/cookbook/email.html#sending-emails para render es $ this-> renderView y espera referencia al archivo como "paquete: controlador: archivo.html.twig", pero mi plantilla es base de datos como una cadena simple ... ¿Cómo puedo renderizarlo?


Clona el servicio twig nativo y reemplaza el cargador del sistema de archivos con el cargador twig nativo:

<service id="my.twigstring" class="%twig.class%"> <argument type="service" id="my.twigstring.loader" /> <argument>%twig.options%</argument> </service> <service id="my.twigstring.loader" class="Twig_Loader_String"></service>

Ejemplo de uso desde dentro de un controlador:

$this->get(''my.twigstring'')->render(''Hello {{ name }}'', array(''name'' => ''Fabien''));



Esto debería funcionar. Reemplaza "Hola {{nombre}}" con el texto de tu plantilla, y completa la matriz que se pasa a la función de renderizado con las variables que necesites.

$env = new /Twig_Environment(new /Twig_Loader_String()); echo $env->render( "Hello {{ name }}", array("name" => "World") );





Recientemente tuve que implementar un CMS utilizado por varias partes donde cada parte podía personalizar completamente sus plantillas. Para lograr esto, implementé un Twig Loader personalizado.

La parte más difícil fue crear una convención de nombres para las plantillas que garantizaran que no se superpondrán con ninguna plantilla existente, por ejemplo <organisation_slug>!AppBundle:template.html.twig . En caso de que la plantilla no se haya personalizado, la plantilla AppBundle:template.html.twig debería cargarse como plantilla de AppBundle:template.html.twig .

Sin embargo, esto no es posible con Chain Loader (AFAIK) porque allí el nombre de la plantilla no se puede modificar. Por lo tanto, tuve que inyectar el cargador predeterminado (es decir, la cadena de cargador) en mi cargador y usarlo para cargar la plantilla de respaldo.

Otra solución sería pasar la pila de solicitudes o la sesión al cargador de plantillas, lo que permite detectar automáticamente la organización, pero esto es difícil porque el componente de seguridad depende del subsistema de plantillas, lo que provoca problemas de dependencia circular.


Twig_Loader_String está en desuso y siempre fue diseñado para uso interno de todos modos. El uso de este cargador no se recomienda.

Desde el documento API:

Este cargador NUNCA debe ser utilizado. Solo existe para propósitos internos de Twig. Al usar este cargador con un mecanismo de caché, debe saber que se genera una nueva clave de caché cada vez que un contenido de plantilla "cambia" (la clave de caché es el código fuente de la plantilla). Si no desea ver que su caché crece fuera de control, debe encargarse de borrar el archivo de caché anterior por su cuenta.

Consulte también este problema: https://github.com/symfony/symfony/issues/10865

La mejor forma que conozco para cargar una plantilla desde una fuente String es:

Desde un controlador:

$template = $this->get(''twig'')->createTemplate(''Hello {{ name }}''); $template->render(array(''name''=>''World''));

como se describe aquí: twig.sensiolabs.org/doc/…

De una plantilla de ramita:

{{ include(template_from_string("Hello {{ name }}", {''name'' : ''Peter''})) }}

como se describe aquí: http://twig.sensiolabs.org/doc/functions/template_from_string.html

Tenga en cuenta que la función ''template_from_string'' no está disponible de manera predeterminada y debe cargarse. En Symfony, harías esto agregando un nuevo servicio:

# services.yml services: appbundle.twig.extension.string: class: Twig_Extension_StringLoader tags: - { name: ''twig.extension'' }


Twigengine no admite cadenas de representación. Pero hay un paquete disponible que agrega este comportamiento llamado TwigstringBundle .

Agrega el servicio $this->get(''twigstring'') que puede usar para renderizar sus cadenas.


$message = /Swift_Message::newInstance() ->setSubject(''Hello Email'') ->setFrom(''[email protected]'') ->setTo(''[email protected]'') ->setBody(''hai its a sample mail'') ; $this->get(''mailer'')->send($message);