10 votes

Smarty : évaluer un modèle stocké dans une variable PHP

J'ai une variable php qui contient du code html/smarty.

$x='<a href="{$link}" >{$title}</a>';

Ces données sont extraites de la base de données, je veux les évaluer en utilisant smarty et mettre la sortie dans une variable php (pour l'imprimer ou pour la sauvegarder à nouveau dans la base de données).

Merci

Edit :

Je veux que le contenu de X soit évalué en utilisant smarty, comme si le contenu de x est stocké dans un fichier.tpl alors $y=$smarty->fetch('file.tpl') ; ... je veux le faire sans avoir besoin de sauvegarder le contenu de x dans un fichier.

13voto

meze Points 8829

Si vous utilisez Smarty 3, vous pouvez facilement le faire en

$smarty->fetch('string:'.$template_string);

o 'eval:'.$template_string . Plus d'informations à ce sujet dans le manuel

5voto

Peter Points 51

Si vous n'utilisez pas Smarty 3 et que vous ne disposez pas de la ressource string/eval, vous pouvez utiliser la fonction Plugin Smarty eval . J'ai trouvé cela beaucoup plus simple que de créer une ressource personnalisée et beaucoup moins problématique.

$template = "put some {$variables} in here"
require_once( $smarty->_get_plugin_filepath( 'function', 'eval' ));
$compiled = smarty_function_eval(array('var'=>$template), $smarty);

5voto

AntonChanning Points 281

Aucun des exemples ci-dessus n'a fonctionné pour moi, peut-être parce que nous utilisons une ancienne version de smarty pour le moment. Une solution qui a fonctionné pour nous a été de créer un modèle, que nous avons appelé eval.tpl qui ne contenait que la ligne suivante :

{eval var=$string}

Ensuite, lorsque nous voulons évaluer la chaîne de caractères, nous pouvons simplement utiliser ce qui suit :

$smarty->assign('string', $string);
$result = $smarty->fetch('eval.tpl');

2voto

initall Points 1924

Voir "Exemple 15.9. Utilisation de ressources personnalisées" ici : http://www.smarty.net/docsv2/en/template.resources

2voto

DampeS8N Points 2839

Si je vous suis, vous voulez dire que la chaîne entière était dans la base de données, c'est-à-dire avec {$link} comme partie de la chaîne. Je ne sais pas exactement comment fonctionne smarty, mais il me semble que s'il peut même faire cela, cette chaîne devra avoir eval() exécuté sur elle. (A moins que smarty ne fasse quelque chose de funky qui m'échappe, encore une fois, je ne travaille pas avec smarty).

Ce que ça veut dire, c'est que vous avez une installation très peu sécurisée. Si votre base de données subit une injection SQL, l'ensemble de votre serveur pourrait être compromis.

Le fait de les exécuter à partir d'un fichier codé en dur dans l'application ne pose pas de problème de sécurité majeur, puisque vous contrôlez le code qui a appelé le fichier .tpl et que vous contrôlez le fichier .tpl lui-même. C'est une utilisation "sûre" d'eval, car il faudrait déjà avoir un accès sérieux au serveur pour pouvoir l'exploiter, le genre d'accès qui serait la raison de l'exploiter.

Mais une fois que vous accédez à ces données à partir d'une base de données, vraisemblablement avec un système d'administration qui vous permet d'ajouter de nouveaux modèles dynamiques, vous avez créé une fenêtre dans votre système dans laquelle un attaquant peut se faufiler.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X