Pergunta

Quero acessar algumas variáveis ​​que atribuí dinamicamente do PHP no Smarty, aqui está um exemplo:

$content_name = 'body'
$smarty->assign('content_name',$content_name);
$smarty->assign($content_name.'_title',$title);
$smarty->assign($content_name.'_body',$body);

// assigned values
// $content_name = home
// $home_title = $title
// $home_body = $body

A razão pela qual desejo acessá-los dinamicamente é porque chamo várias versões de uma função que inclui o código acima, todas elas usam o mesmo modelo e, portanto, não querem simplesmente usar $title, $body etc., pois seus valores entrarão em conflito com uns aos outros.

Dado que sei que quero acessar as variáveis ​​​​de título e corpo com base no content_name que defini, como posso conseguir isso no smarty?

Foi útil?

Solução

De acordo com meu comentário sobre o uso de um array em vez de variáveis ​​dinâmicas, aqui está um exemplo de como adicionar vars a um array:

php:

$vars = array();

function whatever() {
    global $vars;


    $vars[] = array(
        'firstname' => 'Mike',
        'surname' => 'Smith'
    );
}

$smarty->assign('vars', $vars);

espertinho:

{section name=loop loop=$vars}
    Name: {$vars[loop].firstname} {$vars[loop].surname}
{/section}

Outras dicas

Mesmo que esta postagem seja muito antiga, a resposta dada é aceita, mas não é uma resposta para a pergunta.É apenas uma outra oportunidade para lidar com o problema principal.

A questão é como usar variáveis ​​dinâmicas...

para a amostra dada, deveria ser algo como

PHP

$content_name = 'body';
$title        = 'hello ';
$body         = 'world';
$smarty->assign('content_name',$content_name);
$smarty->assign($content_name.'_title',$title);
$smarty->assign($content_name.'_body',$body);

Esperto

{$content_name}          //body
{${$content_name}_title} //hello
{${$content_name}_body}  //world

{${$content_name}_title}{${$content_name}_body} my {$content_name} is awesome
//hello world my body is awesome

Esta é a maneira dinâmica de usá-lo.Mesmo que não seja a melhor maneira neste caso :)

Se você tiver algum tipo de objeto ou matriz multidimensional ...e você gosta de iterá-los, você tem que se preocupar com a string inteira e não apenas com o número...

Por exemplo:

PHP

$arr = [
    "attr1" => "hello ",
    "attr2" => "world ",
    "attr3" => "my body is awesome"
];
$smarty->assign('foobar', $arr);

Esperto

{for $i=1 to 3}
    {$foobar.{"attr$i"}}   //works (whole name must be string var mix)
    //{$foobar.attr{"$i"}} //fails
    //{$foobar.attr{$i}}   //fails
{/for}

Mas usando {$foobar{$i}} em uma matriz simples funcionaria.

Para todos que precisam, aproveitem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top