Jump to content

[MOD] Template dynamique - utilisez plusieurs thèmes sur votre boutique


Recommended Posts

Bonjour

N'ayant rien trouvé pour appliquer différents templates en fonction des pages du site, je vous propose un petit mod qui vous permettera d'afficher un template en fonction de l'url de la page.

Avant de commencer, sauvegardez votre fichier settings.inc.php !

Dans le fichier [admin]/functions.php

remplacer la fonction rewriteSettingsFile par :

/**
 * Generate a new settings file, only transmitted parameters are updated
 *
 * @param string $baseUri Base URI
 * @param string $theme Theme name (eg. default)
 * @param array $arrayDB Parameters in order to connect to database
 */
function    rewriteSettingsFile($baseUri = NULL, $theme = NULL, $arrayDB = NULL)
{
    $defines = array();
   $defines['__PS_BASE_URI__'] = !is_null($baseUri) ? $baseUri : __PS_BASE_URI__;
   //$defines['_THEME_NAME_'] = $theme ? $theme : _THEME_NAME_;

   $defines['_THEME_DEFAULT_NAME_'] = $theme ? $theme : _THEME_DEFAULT_NAME_;

   $defines['_DB_NAME_'] = (($arrayDB AND isset($arrayDB['_DB_NAME_'])) ? $arrayDB['_DB_NAME_'] : _DB_NAME_);
   $defines['_DB_SERVER_'] = (($arrayDB AND isset($arrayDB['_DB_SERVER_'])) ? $arrayDB['_DB_SERVER_'] : _DB_SERVER_);
   $defines['_DB_USER_'] = (($arrayDB AND isset($arrayDB['_DB_USER_'])) ? $arrayDB['_DB_USER_'] : _DB_USER_);
   $defines['_DB_PREFIX_'] = (($arrayDB AND isset($arrayDB['_DB_PREFIX_'])) ? $arrayDB['_DB_PREFIX_'] : _DB_PREFIX_);
   $defines['_DB_PASSWD_'] = (($arrayDB AND isset($arrayDB['_DB_PASSWD_'])) ? $arrayDB['_DB_PASSWD_'] : _DB_PASSWD_);
   $defines['_DB_TYPE_'] = (($arrayDB AND isset($arrayDB['_DB_TYPE_'])) ? $arrayDB['_DB_TYPE_'] : _DB_TYPE_);
   $defines['_COOKIE_KEY_'] = addslashes(_COOKIE_KEY_);
   $defines['_COOKIE_IV_'] = addslashes(_COOKIE_IV_);
   $defines['_PS_VERSION_'] = addslashes(_PS_VERSION_);
   $content = "<?php\n\n";
   foreach ($defines as $k => $value)
       $content .= 'define(\''.$k.'\', \''.addslashes($value).'\');'."\n";
   $content .= "include_once('settings_dynamic_theme.inc.php');";
   $content .= "\n?>";
   if ($fd = @fopen(PS_ADMIN_DIR.'/../config/settings.inc.php', 'w'))
   {
       fwrite($fd, $content);
       fclose($fd);
       return true;
   }
   return false;
}



Cela a pour but d'empecher presta de reecrire la constante _THEME_NAME_ (dans settings.inc.php)

Nous allons donc pouvoir utiliser nos propres règles pour définir le template :

Créer un fichier "settings_dynamic_theme.inc.php" dans le dossier config/ :

<?php

/*
Prestashop Dynamic template
v1.0.0
Camille Frisch aka _mika_
www.mikarama.fr
*/

// read url
function curPageURL() {
$pageURL = 'http';
if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
$pageURL .= "://";
if ($_SERVER["SERVER_PORT"] != "80") {
 $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
} else {
 $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
}
return $pageURL;
}

// search string in url
function searchString($string, $container)
{
   if(strstr($container,$string)) 
   {
       return $string;
   } 
   else 
   {
       return false;
   }
}

/*
define template/page couples
search for template in url, return result
*/
function setTemplate()
{
   // set templates list
   $templatesArr = array("prestashop-cv" => "prestashop-cv",
                         "order-custom-flash" => "prestashop-cv",
                         "isant-v2" => "isant-v2");

   // search for template name in url
   // return template name if true, else defaut template 
   foreach ($templatesArr as $key => $value) 
   {
       $result = searchString($key, curPageURL() );
       if( $result )return $value;
   }
   // else
   return  _THEME_DEFAULT_NAME_;
}

// define template 
define('_THEME_NAME_', setTemplate());


?>



Le code est assez simple ... définissez votre tableau $templatesArr comme suit :

$templatesArr = array("prestashop-cv" => "prestashop-cv",
"order-custom-flash" => "prestashop-cv",
"isant-v2" => "isant-v2");

ou les valeurs sont des nom de templates.

Quand aux clés, c'est la qu'est ma petite astuce : avec l'url rewriting activé, insérer vos 'clés' dans l'url de la page.
Si la fonction 'match' une clé dans le tableau, sont template associé sera affiché.

