Jump to content

Surcharge des templates à la Drupal


Recommended Posts

Bonjour à tous,

J'utilise régulièrement Drupal et Ubercart et je reste frustré face à la non-modularité du theming dans Prestashop (ex:modification du theme pour un produit particulier ou pour une catégorie, un peu comme Magento). Voici ma technique pour ajouter cette possibilité à Prestashop sans toucher au coeur.

1. Créez un fichier smarty.wrapper.inc.php dans le dossier config à la racine et collez ça dedans:

<?php

class smartywrapper extends Smarty {

   function display($resource_name, $cache_id = null, $compile_id = null)
   {
       preg_match("/(.+\/)(.+)/", $resource_name, $path);

       switch(true) {

           case isset($_GET['id_product']):
               $newname = $path[1].'pid'.$_GET['id_product'].'-'.$path[2];
               if(file_exists($newname)) { $resource_name = $newname; break; }

               $product = new Product($_GET['id_product']);
               $newname = $path[1].'cid'.$product->id_category_default.'-'.$path[2];
               if(file_exists($newname)) $resource_name = $newname;
               break;

           case isset($_GET['id_category']):
               $newname = $path[1].'cid'.$_GET['id_category'].'-'.$path[2];
               if(file_exists($newname)) $resource_name = $newname;
               break;

       }

       parent::display($resource_name, $cache_id, $compile_id);
   }

}

?>



Supprimez la ligne suivante dans le fichier smarty.config.inc.php:

$smarty = new Smarty();



et remplacez la par:

require_once(dirname(__FILE__).'/smarty.wrapper.inc.php');
$smarty = new smartywrapper();



Vous pouvez maintenant surcharger vos templates grâce aux identifiants des produits et des catégories.

Par exemple, pour modifier le fichier header.tpl pour tous les produits dans la catégorie id 10, dupliquez le fichier header.tpl et renommer le en cid10-header.tpl. Il sera utilisé si nécessaire par Prestashop.
Un autre exemple, si vous voulez modifier la fiche produit d'un article en particulier, par ex l'id 5, alors dupliquez le fichier product.tpl et renommez le en pid5-product.tpl. Si Prestashop le trouve, alors il l'utilisera à la place.

J'ai fait ça rapidos et je n'ai pas testé plus que ça donc si vous trouvez des problèmes... n'hésitez pas.


MAJ: Gregory propose une méthode bien plus simple et qui ne surcharge pas la classe Smarty donc à utiliser en priorité: http://www.prestashop.com/forums/viewreply/222781/
Link to comment
Share on other sites

Merci pour vos commentaires.

Pour répondre à Easybizness, malheureusement cela ne fonctionnera pas avec cid10-product.tpl car sur la fiche produit, l'identifiant de la catégorie n'est pas envoyé en GET. Il faudrait trouver une méthode plus fonctionnelle que la méthode GET pour récupérer l'identifiant d'un produit et de sa catégorie. Ou au moins charger le produit grâce à la classe Product pour récupérer l'identifiant de la catégorie principale.

Je ferais la modification tout à l'heure.

Link to comment
Share on other sites

J'ai mis à jour le script (voir post #1) pour que cela fonctionne mais je ne suis pas satisfait par la méthode utilisée. Je veux éviter de faire une requête sql et je pense qu'il est inutile de charger l'intégralité du produit pour obtenir l'id de la catégorie. En plus, cela ne fonctionnera certainement pas avec les produits dans des catégories multiples. Je ne sais pas comment respecter au mieux les conventions de developpement de Prestashop et j'aurais bien besoin d'un expert avant une éventuelle soumission à la team.
Merci donc à ceux qui voudront bien m'aider.

Pour terminer, je pense que l'idéal serait d'avoir un champ supplémentaire sur les formulaires d'édition des produits et des catégories pour indiquer le préfix à placer devant les noms des fichiers tpl.

Link to comment
Share on other sites

Hello,

Je doit tout d'abord vous dire que je ne suis pas du tout un expert PrestaShop. Je suis novice...

Cependant, lorsque je voie votre code :

class smartywrapper extends Smarty


Je le comprend comme : smartywrapper ajoute des fonctionnalité au moteur de template Smarty. Or d'après moi votre code ajoute une fonctionnalité a votre module/page et non pas au moteur.

De mon point de vue, je pense qu'il serrai préférable de surcharger la classe Module plutôt que Smarty. Qu'en pensez vous ?

Mais sans allé jusque la( modifier le fonctionnement interne de rendu de PrestaShop), pourquoi ne pas tout betement prendre modele sur la class blockcategories par exemple.

 if (file_exists( dirname( __FILE__).'/'.$_GET['id_product'].'_categories.tpl'))
  return $this->display(__FILE__, $_GET['id_product'].'_categories.tpl');
else
 return $this->display(__FILE__, 'categories.tpl');



Donc une voie contre :-) ( Ben il en fallait bien une :P )


Amicalement,
T'chüss

