franckm1000 Posted July 20, 2012 Share Posted July 20, 2012 (edited) Suite à une discussion sur un sujet dans une autre partie du forum, j'ai fais un test pour essayer d'afficher un thème différent suivant la catégorie/produit affichée. Par exemple dans le cas d'habits pour enfants ou adultes on peut vouloir afficher une thème spécifique pour les enfants. Ce qu'on veut, c'est afficher un thème différent pour la sous-catégorie enfants mais également pour tous les produits de cette sous-catégorie. Imaginons que cette sous-catégorie soit la catégorie avec l'ID numéro 2. On suppose que le site affiche le thème de base prestashop et que pour la sous-catégorie enfants, vous voulez affichez le thème mon_theme. Le thème est défini dans le fichier settings.inc.php. J'ai donc éditer ce fichier. Problème: l'accès à la base n'est pas encore défini à cet endroit. Il va falloir faire un accès à la base. Commencez par enlever la ligne déclarant la constante _THEME_NAME_: define('_THEME_NAME_', 'prestashop'); Ensuite, à la fin du fichier, rajoutez: $link=mysql_connect('localhost','root',''); mysql_select_db('prestashop', $link); $sql="select * from ps_product where id_category_default=2"; $req=mysql_query($sql); while($result=mysql_fetch_array($req)) { if(isset($_GET['id_category'])&&$_GET['id_category']==2) { $theme='mon_theme'; break; } elseif(isset($_GET['id_product'])&&$_GET['id_product']==$result['id_product']) { $theme='mon_theme'; break; } else { $theme='prestashop'; } } define('_THEME_NAME_', $theme); Dans ce bout de code: on se connecte à la base de données (ici en local avec la base nommé "prestashop"). On récupère tous les produits de cette catégorie On teste: si on est dans cette sous-catégorie, on affiche "mon_theme", ensuite si on est dans un produit de la sous-catégorie, on affiche "mon_theme", enfin dans tous les autres cas on affiche le thème prestashop. J'ai testé en local sur une version 1.4.8.2, et franchement ça marchait bien. Bien entendu, c'est du bricolage, mais bon ça peut peut être servir... NB: cela fonctionne mais reste assez primitif. En outre, il faut y adapter si la sous-catégorie possède encore d'autres sous-catégories. Edited July 20, 2012 by franckm1000 (see edit history) Link to comment Share on other sites More sharing options...
ajhax Posted July 26, 2012 Share Posted July 26, 2012 Je vais tester ça merci beaucoup pour ta solution en tout cas ! Link to comment Share on other sites More sharing options...
tom21 Posted September 8, 2012 Share Posted September 8, 2012 (edited) l’idéal sera que la thème soit être sélectionner au moment du création de la nouvelle catégorie. et pour compléter il faut que la configuration active/non-active des modules soi aussi defini dans les thèmes, pour mieux adapter, l’affichage des block et produits, Edited September 8, 2012 by tom21 (see edit history) Link to comment Share on other sites More sharing options...
franckm1000 Posted September 8, 2012 Author Share Posted September 8, 2012 (edited) Pour sélectionner ou pas le nouveau thème lors de l'ajout de catégorie, c'est faisable. Il suffit de rajouter un nouveau champs dans la table ps_category nommé nom_theme qu'on va renseigner lors de la création de la catégorie. Ensuite il suffira d'appeler à chaque fois le thème trouvé dans cette table: $link=mysql_connect('localhost','root','');mysql_select_db('prestashop', $link);if(isset($_GET['id_category'])) { $sql="select * from ps_category where id_category=".$_GET['id_category']; $req=mysql_query($sql); $mon_theme=mysql_fetch_array($req); $theme=$mon_theme['mon_theme']; }else { $theme='prestashop'; }define('_THEME_NAME_', $theme); Edited September 8, 2012 by franckm1000 (see edit history) 1 Link to comment Share on other sites More sharing options...
fxdesca Posted October 2, 2012 Share Posted October 2, 2012 (edited) Pour sélectionner ou pas le nouveau thème lors de l'ajout de catégorie, c'est faisable. Il suffit de rajouter un nouveau champs dans la table ps_category nommé nom_theme qu'on va renseigner lors de la création de la catégorie. Ensuite il suffira d'appeler à chaque fois le thème trouvé dans cette table: $link=mysql_connect('localhost','root',''); mysql_select_db('prestashop', $link); if(isset($_GET['id_category'])) { $sql="select * from ps_category where id_category=".$_GET['id_category']; $req=mysql_query($sql); $mon_theme=mysql_fetch_array($req); $theme=$mon_theme['mon_theme']; } else { $theme='prestashop'; } define('_THEME_NAME_', $theme); Bonjour supposons que je veuille réaliser un test A/B de mes pages produits avec google analytics. Je creer deux templates product.tpl différents. 50% du trafic sera renvoyer vers le template original, et 50% vers l'autre template. Comment puis-je faire cela. ? J'ai édité le fichier ProductController.php et rajouter ces lignes . public function displayContent() { parent::displayContent(); if($logged) self::$smarty->display(_PS_THEME_DIR_.'product.tpl'); else self::$smarty->display(_PS_THEME_DIR_.'product2.tpl'); } La condition étant que "si l'internaute est connecté à son compte" il est renvoyé sur le template product.tpl, si non, il est renvoyé sur le template product2.tpl Ca ne fonctionne pas....ou ai-je commis une erreur ? sachant que if ($cookie->isLogged) ne fonctionne pas non plus Dans tous les cas, je suis renvoyé vers le template 'product2.tpl' Edited October 2, 2012 by fxdesca (see edit history) Link to comment Share on other sites More sharing options...
fxdesca Posted October 2, 2012 Share Posted October 2, 2012 Bon j'ai résolu le probème avec ce code : public function displayContent() { parent::displayContent(); global $cookie; if ($cookie->isLogged()) self::$smarty->display(_PS_THEME_DIR_.'product.tpl'); else self::$smarty->display(_PS_THEME_DIR_.'product3.tpl'); } Le problème, c'est que je voudrais avoir 2 urls différentes pour les différencier ? Pourriez vous m'aider ? Merci Link to comment Share on other sites More sharing options...
franckm1000 Posted October 3, 2012 Author Share Posted October 3, 2012 (edited) J'avais bien pensé à un truc comme ça: public function displayContent() { parent::displayContent(); global $cookie; if ($cookie->isLogged()) { self::$smarty->display(_PS_THEME_DIR_.'product.tpl'); $lien=new Link(); header('location:'.$lien->getProductLink(Tools::getValue('id_product'),NULL,NULL,NULL,$cookie->id_lang).'&mon_parametre=yyyy'); } else { self::$smarty->display(_PS_THEME_DIR_.'product3.tpl'); $lien=new Link(); header('location:'.$lien->getProductLink(Tools::getValue('id_product'),NULL,NULL,NULL,$cookie->id_lang).'&mon_parametre=xxxx'); } } Mais bon ça veut pas marcher quand je le teste, il mouline sans s'arrêter. Il a pas l'air d'apprécier le header à cet endroit. Pourtant la méthode getProductLink renvoie bien le bon lien et bizarrement ça à marché une ou deux fois. Essaies de ton côté mais bon ça peut être une piste... Ca affiche ça: L'adresse dans le navigateur est correcte mais il affiche un problème de redirection Edited October 3, 2012 by franckm1000 (see edit history) Link to comment Share on other sites More sharing options...
Rdev Posted December 3, 2013 Share Posted December 3, 2013 Suite à une discussion sur un sujet dans une autre partie du forum, j'ai fais un test pour essayer d'afficher un thème différent suivant la catégorie/produit affichée. Par exemple dans le cas d'habits pour enfants ou adultes on peut vouloir afficher une thème spécifique pour les enfants. Ce qu'on veut, c'est afficher un thème différent pour la sous-catégorie enfants mais également pour tous les produits de cette sous-catégorie. Imaginons que cette sous-catégorie soit la catégorie avec l'ID numéro 2. On suppose que le site affiche le thème de base prestashop et que pour la sous-catégorie enfants, vous voulez affichez le thème mon_theme. Le thème est défini dans le fichier settings.inc.php. J'ai donc éditer ce fichier. Problème: l'accès à la base n'est pas encore défini à cet endroit. Il va falloir faire un accès à la base. Commencez par enlever la ligne déclarant la constante _THEME_NAME_: define('_THEME_NAME_', 'prestashop'); Ensuite, à la fin du fichier, rajoutez: $link=mysql_connect('localhost','root',''); mysql_select_db('prestashop', $link); $sql="select * from ps_product where id_category_default=2"; $req=mysql_query($sql); while($result=mysql_fetch_array($req)) { if(isset($_GET['id_category'])&&$_GET['id_category']==2) { $theme='mon_theme'; break; } elseif(isset($_GET['id_product'])&&$_GET['id_product']==$result['id_product']) { $theme='mon_theme'; break; } else { $theme='prestashop'; } } define('_THEME_NAME_', $theme); Dans ce bout de code:on se connecte à la base de données (ici en local avec la base nommé "prestashop"). On récupère tous les produits de cette catégorie On teste: si on est dans cette sous-catégorie, on affiche "mon_theme", ensuite si on est dans un produit de la sous-catégorie, on affiche "mon_theme", enfin dans tous les autres cas on affiche le thème prestashop. J'ai testé en local sur une version 1.4.8.2, et franchement ça marchait bien. Bien entendu, c'est du bricolage, mais bon ça peut peut être servir... NB: cela fonctionne mais reste assez primitif. En outre, il faut y adapter si la sous-catégorie possède encore d'autres sous-catégories. Bonjour , merci franckm1000 pour ce code, j'ai utilisé ce code en local il fonctionne mais en ligne j'ai ces erreur, Notice: Undefined variable: theme in /www/www.xxx.me/config/settings.inc.php on line 44 Fatal error: Uncaught exception 'SmartyException' with message 'Unable to load template file 'www/www.xxx.me/themes//header.tpl'' in /srv/d_Moll/www/www.xxx.me/tools/smarty/sysplugins/smarty_internal_template.php:163 Stack trace: #0 www/www.xxx.me/tools/smarty/sysplugins/smarty_internal_template.php(551): Smarty_Internal_Template->isExisting(true) #1 www/www.xxx.me/tools/smarty/Smarty.class.php(339): Smarty_Internal_Template->getRenderedTemplate() #2 www/www.xxx.me/tools/smarty/Smarty.class.php(383): Smarty->fetch('/srv/d_Moll/www...', NULL, NULL, NULL, true) #3 www/www.xxx.me/classes/FrontController.php(493): Smarty->display('/srv/d_Moll/www...') #4 www/www.xxx.me/classes/FrontController.php(65): FrontControllerCore->displayHeader() #5 www/www.xxx.me/index.php(29): FrontControllerCore->run() #6 {main} thrown in www/www.xxx.me/tools/smarty/sysplugins/smarty_internal_template.php on line 163 pouvez vous m'aider et merci Link to comment Share on other sites More sharing options...
Centaure Posted January 22, 2014 Share Posted January 22, 2014 Bonjour, cette solution m'intéresse beaucoup car je ne veux pas utiliser le multiboutique ... Est-ce que quelqu'un à un retour d'expérience sur cette solution proposée ? Ou alors avez-vous trouvé une autre solution ? Merci par avance pour votre aide Link to comment Share on other sites More sharing options...
Recommended Posts