Jump to content

Ajouter du php dans TPL avec smarty


Recommended Posts

Bonjour à tous,

Comment faire pour ajouter du php dans des fichiers tpl sachant que les balises {php}{/php} ne fonctionnent pas et que mon script est trop gros pour tout faire passer dans une variable (a priori en tous cas, je vois aps comment faire passer tout ça dans une variable) ?

En détail, je cherche à faire passer les infos d'une API dans la fiche produit (products.tpl), ce qui signifie qu'une fois que j'aurai inséré mon bout de code, je devrai faire d'autres opérations telles que des if /else etc... Comment faire?

Voici le code en question

 

<?php 

require("libs/smarty.class.php");

$curl = curl_init();
 
$opts = [
    CURLOPT_URL => 'url de l'api',
    CURLOPT_RETURNTRANSFER => true,
];
 
curl_setopt_array($curl, $opts);
 
$response = json_decode(curl_exec($curl), true);
?>

<!DOCTYPE html>
<html>	
<head>
	<title></title>
	<link rel="stylesheet" type="text/css" href="style.css">
	<meta charset="utf-8">
</head>
<body>


<table>
	<tr>
		<th>Durée</th>
		<th>Loyer</th>
		<th>Avec un premier versement de</th>
	</tr>

	<?php 
	$test = $response['RENT_PRODUCT_WITH_REDEMPTION']['publicPriceWithDurations'];
	for ($i=0; $i < 5; $i++) { 
	
	?>
	
		<tr>
			<td><?php echo $test[$i]['durationInMonths']?> mois</td>
			<td><?php echo number_format($test[$i]['priceInCts']/100, 2). ' '; ?>€/mois</td>
			<td><?php echo number_format($test[$i]['downPayment']['priceInCts']/100, 2). ' '; ?> €/mois</td>
		</tr>
	<?php 
	} ?>

</table>

Merci d'avance pour vos réponses.

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

Bonjour,

Ce que tu essayes de faire va à l'encontre des bonnes pratiques et du concept de MVC en général.

Tu dois créer un module, qui contiendra toute ta logique (PHP) puis transmettra les variables à la vue (le template, via le hook de ton choix)

  • Thanks 1
Link to comment
Share on other sites

Bonour à tous,

J'ai suivi vos conseils et j'ai créé un module, cependant, même si j'ai bien compris comment afficher des informations sur la page product.tpl, les informations que j'affiche sont des informations ne prenant pas compte des caractéristiques des produits.
J'aimerais donc savoir de quelle façon récupérer les informations affichées sur la page produit?

Exemple concret : j'ai une paire de chaussures noires à 45€, comment faire pour récupérer la marque, la couleur, le prix etc... dans le module ? 

Merci d'avance :)

Link to comment
Share on other sites

Bonjour,

Quelques pistes :

Si tu as un objet product depuis ton module tu peux déjà faire :

d($product);

Tu verra que tu as déjà plein d'info. 

Ensuite tu peux utiliser la méthode

$product->getAttributeCombinations($id_lang);

Pour récupérer les déclinaisons..

Hésite pas fouiller la classe Product. Tu devrais normalement avoir tous les outils nécessaire. ;)

Bon courage !

  • Thanks 1
Link to comment
Share on other sites

Merci pour cette réponse, mais en fait, je n'utilise pas la classe product dans mon module; il a pour but de récupérer des informations d'une API et de les adapter en fonction de mon produit.
Exemple, si quelqu'un est sur une paire de nike en taille 45 , j'ai besoin d'insérer les informations du produit dans l'url faisant la requête http à l'API. Ca donnera un truc du genre :

https://www.urldelapi?marque='marqueduproduit'&category='catégorieduproduit'...

A l'heure actuelle je suis bloqué parce que je ne sais pas comment faire pour récupérer les informations de la fiche produit et m'en servir dans le fichier .php de mon module. Merci d'avance pour vos réponses.

 

Link to comment
Share on other sites

Mmmh. Je vois. 

Pour moi ça dépend vraiment de ce que tu veux faire. 

1) Tu peux soit trouver le meilleur hook sur lequel tu peux connecter ton module 

-> Listes des hook : https://www.team-ever.com/prestashop-1-6-la-liste-des-hooks/

-> Rechercher dans product.tpl les hooks utilisés (CTRL+F "hook") https://github.com/PrestaShop/PrestaShop/blob/1.6.1.x/themes/default-bootstrap/product.tpl

2) Créer ton propre hook et le mettre l'endroit que tu veux dans product.tpl

