Jump to content

[smarty] concaténer noms de varibales


Recommended Posts

Bonjour,

 

J'ai parcouru ces derniers jours plusieurs forums à la recherche de cette information mais sans succès.

 

Alors, j'ai une boucle {for $i=0 to 10}, dans laquelle j'aimerais afficher des variables en fonction de $i, ce sont des variables de type $var1, $var2, etc...

 

Pour mieux comprendre, voici l'équivalent en php :

<?php
for($i=1; $i<10; $i++){
echo ${"var".$i};
}
?>

Il faut donc pouvoir afficher $var1 quand $i est égal à 1, ainsi de suite.

 

Le faire avec pleins de conditions est possible mais pas propre du tout je trouve.


Merci d'avance pour votre aide ;)

Link to comment
Share on other sites

J'ai exploré cette solution mais je n'arrive pas à lier les variables de mon contrôleur, les mettre dans un array passé vers mon .tpl

 

Pour faire simple, je vais fournir la partie de mon code en question, il s'agit d'un module qui récupère des news dans la bdd prévue à cet effet et en affiche 10 (pour le moment).

 

Le code de mon contrôleur :

public function hookLeftColumn($params){
	global $smarty; //charger smarty
	$sql = 'SELECT * FROM '._DB_PREFIX_.'module_news ORDER BY `news_id` DESC LIMIT 0 , 10'; //requête mysql dans la table "ps_module_news"
	if($results = Db::getInstance()->ExecuteS($sql)){
		foreach($results as $row){
                        //Récupérer les champs de la table
			//Assigner array smarty (?)
		}
	}
	return $this->display(__FILE__, 'news.tpl'); //Afficher le .tpl
}

J'ai essayé plusieurs choses, mais jamais rien n'as fonctionné...

Link to comment
Share on other sites

Et quelque chose de ce style ci ?

public function hookLeftColumn()
{

	$sql = 'SELECT * FROM '._DB_PREFIX_.'module_news ORDER BY `news_id` DESC LIMIT 0 , 10'; //requête mysql dans la table "ps_module_news"
	$results = Db::getInstance()->ExecuteS($sql);
	$this->context->smarty->assign('tableau', $results);
	return $this->display(__FILE__, 'news.tpl'); //Afficher le .tpl
}

Avec une utilisation de {$tableau[$i]} au sein du for Smarty, par exemple.

Link to comment
Share on other sites

Merci, c'est pas bête comme idée, le souci c'est que smarty affiche "array" lorsque je veut lui faire afficher {$tableau[$i]}, je me suis donc dit qu'il s'agissait d'un tableau à deux dimensions, j'ai donc imbriqué deux boucles pour afficher toutes les entrées du tableau, résultat : toutes vides !

 

N'y a-t-il vraiment aucun moyen de concaténer une variable à un nom de variable, comme en php ?

 

çà me serais très utile également par la suite et je comprendrais mieux mon code également, puisqu'en php j'ai toujours fait comme çà.

Link to comment
Share on other sites

Je ne pense pas que, mais je n'ai pas cherché.

 

Si cela affiche array(), c'est parce qu'il s'agit d'un tableau. Par exemple {$tableau[$i].unnomdecolonnecontenudanslatable} devrait t'afficher ce que tu veux.

 

C'est non seulement bien plus simple, propre et facile a gérer ;-)

Link to comment
Share on other sites

je suis pas sûre de comprendre, tu pars de loin avec ton premier message, tu souhaites bien récupérer les 10 dernières news de la table module_news et les afficher dans l'ordre décroissant ? si c'est bien ça, alors j'utiliserais la partie php donnée par J. :

public function hookLeftColumn()
{

	$sql = 'SELECT * FROM '._DB_PREFIX_.'module_news ORDER BY `news_id` DESC LIMIT 0 , 10'; //requête mysql dans la table "ps_module_news"
	$results = Db::getInstance()->ExecuteS($sql);
	$this->context->smarty->assign('tableau', $results);
	return $this->display(__FILE__, 'news.tpl'); //Afficher le .tpl
}

et en smarty:

{foreach from=$tableau item=news}
<p>News n°{$news.id_news}</p>
<p>{$news.content}</p>
{/foreach}

c'est un exemple pour id_news et content, si tu n'es pas sûre du contenu de la variable tableau, met {debug} dans le code tpl, pas dans la boucle foreach évidemment.

  • Like 1
Link to comment
Share on other sites

Merci à vous, j'ai pas pensé qu'un tableau associatif pouvais être dans un tableau indexé, j'essaie çà demain et je vous dis ce qui a le mieux fonctionné ;)

 

Entre temps, si quelqu'un sait comment concaténer comme en php : ${'variable'+$i} , n'hésitez pas à partager votre savoir !

Link to comment
Share on other sites

Par exemple :

public function hookLeftColumn()
{

	$sql = 'SELECT * FROM '._DB_PREFIX_.'module_news ORDER BY `news_id` DESC LIMIT 0 , 10'; //requête mysql dans la table "ps_module_news"
	if($results = Db::getInstance()->ExecuteS($sql)){
		$i=0;
		foreach($results as $row){
			$this->context->smarty->assign('news_id'.$i, $row['news_id']);
			$i++;
		}
	}
	return $this->display(__FILE__, 'news.tpl'); //Afficher le .tpl
}

comme çà j'aurais les variables news_id1, news_id2, etc...

 

Il suffirais, dans smarty, de récupérer le tout comme ceci :

{for $i=1 to 10}
	${'news_id'.$i}
{/for}

Bien sur j'ai repris la syntaxe php dans mon code smarty, c'est juste un exemple.

 

Le tout serais plus simple et plus court je trouve, et je sais qu'en php il m'arrive souvent de l'utiliser donc voilà pourquoi j'aimerais savoir si çà existe en code smarty.

Link to comment
Share on other sites

ok, je crois comprendre le problème, tu préfères utiliser for que foreach, mais dans ce cas je te conseil vraiment d'utiliser foreach c'est bien plus simple et si tu veux des clés (key) alors tu peux en smarty faire
 

{foreach from=$tableau key=cle item=news}
<p>{$news.content} = {$tableau.$cle.content}</p>
{/foreach}

un peu de lecture (avant d'aller te coucher) : http://www.smarty.net/docsv2/fr/language.function.foreach.tpl
 
si tu veux rajouter un "compteur" soit tu utilises un {assign var="compteur" ...
soit tu rajoutes name dans foreach
 

{foreach from=$tableau key=cle item=news name=lesnews}

 
et ensuite tu utilises

news n°{$smarty.foreach.lesnews.iteration}
Edited by coeos.pro (see edit history)
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...