laurentg Posted June 12, 2013 Share Posted June 12, 2013 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 More sharing options...
nat@dev Posted June 21, 2013 Share Posted June 21, 2013 Je up ce topic, je cherche aussi cette petite ligne miracle ! Link to comment Share on other sites More sharing options...
Vincent Decaux Posted June 21, 2013 Share Posted June 21, 2013 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 More sharing options...
nat@dev Posted June 21, 2013 Share Posted June 21, 2013 (edited) 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 June 21, 2013 by nat@dev (see edit history) Link to comment Share on other sites More sharing options...
nat@dev Posted June 21, 2013 Share Posted June 21, 2013 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 More sharing options...
laurentg Posted June 21, 2013 Author Share Posted June 21, 2013 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 More sharing options...
laurentg Posted June 21, 2013 Author Share Posted June 21, 2013 Dis moi natdev , peux tu m'aider sur la ligne que nous à donné vioncent car je nage un peu merci Link to comment Share on other sites More sharing options...
Vincent Decaux Posted June 21, 2013 Share Posted June 21, 2013 (edited) 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 June 21, 2013 by Vincent Decaux (see edit history) Link to comment Share on other sites More sharing options...
nat@dev Posted June 21, 2013 Share Posted June 21, 2013 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... Link to comment Share on other sites More sharing options...
Vincent Decaux Posted June 21, 2013 Share Posted June 21, 2013 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... 1 Link to comment Share on other sites More sharing options...
nat@dev Posted June 21, 2013 Share Posted June 21, 2013 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 . Link to comment Share on other sites More sharing options...
macfly69200 Posted October 24, 2013 Share Posted October 24, 2013 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 1 Link to comment Share on other sites More sharing options...
Skydone Posted December 3, 2013 Share Posted December 3, 2013 Very usefull, thank you macfly69200 Link to comment Share on other sites More sharing options...
tycoons Posted December 5, 2013 Share Posted December 5, 2013 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 Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now