Pregunta

Quiero ser el acceso de algunas variables He asignado dinámicamente a partir de PHP en Smarty, aquí está un ejemplo:

$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

La razón por la que desee acceder a estos de forma dinámica se debe a que llamo varias versiones de una función que incluye el código anterior, todos ellos utilizan la misma plantilla y por lo tanto no quieren utilizar simplemente $ título, etc $ cuerpo como su Valus entrará en conflicto entre sí.

Dado que yo sé que quiero acceder a las variables título y el cuerpo en base al conjunto content_name I, ¿cómo puedo logrado esto dentro de Smarty?

¿Fue útil?

Solución

Como por mi comentario sobre el uso de una matriz en lugar de variables dinámicas, aquí está un ejemplo de cómo agregar el vars a una matriz:

php:

$vars = array();

function whatever() {
    global $vars;


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

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

Smarty:

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

Otros consejos

Aunque este post es muy antiguo, el answere dado accpeted pero no un answere para la pregunta. Su único otro ágape para manejar un problema principal.

La cuestión es cómo utilizar variables dinámicas ...

para la muestra dada, debería ser algo así 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);

Smarty

{$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 es la forma dinámica para usarlo. Incluso si no es la mejor manera en este caso:)

Si usted tiene clase de objetos o matriz multidimensional ... y te gusta para iterar ellos, usted tiene que preocuparse por toda la cadena y no sólo el número ...

Por ejemplo:

PHP

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

Smarty

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

Pero el uso de {$foobar{$i}} en una simple matriz funcionaría.

Para todos los que lo necesitan, disfrutar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top