Jump to content

[Problème] Récupérer variables smarty dans le template


Recommended Posts

Bonsoir,
 
Je n'arrive pas à comprendre pourquoi les variables de mon module apparaissent dans la popup de debug avec une value définie et lorsqu'elles sont appelées retourne NULL.

 

Auriez-vous une idée ?

 

Fichier index.tpl dans mon theme (/root/themes/montheme/templates/index.tpl) :

{hook h='larraldeEditor'}
{debug}
{$collectionhtml1|@var_dump}
// Return NULL

Popup de debug affichant la variable $collectionhtml1 comme définie :

mini_639250Capturedecran20170606a231035.
 

Fichier main de mon module (/root/modules/monmodule/monmodule.php) :


	public function install()
	{
		return parent::install() && $this->registerHook('larraldeEditor');
	}

	public function uninstall()
	{
		if (!parent::uninstall() || !Configuration::deleteByName('larraldeeditor')) return false;
		return true;
	}

	public function hookLarraldeEditor($params)
	{
		$this->context->smarty->assign(
			array(
				'homehtml'         => Configuration::get('home-html'),
				'editohtml'        => Configuration::get('edito-html'),
				'collectiontitle1' => Configuration::get('collection-title-1'),
				'collectionhtml1'  => Configuration::get('collection-html-1'),
				'collectiontitle2' => Configuration::get('collection-title-2'),
				'collectionhtml2'  => Configuration::get('collection-html-2')
			)
		);
	}

Passez une excellente soirée,
Lib.

Edited by Liberateur (see edit history)
Link to comment
Share on other sites

Salut Liberateur.

 

Pourquoi ta fonction hookLarraldeEditor() ne retourne pas de template ?

 

Normalement après avoir assigné tes variables smarty tu devrais avoir une ligne du style 

return $this->display(__FILE__, 'views/templates/hook/index.tpl');
Link to comment
Share on other sites

Bonsoir à vous,

 

Un grand merci de prendre du temps sur mon problème.

 

Salut Liberateur,

y a quoi comme valeur dans la table ps_configuration dont la colonne name est collection-html-1 ?

 

 

Voici ce qu'il y a dans la table ps_configuration concernant mes champs personnalisés :

 

"xxx";"";"";"home-html";"test";"2017-06-03 21:36:13";"2017-06-03 21:36:13";
"xxx";"";"";"edito-html";"test2";"2017-06-03 21:58:17";"2017-06-03 21:58:17";
"xxx";"";"";"collection-title-1";"te";"2017-06-03 21:58:28";"2017-06-03 21:58:28";
"xxx";"";"";"collection-html-1";"test5";"2017-06-03 21:58:29";"2017-06-03 21:58:29";
"xxx";"";"";"collection-title-2";"test4";"2017-06-03 21:58:29";"2017-06-03 21:58:29";
"xxx";"";"";"collection-html-2";"st";"2017-06-03 21:58:29";"2017-06-03 21:58:29";

 

 

 

Salut Liberateur.

 

Pourquoi ta fonction hookLarraldeEditor() ne retourne pas de template ?

 

Normalement après avoir assigné tes variables smarty tu devrais avoir une ligne du style 

return $this->display(__FILE__, 'views/templates/hook/index.tpl');

 

Je ne souhaite pas que ce hook renvoie un template, uniquement des variables que je réutiliserai au bon vouloir. Il est possible de renvoyer effectivement un template, mais il me semble que ce ne soit pas obligatoire non ?

Link to comment
Share on other sites

Ta logique est étrange.

 

Tu as créé un template index.tpl et c'est dans ce template (et uniquement dans ce template) que tu exécutes ton hook custom, si je me réfère aux éléments que tu as fourni.

 

Je veux l'appeler dans plusieurs .tpl de mon theme, si sa marche dans index.tpl sa fonctionnera dans les autres.

 

 

Regarde la fonction get de la classe configuration

je ne comprend pas pourquoi tu ne met pas tes données dans une table spécifique ce sera plus propre

 

J'aide une entreprise à créer son site sous prestashop, je n'en connais pas bien les ficelles, si tu as une solution plus adaptée je suis preneur :).

 

