Smarty: оценивать шаблон, хранящийся в переменной PHP - PullRequest
10 голосов
/ 30 ноября 2010

У меня есть переменная php, в которой есть код html / smarty

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

Эти данные извлекаются из базы данных, я хочу оценить их с помощью smarty и поместить вывод в переменную php (для печатиили снова сохранить его в базе данных).

Спасибо

Редактировать:

Я хочу, чтобы содержимое X оценивалось с использованием smarty, как если бы содержимоеx сохраняется в файле .tpl, а затем $ y = $ smarty-> fetch ('file.tpl');... хочу сделать это без необходимости сохранять содержимое x в файл

Ответы [ 5 ]

13 голосов
/ 30 ноября 2010

Если вы используете Smarty 3, вы можете легко сделать это с помощью

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

или 'eval:'.$template_string. подробнее об этом в руководстве

5 голосов
/ 23 ноября 2012

Если вы не используете Smarty 3 и у вас нет ресурса string / eval, вы можете использовать плагин Smarty eval .Я обнаружил, что это намного проще, чем создание собственного ресурса, и гораздо менее проблематично.

$template = "put some {$variables} in here"
require_once( $smarty->_get_plugin_filepath( 'function', 'eval' ));
$compiled = smarty_function_eval(array('var'=>$template), $smarty);
4 голосов
/ 15 октября 2013

Ни один из приведенных выше примеров не работал для меня, возможно, потому что мы сейчас используем более старую версию smarty.Решение, которое сработало для нас, заключалось в создании шаблона, который мы назвали eval.tpl, который содержал только следующую строку:

{eval var=$string}

Затем, когда мы хотели оценить строку, мы могли просто использоватьследующее:

$smarty->assign('string', $string);
$result = $smarty->fetch('eval.tpl');
2 голосов
/ 30 ноября 2010

Если я следую за вами, вы имеете в виду, что вся строка была в базе данных, то есть {$ link} как часть строки.Я не уверен, как именно работает smarty, но мне кажется, что, если он даже сможет это сделать, эта строка должна будет запустить eval ().(Если smarty не делает что-то напуганное, чего мне не хватает, опять же, я не работаю с smarty)

Это означает, что у вас ОЧЕНЬ небезопасная настройка.Если ваша база данных подвергнется инъекции SQL, весь ваш сервер может быть скомпрометирован.

Запуск этих файлов из файла, который был жестко запрограммирован в приложении, не является серьезной проблемой безопасности, поскольку вы можете контролировать код, вызывающий.tpl, и у вас есть контроль над самим .tpl.Это «безопасное» использование eval, так как вам уже нужен серьезный доступ к серверу, чтобы иметь возможность его использовать, такой доступ, который был бы причиной его использования.

Но как только вы получаете доступ к этим данным из базы данных, предположительно с помощью какой-то системы администрирования, которая позволяет вам добавлять новые динамические шаблоны, вы создали окно в вашу систему, в которое злоумышленник может проникнуть.

2 голосов
/ 30 ноября 2010

См. «Пример 15.9. Использование пользовательских ресурсов» здесь: http://www.smarty.net/docsv2/en/template.resources

...