web-dev-qa-db-fra.com

Comment rendre un template Twig depuis une base de données dans symfony2

Je travaille sur une application écrite dans symfony2 et je souhaite envoyer un courrier électronique après une action/un événement ... le problème est que les utilisateurs peuvent définir quelque chose comme "modèles de courrier électronique" qui stocke dans la base de données sous forme de chaîne simple, par exemple: y a-t-il un courrier électronique de {{utilisateur}} "et je dois rendre le corps du courrier électronique de ce modèle ... Dans la documentation de symfony à partir de ce lien: http://symfony.com/doc/2.0/cookbook/ email.html # send-emails le methos pour le rendu est $ this-> renderView et attend une référence au fichier comme "bundle: controller: file.html.twig", mais mon modèle est une base de données sous la forme d'une simple chaîne ...Comment puis-je le rendre?

27
Karol Fiturski

Twig_Loader_String est obsolète et a toujours été conçu pour un usage interne. L'utilisation de ce chargeur est fortement déconseillée.

De la doc API:

Ce chargeur ne doit JAMAIS être utilisé. Il n'existe que pour Twig internal fins. Lorsque vous utilisez ce chargeur avec un mécanisme de cache, vous devriez Sachez qu'une nouvelle clé de cache est générée à chaque fois qu'un contenu de modèle "change" (la clé de cache étant le code source du modèle). Si vous ne voulez pas voir votre cache devenir hors de contrôle, vous devez prenez soin de vider vous-même l'ancien fichier de cache.

Découvrez également ce problème: https://github.com/symfony/symfony/issues/10865


Le meilleur moyen que je connaisse pour charger un modèle à partir d'une source String est:

D'un contrôleur:

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

comme décrit ici: http://twig.sensiolabs.org/doc/recipes.html#loading-a-template-from-a-string

A partir d'un modèle de brindille:

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

comme décrit ici: http://twig.sensiolabs.org/doc/functions/template_from_string.html

Notez que la fonction 'template_from_string' n'est pas disponible par défaut et doit être chargée. Dans symfony, vous le feriez en ajoutant un nouveau service:

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

Cela devrait marcher. Remplacez "Hello {{name}}" par le texte de votre modèle et remplissez le tableau transmis à la fonction de rendu avec les variables dont vous avez besoin.

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

Clonez le service twig natif et remplacez le chargeur de système de fichiers par le chargeur de chaîne de chaîne de brindille natif:

<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>

Exemple d'utilisation depuis un contrôleur:

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

Twigengine ne prend pas en charge le rendu des chaînes. Mais il existe un paquet disponible qui ajoute ce comportement appelé TwigstringBundle .

Il ajoute le service $this->get('twigstring') que vous pouvez utiliser pour rendre vos chaînes.

8
Kristian Zondervan

La meilleure façon de le faire est d'utiliser la fonction template_from_string twig.

{{ include(template_from_string("Hello {{ name }}")) }}
{{ include(template_from_string(page.template)) }}

Voir documentation de template_from_string

Voyez pourquoi il est pas une bonne idée d'utiliser Twig_Loader_Chain ou Twig_Loader_String à cette fin sur ce numéro de github par stof .

6
Quentin
1
Juburin

Pour votre information, cette fonctionnalité a été suggérée à être ajoutée dans le noyau de Twig à partir de 1.11.0 , mais doit être activée par le développeur.

0
yvoyer

J'ai récemment dû implémenter un CMS utilisé par plusieurs parties, chaque partie pouvant personnaliser complètement ses modèles. Pour ce faire, j'ai mis en place un Twig Loader personnalisé.

La partie la plus difficile consistait à trouver une convention de dénomination pour les modèles, garantissant de ne pas chevaucher aucun modèle existant, par exemple <organisation_slug>!AppBundle:template.html.twig. Si le modèle n'était pas personnalisé, le modèle AppBundle:template.html.twig devrait être chargé en tant que modèle de secours.

Toutefois, cela n’est pas possible avec le chargeur de chaîne (AFAIK), car le nom du modèle ne peut pas être modifié. Par conséquent, j’ai dû injecter le chargeur par défaut (c’est-à-dire la chaîne du chargeur) dans mon chargeur et l’utiliser pour charger le modèle de secours.

Une autre solution consisterait à transmettre la pile de demandes ou la session au chargeur de modèles, ce qui permettrait de détecter automatiquement l'organisation, mais cela est difficile car le composant de sécurité dépend du sous-système de modèles, ce qui pose des problèmes de dépendance circulaire.

0
MauganRa
0
me987654323