Jump to content

[ASTUCE]Afficher un thème différent suivant la catégorie


Recommended Posts

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:

  1. on se connecte à la base de données (ici en local avec la base nommé "prestashop").
  2. On récupère tous les produits de cette catégorie
  3. 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 by franckm1000 (see edit history)
Link to comment
Share on other sites

  • 1 month later...

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 by tom21 (see edit history)
Link to comment
Share on other sites

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 by franckm1000 (see edit history)
  • Like 1
Link to comment
Share on other sites

  • 4 weeks later...

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 :blink:

 

Dans tous les cas, je suis renvoyé vers le template 'product2.tpl'

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

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

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:

redirection.jpg

 

L'adresse dans le navigateur est correcte mais il affiche un problème de redirection

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

  • 1 year later...

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

  • 1 month later...

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

Guest
This topic is now closed to further replies.
×
×
  • Create New...