J'epsere avoir été clair ... N'hesitez pas à me posez des questions si ce n'est pas le cas.
Cela fonctionne pour des themes avec le meme nombre de colonnes. Je n'ai pas encore exploré les possibiltés d'agir sur les block ...

voici une petite démo :

http://www.configurateurvisuel.fr/ > template par défaut
http://www.configurateurvisuel.fr/52-casquettes-et-couvre-chefs-prestashop-cv > template prestashop

faites moi part de vos avis !

mika

settings_dynamic_theme.inc.php

functions.php

Link to comment
Share on other sites

Le module de Beve Croll SEO Fixer devrait justement s'exprimer pleinement dans ce cas, et eviter les duplicate content.

Pour ce qui est des modules agissants sur le css, non ce n'est pas ce que je cherchais a faire. La finalité n'est pas d'adapter un template suivant les différentes pages, mais de la changer (pour un autre).
css, tpl, img, etc inclus

Merci pour ton commentaire !
mika

Link to comment
Share on other sites

J'ai moi même "bidouillé" pour avoir une solution similaire.
J'ai modifié le settings.inc.php et mit des conditions (analyse d'url) au niveau du define('_THEME_NAME_', 'prestashop');. C'est moins beau mais bon ... ^^

Par contre je ne sais pas si tu as remarqué, mais l'url rewriting avec le module "Ventes croisées v0.1" ne marche pas bien.
Normalement il y a un 'dossier' représentant la catégorie, par exemple : "/musique-ipods/" dans le cas des ipods.
Mais les liens générés par la vente croisée n'affiche pas la catégorie !

On se retrouve donc avec :
http://maboutique.com/7-ipod-touch.html
Au lieu de :
http://maboutique.com/musique-ipods/7-ipod-touch.html

Hors je me base principalement sur ce fameux dossier pour appliquer les thèmes.
As tu une solution à ce problème ?

Est ce que tu sais si le module SEO règle ce problème ?
http://www.prestastore.fr/referencement-seo/175-outils-dadministration-seo---referencement.html

Link to comment
Share on other sites

Je t'avoue n'avoir jamais utilisé "ventes croisées", donc je serai bien incapable de t'aider


Arf. Je vais continuer à chercher (j'ai contacter la team prestashop concernant ce problème et leur module SEO).
Peut être qu'un autre module peut faire l'affaire, par exemple :
http://www.prestastore.fr/fonctionnalites-front-office/212-fonctionnalites-front-office-vente-croisee.html

Si je trouve une solution je la posterais ici ;)
Link to comment
Share on other sites

Je cherche toujours a améliorer les choses.
Le problème avec les scripts d'analyse url c'est que comme dans le tient, il peut y avoir des erreurs et ça ne s'applique pas aux sous caté :

Les pages
http://www.configurateurvisuel.fr/52-casquettes-et-couvre-chefs-prestashop-cv
http://www.configurateurvisuel.fr/330-t-shirt-blanc-personnalise-135-g-m.html
n'ont pas le même thème alors qu'elles devraient.

Penses tu qu'il y aurait moyen de récupérer la categorie courante directement via la variable globale $smarty à la manière du module blockcategory par exemple ? Et d'en suite modifier les variables définies par le fichier settings.inc.php à la volée?
Ca serait suremetn plus "propre".

Link to comment
Share on other sites

Salut

Les 2 pages que tu cites n'ont pas le meme thème et c'est voulu :
La detection se fait par le nom de la page, pas par la position ou l'arborescence dans la catalogue.

si tu veux utiliser le meme theme sur les produits de la catégorie, renomme les en :
http://www.configurateurvisuel.fr/330-t-shirt-blanc-personnalise-135-g-m-prestashop-cv.html

It's not a bug, it's a feature !

;)

Link to comment
Share on other sites

Ah j'avais mal compris ;)
Je pensais que le template s'appliquait aux sous catégories !

Je sens que je vais travailler carrément sur un module qui permet d'appliquer des templates en fonction de la "catégorie mère" (niveau juste en dessous de "Accueil") et qui s'appliquera à toutes les sous catégories et tous le sous produits. Le tout sans passer par de l'analyse d'url.

Link to comment
Share on other sites

  • 1 year later...

Bonjour,

 

Ma version : Prestashop 1.4.8.2 (en local)

Url-rewriting activé.

 

J'ai essayé mais ça ne fonctionne pas après avoir installé et activé le template "prestashop-christmas-2011" avec le theme installer. URL de test: http://127.0.0.1:8888/prestashop/?prestashop .

 

 

rewriteSettingsFile dans fonction.php


