Jump to content

Executer Des Requêtes Sql Personnalisées Dans Un Fichier .tpl


Recommended Posts

Bonjour à tous

 

Je cherche a améliorer la page des fournisseurs (supplier.tpl) en y affichant une simple requete SQL personnalisée.

 

J'ai déjà épluché tous les forums et articles, et je ne trouve pas comment faire.

 

J'ai essayé d'ajouter ma requête dans le fichier /classes/supplier.php

$query='SELECT `data`
FROM `'._DB_PREFIX_.'customtable`;
$sql = Db::getInstance()->ExecuteS($query);

Mais je n'arrive pas a récuperer les données dans le fichier supplier.tpl situé dans le dossier de mon thème.

 

Quelqu'un pourrait m'aider?

 

Merci d'avance

Link to comment
Share on other sites

Bonjour,

 

Merci pour votre réponse,

 

mais je ne lance pas ma query dans le .tpl. Je l'ai mise dans /classes/supplier.php, et essaye d'afficher le résultat sur la page supplier.tpl

 

Voici exactement ce que j'ai fais 

 

/classes/Supplier.php

	public function customQuery(){ 
		$query='SELECT `data`
		FROM `'._DB_PREFIX_.'customtable`';

		$sql = Db::getInstance()->ExecuteS($query);
		$this->setTemplate(_PS_THEME_DIR_.'supplier.tpl');
	}

supplier.tpl dans mon dossier theme

{foreach from=sql item=row}
{$row.data}
{/foreach}

Mais rien ne s'affiche. Soit la requète n'est pas exectuée, soit les infos ne sont pas transmises au fichier template.

 

Quelqu'un peut m'aider ?

Merci beaucoup

Link to comment
Share on other sites

et tu as bien un assign qui transmet le résultat de la requete à smarty ?

 

J'ai rajouté 

$this->assign("sql", $query);

Mais ca ne change rien.

 

A vrai dire, meme si j'essaye de faire un echo $query, il n'affiche même rien du tout sur la page. J'ai l'impression que mon code dans Supplier.php n'est pas interpreté

Link to comment
Share on other sites

Bonjour,

 

Il y a quoi comme donné dans votre customtable ? 

 

A vrai dire c'est une requete bidon, juste pour l'exemple.

 

Ma vraie requête fonctionne parfaitement (testée dans phpmyadmin). 

 

Je reprends, avec les infos réelles :

 

/classes/Supplier.php

	public function getVignerons(){
		$manufacturers = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
		SELECT SUBSTRING_INDEX(trim(m.name)," ",-1) lastname, CASE WHEN LENGTH(trim(m.name)) - LENGTH(REPLACE(trim(m.name), " ", "")) = 1 THEN NULL ELSE SUBSTRING_INDEX(SUBSTRING_INDEX(trim(m.name)," ",2)," ",-1) END AS middlename, SUBSTRING_INDEX(trim(m.name)," ",1) firstname, m.name, m.*, ml.`description`, ml.`short_description`, ml.`meta_title`, ml.`meta_description` FROM `vinsNaturels_manufacturer` m INNER JOIN vinsNaturels_manufacturer_shop manufacturer_shop ON (manufacturer_shop.id_manufacturer = m.id_manufacturer AND manufacturer_shop.id_shop = 1) INNER JOIN `vinsNaturels_manufacturer_lang` ml ON (m.`id_manufacturer` = ml.`id_manufacturer` AND ml.`id_lang` = 1) WHERE m.`id_manufacturer` <> 28 AND m.`active` = 1 ORDER BY lastname ASC');

		$this->assign("query", $manufacturers);
		$this->setTemplate(_PS_THEME_DIR_.'supplier.tpl');
	}

THEME/supplier.tpl

<ul class="vignerons-list">
	{foreach from=query item=manufacturer}
		<li>
			<a href="/fr/vignerons/{$manufacturer.id_manufacturer}-{$manufacturer.link_rewrite}"><img src="/img/m/{$manufacturer.id_manufacturer}.jpg" alt="{$manufacturer.name}"></a>
			<p><a href="/fr/vignerons/{$manufacturer.id_manufacturer}-{$manufacturer.link_rewrite}">{$manufacturer.name}</a>{if $manufacturer.meta_title}<br>({$manufacturer.meta_title}){/if}<br>{$manufacturer.name}</p>
			<a class="btn" href="/fr/vignerons/{$manufacturer.id_manufacturer}-{$manufacturer.link_rewrite}">En savoir plus</a>
		</li>
	{/foreach}
