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''));
Con Symfony 2.2 puede usar el Twig_Chain_Loader
¿Cómo registrar otro cargador Twig (personalizado) en el entorno Symfony2?
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")
);
FYI, se suggested que esta característica se added en el núcleo de Twig a partir de http://twig.sensiolabs.org/doc/functions/template_from_string.html , pero será necesario que el desarrollador la active.
La mejor forma de hacerlo es usar template_from_string
función template_from_string
twig.
{{ include(template_from_string("Hello {{ name }}")) }}
{{ include(template_from_string(page.template)) }}
Ver http://twig.sensiolabs.org/doc/functions/template_from_string.html
Vea por qué no es una buena idea usar Twig_Loader_Chain
o Twig_Loader_String
para ese propósito en https://github.com/symfony/symfony/issues/10865 .
Puede encontrar un buen ejemplo aquí: twig.sensiolabs.org/doc/…
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);