2009-12-08 7 views
2

Variable affectée dans mon modèle est {testVariable_123 $}, où 123 est généré automatiquement et est également attribué à modèle comme {Autovalue $}Smarty: comment évaluer la chaîne comme une variable

Donc, dans mon modèle, je veux obtenir la valeur de la variable ci-dessus.

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

Donc, si j'imprime {$ uneautrevaleur} au lieu de la valeur que je récupère la chaîne 'testVariable_123'

Toute aide appréciée ...

Répondre

1

Vous devez créer une variable dont la valeur est {$testVariable_123}
Ensuite, vous pouvez appeler le {eval} à ce sujet.

Le problème est, je ne pouvais pas trouver un moyen de le faire dans le bon sens.
Tout ce qui semble raisonnablement bon ne fonctionne pas et les options qui fonctionnent sont laides.

Peut-être que vous envisageriez des changements dans la conception de votre application?

Voici ce que j'ai réussi à travailler:

# 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} 

La plupart du temps, le problème est que Smarty va ignorer un support de fermeture} ou une variable $, même si elle est au milieu d'une chaîne. S'échapper avec \ ne fonctionne pas non plus.

Si vous essayez:

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

il ignorera le « } à la fin et de considérer la déclaration Smarty comme:

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

et il évaluera les testVariable $ même quand il était censé
Donc, nous allons finir avec {\123 comme la valeur :(

Tout ce que j'ai essayé a fini par trébucher sur cette question. Si vous trouvez une meilleure façon, s'il vous plaît, assurez-vous que vous partagez ici :)

+0

Merci beaucoup. Je sais que c'est compliqué .. :( J'ai changé de logique dans mon application –

+0

Cool, je suis heureux de vous aider, au moins, c'était amusant de trouver une solution (moche) :) –

+1

Juste comment vous faire prendre conscience de ma [réponse] (http: // stackoverflow.com/a/29312144/2459228), comme vous semblez être intéressé par une solution ne pas trébucher sur le problème que vous avez décrit :) –

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

a marché pour moi.

1

Je pense que la solution que vous cherchez est le suivant:

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

Vous pouvez également obtenir la valeur sans avoir à assigner une nouvelle variable:

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

L'astuce consiste à utiliser des guillemets simples , afin que Smarty n'essaie pas automatiquement d'évaluer des choses qui ressemblent à des variables immédiatement.

+0

Toujours semble moche dans l'ensemble, mais semble définitivement mieux que ceux que j'ai suggéré :-) –

Questions connexes