Je dois créer un éditeur de contenu pour que n'importe qui puisse éditer 4 pages spécifiques dont la page d'accueil (l'utilisateur n'accède pas au HTML édité, c'est du spécifique et cette partie fonctionne, je ne souhaite pas la changer). J'ai créé un thème et ensuite un module afin d'avoir une page dans le backoffice pour éditer ces pages.

 

J'ai regardé les autres modules et grace à eux, ce forum, stackoverflow et google je suis arrivé là :

- J'ai mon thème fonctionnel

- J'ai mon module d'édition fonctionnel (sauf front)

- J'ai la configuration du module qui est bien enregistrée

- Il ne manque qu'à pouvoir récupérer mes variables

 

Ce que je trouve incroyable c'est que prestashop me nargue en affichant la liste des variables définies et qu'il les rend Null lors de leurs appel, wtf...

 

 

Pour le coup je ne vois pas l'intérêt d'ajouter une table pour que ce soit plus propre, pourrais-tu me donner plus d'explication sur cette idée et comment cela me permettrais de les récupérer plus simplement. Pour moi lorsque l'on utilise un cms / librairie / framework il faut utiliser le plus possible ses fonctions et éviter tout dev spécifique, sinon l'intérêt en est moindre, autant faire du from scratch.

 

La méthode get de la class Configuration retourne bien les bonnes valeurs, je n'aurais pas du afficher ce code désolé. L'exemple ci-dessous retourne la même chose : la liste des variables avec les bonnes valeurs dans le debug et NULL lors de l'appel (après l'affichage du debug).

		$this->context->smarty->assign(
			array(
				'homehtml'         => 'test1',
				'editohtml'        => 'test2',
				'collectiontitle1' => 'test3',
				'collectionhtml1'  => 'test4',
				'collectiontitle2' => 'test5',
				'collectionhtml2'  => 'test6'
			)
		);
Link to comment
Share on other sites

On peut mettre de côté cette histoire de table dédiée. Tu utilises correctement Congiguration::get(), le souci ne vient pas de là.

Avoir une table dédiée a quand même des avantages, par exemple pour maîtriser le type de colonne (INT, VARCHAR, BOOL...) et autres subtilités SQL. Mais bon c'est pas le propos ici.

 

Moi ce qui me chagrine c'est plutôt que tu demandes à un tpl de module d’appeler un hook.

Or le rôle d'un hook est justement d'être un "container" qui appelle les templates de modules.

Tu inverses la logique container/contenu en somme.

 

Et tu dis que tu veux utiliser tes variables sur l'ensemble du site. Là je ne vois pas à quoi va servir ton hook custom alors qu'il y a déjà un gros paquet de hooks disponibles nativement que tu pourrais exploiter.

 

Je ne sais pas si ça peut t'aider mais ce topic traite de la portée des variables smarty.

Link to comment
Share on other sites

On peut mettre de côté cette histoire de table dédiée. Tu utilises correctement Congiguration::get(), le souci ne vient pas de là.

Avoir une table dédiée a quand même des avantages, par exemple pour maîtriser le type de colonne (INT, VARCHAR, BOOL...) et autres subtilités SQL. Mais bon c'est pas le propos ici.

 

Moi ce qui me chagrine c'est plutôt que tu demandes à un tpl de module d’appeler un hook.

Or le rôle d'un hook est justement d'être un "container" qui appelle les templates de modules.

Tu inverses la logique container/contenu en somme.

 

Et tu dis que tu veux utiliser tes variables sur l'ensemble du site. Là je ne vois pas à quoi va servir ton hook custom alors qu'il y a déjà un gros paquet de hooks disponibles nativement que tu pourrais exploiter.

 

Je ne sais pas si ça peut t'aider mais ce topic traite de la portée des variables smarty.

 

Que me recommande-tu dans mon cas ? Peu importe la méthode utilisée, je veux simplement pouvoir récupérer ce que je sauvegarde en base et l'afficher où bon me semble...

 

Un controller envoyant des variables à sa vue pour la construire, c'est un peux la base des mvc. Dans tous les fichiers tpl de prestashop, il appel des variables pour construire sa vue... ça me paraît logique d'ajouter des variables pour les afficher comme lui le fait...

 

Mais je peux me tromper et c'est pour comprendre que je suis ici :), encore merci pour toute l'aide que vous m'apportez.

Link to comment
Share on other sites

Dans tous les fichiers tpl de prestashop, il appel des variables pour construire sa vue... ça me paraît logique d'ajouter des variables pour les afficher comme lui le fait...

 

Ce n'est pas vraiment le problème. Tu ne trouveras jamais jamais un template de module qui contient un hook.

 

En gros c'est comme si tu voulais accrocher un manteau à un mur.

Normalement on fixe le porte-manteau sur le mur puis on y accroche le manteau.

Toi tu fixes le porte-manteau sur le manteau et tu t'étonnes que quand tu veux accrocher le tout au mur ça se casse la gueule  ^_^

 

Un hook c'est un point d'accroche, il est "solidaire" du MVC. Il a une raison d'être en dehors du module, justement parce qu'il fonctionnera de la même manière avec 0, 1 ou plusieurs modules greffés sur lui.

 

