我的模板中分配的变量是{$ testVariable_123},其中123是自动生成的,并且还被分配给模板{$ autoValue}
所以在我的模板中,我希望获得上述变量的值。
{assign var="anotherValue" value="testVariable_"|cat:$autoValue}
因此,如果我打印{$ anotherValue}而不是值,我会收到字符串'testVariable_123'
任何帮助表示赞赏...
答案 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}
为我工作。