Link to comment
Share on other sites

Bonjour Apaccy,

J'avais bien pensé au début faire cette modification directement dans les classes de Prestashop mais cela entraine vraiment trop de modification de code et vu qu'il n'est pas possible, à mon avis, de faire ça avec un module, j'ai opté pour la surcharge de la classe Smarty.

À la base cette modification a été faite dans l'urgence pour un client qui voulait un thème spécifique pour un produit particulier. Arf, ils sont toujours pressés ces clients... :-S

Par contre, je suis d'accord avec vous sur le fait que surcharger la classe Smarty n'est pas forcément l'idéal. Surtout si d'autres développeurs veulent surcharger eux aussi cette classe, on ne s'en sort plus. Il doit exister d'autres méthodes plus évolutives mais il faut que je ressorte mais vieux livres sur les design patterns (ou peut-être qu'un jour, un dev de la team Prestashop jètera un oeil sur ce post et me fera un petit "coucou, voici la marche à suivre...").

À plus tard et merci pour le commentaire.

Link to comment
Share on other sites

Bonjour,

Eh bien, il me semble qu'il ya plus simple sans être vraiment sûr d'avoir compris.

PS permet la surcharge de templates dans le thème, templates des modules y compris.

Ne suffit il pas dans le template parent concerné de choisir d'inclure tel ou tel autre template ?

{if $product->id == 'XX'}
{include file=$tpl_dir./XX-blabla.tpl}
{/if}



en tout cas sur http://www.labagagerie.com/ le catégories sont bien différentes en fonction de l'identifiant et rien n'est surchargé. Smarty rules =)

Cordialement

Gregory Roussac

Link to comment
Share on other sites

Bien vu Gregory !

Effectivement cette méthode et bien plus simple et évite la surcharge de la classe Smarty. Si j'ai bien compris, il faut par exemple pour le header créer 2 fichier header1 et header2, vider le contenu du fichier header.tpl et ajouter la structure conditionnelle à la place pour rediriger Smarty vers le bon fichier.

Je n'y avais pas pensé. Cette méthode est vraiment géniale mais je pense qu'il serait quand même intéressant que l'équipe ajoute la fonctionnalité du choix du template dans la fiche d'édition du produit ou dans la fiche d'édition d'une catégorie dans les versions futures de Prestashop.

Je compare souvent Prestashop à Drupal même si PS n'est pas un CMS. Je pense qu'il manque encore quelques modules pour faire de PS la boutique incontournable de la mort qui tue. Nous verrons peut-être un jour un module views ou un module panels pour Prestashop ?

En tout cas merci !

Link to comment
Share on other sites

Re,

C'est vrai que drupal est très bien surtout pour ses modules
(CCK,view, le multiblog et tant d'autres particularités et aussi les nombreux hack ainsi qu'une communauté de développeurs sans cesse en action)

par contre au niveau des thème rien ne vaut à mon avis CmsMadeSimple et son exemplaire modularité ainsi que son back office ; on peut praatiquement tout faire en ligne en plus le php les css et le code smarty entièrement séparé
block de contenu globaux UDT)

C'est sûre que prestashop a de l'avenir, on le voit bien sur les forums au nombre des diffèrents utilisateurs de tous les pays
Je ne comprends pas pourquoi le code smarty ne prend pas plus de place dans prestashop, je veux dire par là que dans l'admin tout comme dans cmsmadesimple, on devrait pouvoir utiliser différents modéles de gabarits smarty pour les menus les template, les news .... et tous les paramètres qui vont avec .
Bien sûre comme dit plus haut prestashop n'est pas un cms mais il est déjà un grand, le multilangue est une merveille et fonctionne bien avec l'url rewriting et puis il est foncièrement centré sur la vente drupal lui c'est la presse voir MEDIAPART... Rue 89 ...arret-sur-images...New York observer

A+
Phil Did

Link to comment
Share on other sites

C'est un peu hors sujet mais au niveau de Drupal, il existe des modules pour l'édition en ligne des templates et des css: http://drupal.org/project/theme_editor

Je travail dans une web-agency et Drupal est devenu mon principal outil de conception. Grâce à lui, j'économise de nombreuses heures de développement surtout lors de demandes spécifiques des clients ou de complexités techniques. Drupal a généralement réponse à tout et lorsque ce n'est pas le cas, il suffit d'aller faire un tour dans la communauté car quelqu'un l'a forcément déjà fait.

Ce qu'il reste à faire sur Drupal: développer un module D6-7 qui permette l'intégration complète de PS. La question a déjà été posée mais reste en suspend: http://drupal.org/node/332363

Je veux bien lancer le projet si je trouve des personnes intéressées.

Link to comment
Share on other sites

Je suis intéressé !

Pour l'instant mes priorités son @illeurs ... mais d'ici quelques semaines je devrais pouvoir débloquer quelques heures par semaines... Je ne suis pas un expert Dupral non plus... Néanmoins de part mon expérience en développement j'ai la conviction que je pourrai être utile.

