Smarty:如何将字符串作为变量进行求值

时间:2009-12-08 10:59:20

标签: php smarty

我的模板中分配的变量是{$ testVariable_123},其中123是自动生成的,并且还被分配给模板{$ autoValue}

所以在我的模板中,我希望获得上述变量的值。

{assign var="anotherValue" value="testVariable_"|cat:$autoValue}

因此,如果我打印{$ anotherValue}而不是值,我会收到字符串'testVariable_123'

任何帮助表示赞赏...

3 个答案:

答案 0 :(得分:1)

您需要创建一个值为{$testVariable_123}的变量 然后你可以打电话给{eval}

问题是,我找不到办法以良好的方式做到这一点 一切看起来相当不错的东西都行不通,而且有效的选择也很难看。

也许您会考虑应用程序设计中的一些变化?

这是我设法工作的原因:

# file.php:

  $smarty->assign("autoValue", 123);
  $smarty->assign("testVariable_123", "foo");

  //Option 1
  $smarty->assign("anotherValue", "{\$testVariable_123}");
  //Option 2
  $smarty->assign("rb", '}'); // Hack to get the right bracket } withou Smarty parsing it.
  //Option 3
  $smarty->assign("mask", '{$testVariable_%s}'); // pass the full string_format "mask" directly from PHP

# file.tpl

1) Uses the $anotherValue from PHP:
Plain: {$anotherValue}
Evaled: {eval var=$anotherValue}

2) Build the string on Smarty itself:
{assign var="yetAnotherValue" value=$autoValue|string_format:"{\$testVariable_%s$rb"}
Plain: {$yetAnotherValue}
Evaled: {eval var=$yetAnotherValue}

3) Build the string using the mask from php:
{assign var="enoughOfValue" value=$autoValue|string_format:$mask}
Plain: {$enoughOfValue}
Evaled: {eval var=$enoughOfValue}

大多数情况下,问题是Smarty不会忽略结束括号}或$变量,即使它位于字符串的中间。用\逃避也不起作用。

如果您尝试:

{assign var="yetAnotherValue" value="{\$testVariable_$autoValue}"}

它会忽略最后的“}并将Smarty声明视为:

{assign var="yetAnotherValue" value="{\$testVariable_$autoValue}

它会评估$ testVariable,即使它应该被转义 因此,我们最终会以{\123作为值:(

我尝试的一切最终都在这个问题上磕磕绊绊。 如果您找到更好的方法,请确保在此处分享:)

答案 1 :(得分:1)

我认为您正在寻找的解决方案是:

{assign var="anotherValue" value='{$testVariable_'|cat:$autoValue|cat:'}'}
{eval var=$anotherValue}

您还可以在不必分配新变量的情况下获取值:

{eval var='{$testVariable_'|cat:$autoValue|cat:'}'}

诀窍是使用单引号,这样Smarty不会自动尝试立即评估看起来像变量的内容。

答案 2 :(得分:-1)

{assign var="myVar" value="{\$testVariable"|cat:$autoValue|cat:$smarty.rdelim}
{eval var=$myVar}

为我工作。

相关问题