</ul>

Et dans mon rendu front-end, j'ai ceci :

<ul class="vignerons-list">
	<li>
		<a href="/fr/vignerons/q-q"><img src="/img/m/q.jpg" alt="q"></a>
		<p><a href="/fr/vignerons/q-q">q</a><br>(q)<br>q</p>
		<a class="btn" href="/fr/vignerons/q-q">En savoir plus</a>
	</li>
</ul>

Donc c'est bien la preuve que le fichier .tpl ne recoit aucune infos dans l'array $sql. Toutes les valeurs retournent "q", et il ne crée qu'un seul <li>, alors que j'ai au moins 50 entrées en DB.

 

Je suis largué :(

Link to comment
Share on other sites

J'ai rajouté 

$this->assign("sql", $query);

Mais ca ne change rien.

 

A vrai dire, meme si j'essaye de faire un echo $query, il n'affiche même rien du tout sur la page. J'ai l'impression que mon code dans Supplier.php n'est pas interpreté

 

déjà, c'est pas la requête que tu dois envoyer à la vue, mais le résultat :)

 

et ta méthode customQuery(), elle est appelée où ?

Link to comment
Share on other sites

Une fois votre méthode appelé le plus simple serai de créer une boucle qui récupère vos info dans un tableau et ensuite envoyé votre tableau au tpl pour enfin afficher ce dont vous avez besoin.

 

Votre requête -> résultat -> foreach -> array -> smarty  / dans le tpl /  foreach -> $votre.résultat   :)

 

Bonne journée 

Link to comment
Share on other sites

Merci pour vos réponses.

 

J'ai essayé les 3 dernières propositions, mais rien à faire, pas moyen d'afficher les résultats de ma requête dans cette page .tpl :(

	public function getVignerons(){
		$manufacturers = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
		SELECT SUBSTRING_INDEX(trim(m.name)," ",-1) lastname, CASE WHEN LENGTH(trim(m.name)) - LENGTH(REPLACE(trim(m.name), " ", "")) = 1 THEN NULL ELSE SUBSTRING_INDEX(SUBSTRING_INDEX(trim(m.name)," ",2)," ",-1) END AS middlename, SUBSTRING_INDEX(trim(m.name)," ",1) firstname, m.name, m.*, ml.`description`, ml.`short_description`, ml.`meta_title`, ml.`meta_description` FROM `vinsNaturels_manufacturer` m INNER JOIN vinsNaturels_manufacturer_shop manufacturer_shop ON (manufacturer_shop.id_manufacturer = m.id_manufacturer AND manufacturer_shop.id_shop = 1) INNER JOIN `vinsNaturels_manufacturer_lang` ml ON (m.`id_manufacturer` = ml.`id_manufacturer` AND ml.`id_lang` = 1) WHERE m.`id_manufacturer` <> 28 AND m.`active` = 1 ORDER BY lastname ASC');

		$data = array();
		foreach( $manufacturers as $manufacturer){
			$data[] = $manufacturer['name'];
		}

		print_r($data);

		$this->assign("data", $this->getVignerons());
		$smarty->setTemplate(_PS_THEME_DIR_.'supplier.tpl');
	}

Link to comment
Share on other sites

essaye ppp($data);
au lieu de print_r($data);

et
$this->context->smarty->assign("vignerons", $manufacturers );
c'est mieux que
$this->assign("data", $this->getVignerons()); ça tourne pas en rond ?

rajoute {debug} dans le tpl pour voir les variable que tu as

pourquoi travailler dans /classes/Supplier.php ? il faut aller dans /controllers/front/SupplierController.php, et fait directement un override de assignOne ou initContent.

Link to comment
Share on other sites

essaye ppp($data);

au lieu de print_r($data);

 

et

$this->context->smarty->assign("vignerons", $manufacturers );

c'est mieux que

$this->assign("data", $this->getVignerons()); ça tourne pas en rond ?

 

rajoute {debug} dans le tpl pour voir les variable que tu as

 

pourquoi travailler dans /classes/Supplier.php ? il faut aller dans /controllers/front/SupplierController.php, et fait directement un override de assignOne ou initContent.

 

salut,

 

Ok j'ai déplacé ma fonction dans SupplierController.php

 

J'ai mis

$this->context->smarty->assign("vignerons", $manufacturers );

 

J'ai regardé dans le debug, je ne retrouve aucune de mes variables.

 

Et je ne peux pas remplacer assignOne ou initContent car j'utilise déjà ses fonctions ailleurs :)

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...