sirozz, a ton avis, quel serrai les grand point a travailler ? Ou est le gros du travail ?

Cordialement,


PS : Sirozz, ce qui me dérange, c'est tout ces "Si" que tu place dans tes phrases, alors que sans lui( le si) tout serrai plus rozz ;-)

Link to comment
Share on other sites

Merci Apaccy,

Je vais faire quelques essais de mise en place cette semaine et préparer un petit cahier des charges. Je n'ai aucune idée pour l'instant du travail à effectuer sur la prise en charge du backoffice dans Drupal. Je ne sais même pas si c'est possible. Par contre, je pense qu'il faut laisser Drupal s'occuper de l'affichage du front.
Peut-être lier la taxonomie aux catégories vu que le fonctionnement est le même ?
Peut-être créer un module pour views pour l'affichage des produits ?
Voir du coté de services http://drupal.org/project/Services pour la liaison ?

Merci pour ton post scriptum.
http://www.justsomelyrics.com/1820341/Eiffel-Avec-des-si-Lyrics

Link to comment
Share on other sites

Sirozz :-) Je n'ai toujours pas installé Dupral mais j'ai lu ce poste Fonctionnement interne de Drupal qui m'a permis d'avoir une vue d'ensemble.
Je viens de lire un billet sur le concept de taxonomie de Dupral et j'aime beaucoup( je pense qu'il serrai dommage de s'en priver, et ce serai une vraie innovation pour PrestaShop).
Et je vai me mettre doucement au manuel de Dupral


A mon avis, avant même de nous lancer dans un cahier des charges, je pense qu'il serrai judicieux de se pencher assidument sur nos besoins respectif.
Pour moi notre but est d'allié contenue gratuit( média) et produit commercial et visse vers ça(lol).
A mon avis, pour cela, deux proposition s'offre a nous:

* Ajouter du contenue média a nos produits dans prestashop
* Ajouter des produits commercial a notre contenue Dupral

Ce qui a pour conséquence d'augmenter le trafic et/ou nos ventes ... C'est Papa qui va être content ;-)

Voici comment je vois les choses :
Je pense que la solution la plus pereinne est de maintenir le fonctionnement de chaque solutions tel quel ce qui nous permetra de profiter des mise a jour de PrestaShop comme de Dupral et ainsi modifier le minimum, le strict néccessaire. Ainsi je pencherai pour un adaptateur connecté par des service( Spooling)
Pour ce qui est du Front-End je pense aussi que cela ne devrai pas posser trop de probleme, il serrai meme envisagable de déléguer cette tache a de plus jeune développeur, histoire que tout le monde puisse se faire la main et profiter de l'experience de chaqu'un.

Je parle sans réelle connaissance de cause( ne connaissant pas réellement ces deux solutions) et j'ai peut etre tout faux.
C'est en tout cas dans l'espoir que cela nous porte à réfléchir que je poste. En tout cas je compte sur toi pour nous faire part de ton retour ( bon ou mauvais) sur tes essai :-)


PS : Concernant mon petit chémat, les partie en jaune sont les partie a créer et les bloque( mapping url, compte, ..) de chaque solutions son a modifier/adapter.

La question reste pour moi entier : Comment allons nous faire.
J'attend avec impatience le résultat de ta réflection.

22053_Kl8cmzZX3gvLQSZKfsfq_t

Link to comment
Share on other sites

Hello,

Désolé mais je n'arrive décidément pas à trouver du temps pour avancer.

De mon coté, je pense qu'il faut commencer par essayer d'intégrer les articles PS dans une vue Drupal. Je suis tombé sur le module "table wizard" qui permet d'intégrer des tables externes directement dans le module views sans faire de développement: http://drupal.org/project/tw

C'est loin d'être une intégration complète de Prestashop mais il faut bien commencer quelque part.

Par la suite, les 3 choses à synchroniser sont:

coté Drupal - coté Prestashop
user - user
node de type produit avec CCK - product
node de type order avec CCK - order

Et là, je suis d'accord avec ton schéma: services (existants du coté de Drupal) pour commander Drupal et ainsi permettre la création de noeuds ou d'utilisateurs depuis PS et un module services pour PS à développer, idem pour commander Prestashop et créer les produits ou les utilisateurs depuis Drupal.

Je pense qu'il faut créer un nouveau topic car nous sommes complétement hors sujet ici et aussi pour augmenter la visibilité du projet. Peut-être que d'autres personnes qui auront plus de temps de libre seront intéressées.

Link to comment
Share on other sites

  • 7 months later...

Bonjour,

nouveau sur prestashop, je suis un utilisateur passionné par drupal.

Le moteur smarty est utilisable sous drupal, mais la trés grande majorité des utilisateurs et des développeurs de theme utilisent le moteur PhpTemplate.

Pensez vous qu'il soit possible d'intégrer ce moteur a PrestaShop?

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