Jump to content

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

Link to comment
Share on other sites

  • 2 weeks later...

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.

Link to comment
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)
Link to comment
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 ?

Link to comment
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

Link to comment
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 :
* [email protected]
*/
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)
Link to comment
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
Link to comment
Share on other sites

  • 4 months later...

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
Link to comment
Share on other sites

  • 1 month later...

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