Jump to content

[Modules] Surcharge de template d'administration via module


Recommended Posts

Bonjour,

 

Je travail depuis peu sur prestashop, et commence donc à bien mettre les mains dedans !

 

A 2 reprises (pour 2 projets différents) , j'ai été confronté à un problème qui me semble problématique. Je n'ai pas trouvé de solution miracle (propre ^^).

 

Voici mon besoin :

 

Pour mon client, je souhaite modifier, de façon profonde et/ou superficielle, l'affichage d'un formulaire en administration. Je souhaite réaliser cela via un module, car il y a des dépendances avec des fonctionnalités front.

 

Les solutions que j'ai trouvé :

  • Ajouter le tpl directement dans '/override' :  Ne me convient pas, car je souhaite avoir un module indépendant.
  • En fonction de la vue, ajouter des tpls à la suite de l'existant : Ne me convient pas, car selon le cas, je peux être amené à ajouter ma modification en milieu de tpl
  • Il existe la possibilité d'étendre le tpl, mais pas encore disponible dans les templates d'admin semble-t-il, et ne permet pas de choisir l'emplacement

 

Voila, j'ai donc essayé de creuser un peu, et voici ce que j'ai trouvé.

Si je surcharge le tpl depuis le module, celui-ci n'est pas copié dans '/override', car l'autoload de prestashop s'occupant de gérer override ne prend en charge que les class php.

Le fichier s'occupant du choix du tpl est situé dans '/classes/helper/Helper.php', dans la méthode createTemplate.

Ce qui m'étonne, c'est que ce fichier semble bien être prévu pour charger un tpl depuis un module :

$override_tpl_path = _PS_MODULE_DIR_.$this->module->name.'/views/templates/admin/_configure/'.$this->base_folder.$tpl_name;

Le souci, c'est que pour rentrer dans ce cas, il faut que $this->module soit setté, ce qui n'est pas le cas.

 

Une solution possible :

 

En bidouillant un peu dans mon module, j'ai donc réussi à setter mon module, mais pas de la manière dont je l'aurais souhaité (pas très propre). J'ai surchargé la méthode 'renderForm' de la class 'classes/controller/AdminController.php'.

Juste après le chargement du helper :

$helper = new HelperForm($this);

Je viens ajouter ensuite :

if ($this instanceof AdminWebserviceController) 
{
    $module = Module::getInstanceByName($this->module);
    $helper->module = $module;
}

En ayant au préalable setté '$this->module' dans la surcharge du contructeur avec le nom de mon module.

Le résultat est le bon, mais j'aimerais améliorer cela en étant plus flexible/maintenable. En effet, ce fonctionnement n'est pour le moment valable que pour un module (si je fais dans 2 modules, je vais avoir un souci dans mon override de 'AdminController.php').

 

Peut-être que je me trompe complètement de chemin? Avez vous des solutions à m'apporter?

 

 

Merci pour toute l'aide que vous pourrez m'apporter.

 

Quentin

 

EDIT : En fait, j'ai bien une solution qui fonctionnerait mieux, mais la question est de savoir si je suis sur la bonne voie.

Cette solution serait :

Nous sommes quoiqu'il en soit amené à surcharger le controller de l'admin que nous souhaitons modifier.

J'ajouterais donc une méthode du type : 'setMyModule' renvoyant NULL dans la class 'AdminController'. Il suffirait ensuite, dans l'extension de notre controller du type 'AdminWebserviceController' pour respecter l'exemple précédent, de renvoyer l'instance de mon module à la méthode 'setMyModule'. Je reste cependant obligé de surcharger la méthode 'renderForm' de 'AdminController' pour appeler ma méthode 'setMyModule' du type :

$helper->module = $this->setMyModule();
Edited by Quentin M (see edit history)
Link to comment
Share on other sites

  • 2 weeks later...

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