function rewriteSettingsFile($baseUrls = NULL, $theme = NULL, $arrayDB = NULL)
{
    $defines = array();
   $defines['__PS_BASE_URI__'] = ($baseUrls AND $baseUrls['__PS_BASE_URI__']) ? $baseUrls['__PS_BASE_URI__'] : __PS_BASE_URI__;
   $defines['_MEDIA_SERVER_1_'] = ($baseUrls AND isset($baseUrls['_MEDIA_SERVER_1_'])) ? $baseUrls['_MEDIA_SERVER_1_'] : _MEDIA_SERVER_1_;
   $defines['_MEDIA_SERVER_2_'] = ($baseUrls AND isset($baseUrls['_MEDIA_SERVER_2_'])) ? $baseUrls['_MEDIA_SERVER_2_'] : _MEDIA_SERVER_2_;
   $defines['_MEDIA_SERVER_3_'] = ($baseUrls AND isset($baseUrls['_MEDIA_SERVER_3_'])) ? $baseUrls['_MEDIA_SERVER_3_'] : _MEDIA_SERVER_3_;
   $defines['_PS_CACHING_SYSTEM_'] = _PS_CACHING_SYSTEM_;
   $defines['_PS_CACHE_ENABLED_'] = _PS_CACHE_ENABLED_;
   //$defines['_THEME_NAME_'] = $theme ? $theme : _THEME_NAME_;
   $defines['_THEME_DEFAULT_NAME_'] = $theme ? $theme : _THEME_DEFAULT_NAME_;

   $defines['_DB_NAME_'] = (($arrayDB AND isset($arrayDB['_DB_NAME_'])) ? $arrayDB['_DB_NAME_'] : _DB_NAME_);
   $defines['_MYSQL_ENGINE_'] = (($arrayDB AND isset($arrayDB['_MYSQL_ENGINE_'])) ? $arrayDB['_MYSQL_ENGINE_'] : _MYSQL_ENGINE_);
   $defines['_DB_SERVER_'] = (($arrayDB AND isset($arrayDB['_DB_SERVER_'])) ? $arrayDB['_DB_SERVER_'] : _DB_SERVER_);
   $defines['_DB_USER_'] = (($arrayDB AND isset($arrayDB['_DB_USER_'])) ? $arrayDB['_DB_USER_'] : _DB_USER_);
   $defines['_DB_PREFIX_'] = (($arrayDB AND isset($arrayDB['_DB_PREFIX_'])) ? $arrayDB['_DB_PREFIX_'] : _DB_PREFIX_);
   $defines['_DB_PASSWD_'] = (($arrayDB AND isset($arrayDB['_DB_PASSWD_'])) ? $arrayDB['_DB_PASSWD_'] : _DB_PASSWD_);
   $defines['_DB_TYPE_'] = (($arrayDB AND isset($arrayDB['_DB_TYPE_'])) ? $arrayDB['_DB_TYPE_'] : _DB_TYPE_);
   $defines['_COOKIE_KEY_'] = addslashes(_COOKIE_KEY_);
   $defines['_COOKIE_IV_'] = addslashes(_COOKIE_IV_);
   $defines['_PS_CREATION_DATE_'] = defined(_PS_CREATION_DATE_) ? _PS_CREATION_DATE_ : date('Y-m-d');
   if (defined('_RIJNDAEL_KEY_'))
       $defines['_RIJNDAEL_KEY_'] = addslashes(_RIJNDAEL_KEY_);
   if (defined('_RIJNDAEL_IV_'))
       $defines['_RIJNDAEL_IV_'] = addslashes(_RIJNDAEL_IV_);
   $defines['_PS_VERSION_'] = addslashes(_PS_VERSION_);
   $content = "<?php\n\n";
   foreach ($defines as $k => $value)
       $content .= 'define(\''.$k.'\', \''.addslashes($value).'\');'."\n";
   $content .= "include_once('settings_dynamic_theme.inc.php');";
   $content .= "\n?>";
   if ($fd = @fopen(PS_ADMIN_DIR.'/../config/settings.inc.php', 'w'))
   {
       fwrite($fd, $content);
       fclose($fd);
       return true;
   }
   return false;
}


 

 

settings_dynamic_theme.inc.php

<?php
/*
Prestashop Dynamic template
v1.0.0
Camille Frisch aka _mika_
www.mikarama.fr
*/
// read url
function curPageURL() {
$pageURL = 'http';
if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
$pageURL .= "://";
if ($_SERVER["SERVER_PORT"] != "80") {
 $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
} else {
 $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
}
return $pageURL;
}
// search string in url
function searchString($string, $container)
{
if(strstr($container,$string))
{
	return $string;
}
else
{
	return false;
}
}
/*
define template/page couples
search for template in url, return result
*/
function setTemplate()
{
// set templates list
$templatesArr = array("prestashop" => "prestashop", "prestashop-christmas-theme-2011" => "prestashop-christmas-theme-2011");

// search for template name in url
// return template name if true, else defaut template
foreach ($templatesArr as $key => $value)
{
	$result = searchString($key, curPageURL() );
	if( $result )return $value;
}
// else
return  _THEME_DEFAULT_NAME_;
}
// define template
define('_THEME_NAME_', setTemplate());

?>

Edited by negpsy (see edit history)
Link to comment
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...