Jump to content
laurentg

fiche produit en fonction de la categorie

Recommended Posts

bonjour à tous ,

 

je souhaiterais pouvoir afficher une fiche produit différente en fonction de la categorie .

 

je cherche cette petite ligne de code qui permetrais de renvoyer vers tel ou tel fichier product.tpl en fonction de la categorie , n'étant pas moi même un grand développeur .....:-)

 

merci pour le coup de main .....ps 1.4.8.2

 

 

laurent

Share this post


Link to post
Share on other sites

Je up ce topic, je cherche aussi cette petite ligne miracle !

Share this post


Link to post
Share on other sites

Bonjour,

 

Direction la partie "controllers" de Prestashop, puis ProductController.php.

 

Ligne 380 (dans la version 1.4.7), vous trouvez la fonction "displayContent()".

C'est là qu'on définit quel fichier TPL est appelé.

Il suffit ainsi de changer le fichier chargé pour qu'il soit dynamique :

 

    public function displayContent()
   {
       parent::displayContent();
       self::$smarty->display(_PS_THEME_DIR_.'product_'. $this->product->id_category_default .'.tpl');
   }

 

Le fichier appelé sera ainsi "product_14.tpl" par exemple (si l'ID de la catégorie est le 14). Il faut ainsi créer un product_[iD_CATEGORY].tpl pour chaque catégorie, ou faire un code un peu plus propre, mais l'idée est là.

 

Pensez à la partie "override" pour réécrire cette fonction et ne pas être embêté par des mises à jour ou autre.

Share this post


Link to post
Share on other sites

C'est amusant, c'est toujours quand je post sur le forum que je trouve la solution dans l'heure....

 

Donc, pour pouvoir changer ton template en fonction de la catégorie, il te suffit d'aller dans controllers/front/ProductController.php

 

Une fois ici, tu vas dans la fonction initContent et tu cherche vers la fin de la fonction ces deux lignes :

 

 $this->context->smarty->assign('errors', $this->errors);
 $this->setTemplate(_PS_THEME_DIR_.'product.tpl');

 

Et tu rajoute (avec ici en exemple les numeros de catégories '3' et '4') :

 

 $this->context->smarty->assign('errors', $this->errors);
 if ($this->product->getDefaultCategory() == 3)
{
 $this->setTemplate(_PS_THEME_DIR_.'un_template.tpl');
}
else if {$this->product->getDefaultCategory == 4)
{
$this->setTemplate(_PS_THEME_DIR_.'un_autre_template.tpl');
}
else 
{
$this->setTemplate(_PS_THEME_DIR_.'product.tpl');
}

 

Et voila, vos templates seront choisis en fonction de la catégorie de votre produit !

 

EDIT :

Je précise que je suis sous prestashop 1.5, je n'ai donc pas de displayContent().

Edited by nat@dev (see edit history)

Share this post


Link to post
Share on other sites

Vincent Decaux, j'ai un problème avec ma surcharge, bien que mon fichier ProductController.php soit donc override/controllers/front/ je n'arrive pas à obtenir le résultat désiré... Alors que si j'effectue mes modifications sur le ProductController.php de controllers/front/ , mes modifications s'applique.... Je l'ai pourtant fait hérité de ProductControllerCore, j'ai même essayer avec ProductControllerCore, je n'arrive à aucun résultat.... Je n'ai pas envie de faire mes modfications dans le fichier de base, de peur de ne plus pouvoir les retrouvés en cas de souci...

 

Une idée de où peut venir le soucis ?

Share this post


Link to post
Share on other sites

Hello vincent

 

et merci déjà pour cette réponse ....

 

petite question , cela voudrais donc dire que le code ressemblerai à ça

 

public function displayContent()

{

parent::displayContent();

self::$smarty->display(_PS_THEME_DIR_.'product_2'. $this->product->id_category_default .'.tpl');

}

 

merci encore de ta réponse

Share this post


Link to post
Share on other sites

Dis moi natdev , peux tu m'aider sur la ligne que nous à donné vioncent car je nage un peu

 

merci

Share this post


Link to post
Share on other sites

Voici le contenu du fichier à mettre dans "override/controllers/productController.php" :

 

<!--?php
/* Permet de proposer des templates en fonctions des catégories
* En cas de souci :
* contact@weacms.com
*/
class ProductController extends ProductControllerCore
{
   public function displayContent()
   {
       FrontController::displayContent();

       /* Teste si le fichier existe ou non, sinon c'est le fichier par défaut qui est affiché */
       if (is_file(_PS_THEME_DIR_.'product_'. $this--->product->id_category_default .'.tpl')) {
           self::$smarty->display(_PS_THEME_DIR_.'product_'. $this->product->id_category_default .'.tpl');
       } else {
           self::$smarty->display(_PS_THEME_DIR_.'product.tpl');        
       }
   }
}

 

Cette méthode permet donc de créer des fichiers templates nommés "product_4.tpl" par exemple si votre catégorie a comme ID le N° 4.

 

@nat@dev :

Ton souci venait du fait que tu faisais un parent:displayContent(); sur une classe étendue, donc elle prenait la fonction displayContent() de la classe ProductControllerCore, et non de FrontController.

Edited by Vincent Decaux (see edit history)

Share this post


Link to post
Share on other sites

Je suis en 1.5, je n'ai pas de display content sur mon ProductController, je surcharge juste la fonction initContent, et je n'ai aucun résultat...

Share this post


Link to post
Share on other sites

Voici le code à mettre dans l'override :


class ProductController extends ProductControllerCore
{
   public function initContent()
   {
       parent::initContent();

       /* Teste si le fichier existe ou non, sinon c'est le fichier par défaut qui est affiché */
       if (is_file(_PS_THEME_DIR_.'product_'. $this->product->id_category_default .'.tpl')) {
           $this->setTemplate(_PS_THEME_DIR_.'product_'. $this->product->id_category_default .'.tpl');
       } else {
           $this->setTemplate(_PS_THEME_DIR_.'product.tpl');        
       }
   }
}

 

Et surtout, il faut supprimer le fichier "cache/class_index.php" pour supprimer le cache des override...

  • Like 1

Share this post


Link to post
Share on other sites

Un grand merci à vous Vincent, le code est encore mieux que celui que j'avais fait, et maintenant il fonctionne parfaitement !

 

Je vous remercie encore pour cette aide que vous m'avez fournis .

Share this post


Link to post
Share on other sites

Bonjour,

 

j'essaie de réaliser la même chose que je vous mais j'avoue que je coince !

 

 

je suis en 1.5.6

j'ai tenter de copier le dernier code que vincent à posté :

 

 

class ProductController extends ProductControllerCore
{
public function initContent()
{
parent::initContent();

/* Teste si le fichier existe ou non, sinon c'est le fichier par défaut qui est affiché */
if (is_file(_PS_THEME_DIR_.'product_'. $this->product->id_category_default .'.tpl')) {
$this->setTemplate(_PS_THEME_DIR_.'product_'. $this->product->id_category_default .'.tpl');
} else {
$this->setTemplate(_PS_THEME_DIR_.'product.tpl');
}
}
}

 

 

Dans override/controllers/front/ProductController.php

j'ai bien pense a supprimer le fichier "cache/class_index.php"

le resultat est que l'override n'est pas pri en compte ni mieux ni moins bien :(

 

Première question : Dans ce fichier je dois avoir que ce bout de code ou garder le fichier originale et juste remplacer la fonction int content.

Deuxieme question : dois-je bien mettre le nouveau .tpl ( exemple product_1.tpl ) à la recine de mon template ? en gros dans le même repertoire que celui que le product.tpl de defaut .

 

Merci pour votre aide

Longue vie au forums

  • Like 1

Share this post


Link to post
Share on other sites

salut à tous,

et sans faire d override c'est possible de faire une fonction comme sa dans un module?

désolée newbee prestashop ma question peu paraître idiote pour les plus aguerrie 

Share this post


Link to post
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...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More