У меня есть переменная php, в которой есть html / smarty-код
$x='<a href="{$link}" >{$title}</a>';
Эти данные извлекаются из базы данных, я хочу оценить ее с помощью smarty и поместить вывод в переменную php (чтобы распечатать ее или снова сохранить в базе данных).
благодаря
Редактировать :
Я хочу, чтобы содержимое X оценивалось с помощью smarty, как если бы содержимое x хранилось в файле.tpl, тогда $ y = $ smarty-> fetch ('file.tpl'); … хочу сделать это без необходимости сохранять содержимое x в файл
Если вы используете Smarty 3, вы можете легко это сделать
$smarty->fetch('string:'.$template_string);
или 'eval:'.$template_string
. подробнее об этом в руководстве
Если вы не используете 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);
Ни один из приведенных выше примеров не работал для меня, возможно, потому, что в настоящее время мы используем более старую версию smarty. Решением, которое работало для нас, было создание шаблона, который мы назвали eval.tpl
который содержал только следующую строку:
{eval var=$string}
Затем, когда мы хотели оценить строку, мы могли бы просто использовать следующее:
$smarty->assign('string', $string); $result = $smarty->fetch('eval.tpl');
См. «Пример 15.9. Использование пользовательских ресурсов» здесь: http://www.smarty.net/docsv2/en/template.resources
Если я следую за вами, вы имеете в виду, что вся строка была в базе данных, то есть с {$ link} как часть строки. Я не уверен, как smarty работает точно, но мне кажется, что если он даже сможет это сделать, для этой строки потребуется eval (). (Если smarty не делает что-то напуганное, что мне не хватает, опять же, я не работаю с smarty)
Это означает, что у вас есть ОЧЕНЬ небезопасная настройка. Если ваша база данных когда-либо страдает от SQL-инъекции, весь ваш сервер может быть скомпрометирован.
Запуск этих файлов, которые были жестко закодированы в приложении, не является серьезной проблемой безопасности, поскольку у вас есть контроль над кодом, который называется .tpl, и у вас есть контроль над самой .tpl. Это «безопасное» использование eval, поскольку вам придется иметь какой-то серьезный доступ к серверу, чтобы он мог его использовать, а именно тот доступ, который был бы причиной его использования.
Но как только вы получите доступ к этим данным из базы данных, предположительно с какой-то административной системой, которая позволит вам добавлять новые динамические шаблоны, вы создали окно в вашей системе, которое может проникнуть злоумышленник.
Я нашел это. http://www.smarty.net/forums/viewtopic.php?t=18010
Это говорит, что если вы используете Smarty 3, вы можете использовать переменную php в качестве шаблона следующим образом:
$smarty->fetch('string:'.$string);