3) Faire ton appel à ton API directement dans un override de ProductController (cette solution te permettra d'être plus flexible).

Voila ^^

  • Thanks 1
Link to comment
Share on other sites

Merci beaucoup pour la rapidité de vos réponses, mon module est connecté à hookdisplayRightColumnProduct, puis-je quand même appeler des paramètres de cette page dasn la page nomdumodule.php? Et si oui, comment appeler les différents éléments de la page product comme par exemple le prix, la catégorie etc?

Je précise que j'ai bien réussi à créer un module et à afficher le contenu d'un lien de l'api dans l'intégralité des fiches produits du site, je bloque simplement sur le fait de trouver les catégories prix etc pour que le contenu de ce qui est affiché soit personnalisé à chaque produit.

Concernant l'override ou la création d'un hook, je n'ai pas encore les compétences pour le faire.

Link to comment
Share on other sites

Dans ta fonction qui gère ce hook je pense que si tu regardes la variable $params : 

d($params);

Tu devrais retrouver ton objet product ou au moins l'id du produit. C'est par là qu'il faut utiliser pour retrouver les informations que tu veux. ;)

 

Link to comment
Share on other sites

J'ai tenté de faire ça, et voilà ce ça n'a rien donné :

 [associations] => Array ( [cart_rows] => Array ( [resource] => cart_row [virtual_entity] => 1 [fields] => Array ( [id_product] => Array ( [required] => 1 [xlink_resource] => products ) [id_product_attribute] => Array ( [required] => 1 [xlink_resource] => combinations ) 

 

, je vous poste le code de la page "nomdumodule.php"  au hook en question. Je n'ai pas fait de boucles parce que je n'ai pas trouvé comment afficher une boucle "compliquée" avec smarty, j'ai donc tout affiché en dur.  Comment faire pour que cette page php récupère les informations de chaque page produit?
(si on était en procédural, j'aurais fait un fetch mais c'est pas aussi simple lol):

    public function hookdisplayRightColumnProduct($params)
    {

        $curl = curl_init();
         
        $opts = [
            CURLOPT_URL => 'https://urldelapi?trademark=nike&categoryPath=ALL%SHOES&kind=PRODUCT&unitaryPriceInCts=200000&quantity=1&personType=NATURAL',
            CURLOPT_RETURNTRANSFER => true,
        ];
         
        curl_setopt_array($curl, $opts);
         
        $response = json_decode(curl_exec($curl), true);
        $test = $response['RENT_PRODUCT_WITH_REDEMPTION']['publicPriceWithDurations'];

        $moissix=$response['RENT_PRODUCT_WITH_REDEMPTION']['publicPriceWithDurations'][0]['durationInMonths'];
        $moisdouze=$test[1]['durationInMonths'];
        $moisdixhuit=$test[2]['durationInMonths'];
        $moisvingtquatre=$test[3]['durationInMonths'];
        $moistrentesix=$test[4]['durationInMonths'];

        $loyersix=number_format($test[0]['priceInCts']/100, 2);
        $loyerdouze=number_format($test[1]['priceInCts']/100, 2);
        $loyerdixhuit=number_format($test[2]['priceInCts']/100, 2);
        $loyervingtquatre=number_format($test[3]['priceInCts']/100, 2);
        $loyertrentesix=number_format($test[4]['priceInCts']/100, 2);

        $paiementsix=number_format($test[0]['downPayment']['priceInCts']/100, 2);
        $paiementdouze=number_format($test[1]['downPayment']['priceInCts']/100, 2);
        $paiementdixhuit=number_format($test[2]['downPayment']['priceInCts']/100, 2);
        $paiementvingtquatre=number_format($test[3]['downPayment']['priceInCts']/100, 2);
        $paiementtrentesix=number_format($test[4]['downPayment']['priceInCts']/100, 2);


        $this->context->smarty->assign(array(
            "moissix"=>$moissix,
            "moisdouze"=>$moisdouze,
            "moisdixhuit"=>$moisdixhuit,
            "moisvingtquatre"=>$moisvingtquatre,
            "moistrentesix"=>$moistrentesix,
            "loyersix"=>$loyersix,
            "loyerdouze"=>$loyerdouze,
            "loyerdixhuit"=>$loyerdixhuit,
            "loyervingtquatre"=>$loyervingtquatre,
            "loyertrentesix"=>$loyertrentesix,
            "paiementsix"=>$paiementsix,
            "paiementdouze"=>$paiementdouze,
            "paiementdixhuit"=>$paiementdixhuit,
            "paiementvingtquatre"=>$paiementvingtquatre,
            "paiementtrentesix"=>$paiementtrentesix,

        ));
        return $this->display(__FILE__, "views/templates/front/product.tpl");

    }

 

Link to comment
Share on other sites

  • 3 years later...

Bonjour, je suis nouveau ici et j'ai une question dans le même genre que notre amis PrestashopUser03, sauf que ma requête est beaucoup plus simple que ce dernier.

 

Je m'explique je suis sur prestashop 1.7.4 et je voudrais savoir comment faire pour diviser le prix de mes produis qui sont supérieur à 100€ par exemple et afficher le prix diviser par 4 ?

 

Jusqu'à présent j'ai réussi à diviser tout les prix des produits par 4 et à l'afficher mais je souhaite que cela s'applique que aux produits de 100€ jusqu'à 2000€ 

 

Bout de code (j'ai deux version qui fonctionne) 

 

1 :    <span>Payer en 4 fois : {math equation="x / y " x=$product.price_amount y=4}€</span>

2 :    <span> {$product.price_amount/4}€ </span>Pendant 4 Mois</span>    

 

 le problème est le même je n'y arrive pas avec les balises  <?php mais comme j'ai pu le voir plus haut cela est plutôt normale.

Ma question est esque je peux le mettre directement dans le code HTML sans crée de module pour faire cette division de prix ? 

 

 

Merci d'avance pour votre réponse 

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