Explique nous mieux ton projet pour qu'on puisse te conseiller.

Qu'est ce que tu veux afficher plus précisément comme infos et à quel(s) endroit(s) ? 

Link to comment
Share on other sites

Ce n'est pas vraiment le problème. Tu ne trouveras jamais jamais un template de module qui contient un hook.

 

En gros c'est comme si tu voulais accrocher un manteau à un mur.

Normalement on fixe le porte-manteau sur le mur puis on y accroche le manteau.

Toi tu fixes le porte-manteau sur le manteau et tu t'étonnes que quand tu veux accrocher le tout au mur ça se casse la gueule  ^_^

 

Un hook c'est un point d'accroche, il est "solidaire" du MVC. Il a une raison d'être en dehors du module, justement parce qu'il fonctionnera de la même manière avec 0, 1 ou plusieurs modules greffés sur lui.

 

Explique nous mieux ton projet pour qu'on puisse te conseiller.

Qu'est ce que tu veux afficher plus précisément comme infos et à quel(s) endroit(s) ? 

 

 

Je dois créer un éditeur de contenu pour que n'importe qui puisse éditer 4 pages spécifiques dont la page d'accueil (l'utilisateur n'accède pas au HTML édité, c'est du spécifique et cette partie fonctionne, je ne souhaite pas la changer). J'ai créé un thème et ensuite un module afin d'avoir une page dans le backoffice pour éditer ces pages.

 

J'ai regardé les autres modules et grace à eux, ce forum, stackoverflow et google je suis arrivé là :

- J'ai mon thème fonctionnel

- J'ai mon module d'édition fonctionnel (sauf front)

- J'ai la configuration du module qui est bien enregistrée

- Il ne manque qu'à pouvoir récupérer mes variables

 

 

Le module créé permet aux utilisateurs d'éditer des blocs placés dans différentes pages. Les variables contiennent du code html pour ces blocs et deux d'entre elles permettent de changer le menu du site présent sur toutes les pages (deux titres positionnés en sous-menu).

 

Je ne pose pas souvent cette question, mais quel est le meilleurs moyen de créer, fixer le porte manteau et de l'accrocher ^^ ?

 

Dans le module Paypal qui est l'un de ce pris en exemple, il me semblait avoir vu des hooks affichés dans le thème, mais je me trompe peut-être.

Link to comment
Share on other sites

Ca manque toujours de précisions mais on avance progressivement  ^_^

 

Pour la page d'accueil tu as juste à utiliser le hook "displayHome".

Donc ton module :

- doit s'enregistrer sur ce hook ($this->registerHook('displayHome') dans la fonction install())

- avoir une fonction hookDisplayHome() (qui fait la même chose que celle que tu as déjà codée ET qui retourne un template)

 

A partir de là tu bricoles ce que tu veux dans ton template, ça te regarde et j'ai bien compris que tu avais le niveau pour mener à bien cette opération  :)

 

Ensuite si je dis que ça manque de précisions c'est parce que tu ne dis pas si les autres pages sont des pages CMS, les pages catégories, les fiches-articles, la page contact ou que sais-je encore.

 

En admettant que ce soit sur des pages CMS que tu veuilles afficher tes blocs, alors c'est dans le fichier cms.tpl (dans le répertoire de ton thème) que tu dois ajouter ton appel de hook ({hook h='displayCustomHook'}).

Et après même chose que pour le hook displayHome, enregistrement du hook lors de l'install + fonction qui renvoie du contenu.

 

Pour l'histoire du menu j'ai pas tout compris, mais j'ai le sentiment qu'il vaudrait mieux que tu adaptes le module de menu existant pour y ajouter les fonctionnalités que tu veux plutôt que de bricoler un module pour qu'il interagisse avec un autre (c'est pas du tout "bonnes pratiques" :P ).

 

Et pour finir : ne prend jamais le module PayPal comme référence. Il est plein de bizarreries et surtout les développeurs ont une fâcheuse tendance à créer 3 bugs quand ils en corrigent 1.

Link to comment
Share on other sites

  • 2 years later...

Hello je me permets de me greffer à la conversation car j'ai un peu le même soucis que @Liberateur

J'ai un module qui génère un tableau et qui utilise ces données pour afficher un bloc par ailleurs, bref...
Le module défini donc une variable de type tableau.

Je voudrais récupérer juste cette variable tableau dans product-list.tpl
Dans ce fichier quand je mets {debug} je vois bien le contenu de mon tableau ( ->scope = "Smarty root").

Par contre dans mon tpl quand je teste cette variable elle est vide...
Comment dois-je l'appeler ?

Merci pour toute idée.

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