如何解决php中的智能功能?

时间:2013-09-07 13:21:05

标签: php function smarty

我希望有人可以指出我正确的方向。

让我们说我将Smarty模板存储在数据库中。它看起来像这样:

{currentusername UserID="5"}

currentusername是获取用户名的自定义函数。在模板中使用时,所有显示都正确。但是,如果我想在我的PHP代码中获得已解析的currentusername函数呢?

基本上我会从数据库中获取模板,通过smarty解析它,然后在代码中进一步使用当前用户名。

这可能吗?

编辑以便更好地理解。我有一段代码:

require('smarty/libs/Smarty.class.php');
$smarty = new Smarty;

$macro = '{currentusername UserID="5"}';

$resolvedmacro = ""; // this should contain the "Jerry";

function smarty_function_currentusername($params, &$smarty){
  $UserID = $params["UserID"];
  if ($UserID == 5){
    return "Jerry";
    }
  else{
    return "I dont know this guy";
    }
  }

我可以通过smarty以某种方式解析$ macro,因此变量$ resolvedmacro将包含正确的值吗?

1 个答案:

答案 0 :(得分:2)

Smarty可以使用string:eval:"资源类型"呈现字符串,就好像它是一个模板一样。 - 有关详细信息,请参阅the documentation on String Template Resources

然后,您可以使用$smarty->fetch()来获取该"模板"的输出进入一个普通的PHP变量:

require('smarty/libs/Smarty.class.php');
$smarty = new Smarty;

$macro = '{currentusername UserID="5"}';

$resolvedmacro = $smarty->fetch('string:' . $macro);

有一个更广泛的问题为什么你想要这样做,以及Smarty是否是适合这项工作的工具 - 例如,如果可能有有限数量的回调,它可能是过度复杂的事情要使用Smarty来解决它们,而不是只存储回调的名称及其参数,并通过switch语句运行它。

注意:在Smarty 3中添加了string:eval:资源类型;如果由于某种原因你需要使用Smarty 2,你需要编写或找到resource plugin来做同样的工作。您还可以为任一版本编写资源插件,该插件从数据库中获取特定宏并在一个步骤中呈现它; the docs for Smarty 3 are here