Jump to content

Override d'un controleur via modules et erreur "Cannot redeclare"


Recommended Posts

Bonjour,

 

J'ai besoin de votre bienveillance. Je me doute que la réponse doit être assez simple, mais j'ai un problème ! J'ai l'expérience sur prestashop 1.3, mais je suis inexpérimenté avec la surcharge des classes. Là je bosse sur la 1.5.

 

Un essayant de surcharger un controleur grâce à un module (perso), j'obtiens une erreur suivante lorsque j'installe le module :

 

Fatal error : Cannot redeclare AdminCmsCategoriesControllerOverrideOriginal::$cms_category in /.../htdocs/classes/module/Module.php(1860) : eval()'d code on line 16

 

J'essaie donc de surcharger le fichier suivant :

 

/controllers/admin/AdminCmsCategoriesController.php (nom de classe : AdminCmsCategoriesControllerCore)

 

Le but de l'exercice étant de pouvoir ajouter un champ aux catégories de pages CMS dans le backoffice.

 

Comme expliqué ici : http://doc.prestasho...fault+behaviors

 

In order to override the ProductController class, your file needs to be called ProductController.php and must feature aProductController class that the extends ProductControllerCore class.

The file can be placed in either of these locations:

  • /override/controllers/ProductController.php
  • /modules/my_module/override/controllers/ProductController.php

 

 

J'ai mon module avec le répertoire override :

 

/modules/monmodule/override/controllers/admin/AdminCmsCategoriesController.php

 

Voici le contenu de mon fichier :

 

class AdminCmsCategoriesController extends AdminCmsCategoriesControllerCore
{}

 

Dois-je renommer la classe équivalente qui se trouve dans /override/admin/ ? Si je le fait, le module ne s'installe pas pour autant car la fonction Module->addOverride() retourne false à la ligne 1855 (du fichier Module.php) :

 

if (!is_writable($override_path))

 

Qui teste si le fichier que je viens de renommer est bien là.

 

En d'autres mots, soit il ne trouve pas le fichier, soit s'il le trouve, il déclare 2 fois la classe...

 

Merci d'avance de votre aide

Edited by XIV-V (see edit history)
Link to comment
Share on other sites

Oui, à la base j'avais copié la classe mère, mais pour l'exemple j'ai tout supprimé, donc il utilise par défaut les fonctions de sa classe mère.

 

Le problème reste le même que je surcharge les fonctions ou non -> classe déjà déclarée.

Edited by XIV-V (see edit history)
Link to comment
Share on other sites

J'ai résolu mon problème, mais de manière peu maîtrisée.

 

En étudiant mieux ce que faisait la méthode Module::addOverride(), je me suis aperçu qu'il modifiait la class /override/controllers/admin/xxx.php en y ajoutant les méthodes de ma classe perso qui se trouve dans /modules/monmodule/override/admin/xxx.php

 

Et je pense qu'à la désinstallation aussi. Sauf que succédant les installs et désinstalls de mon module, j'ai dû créer des abérations, il ne désinstallait pas les méthodes qu'il avait installé, ce qui devait provoquer ce redéclare.

 

Dû coup j'ai restauré ma class /override/controllers/admin/xxx.php pour qu'elle soit à nouveau vide, et désormais l'install et la désinstall de mon module fonctionne bien (avec la surcharge qui va avec).

 

Ah les nuits de sommeil portent conseil :)

 

edit : euh, où est-ce que je peux changer le statut du topic ?

Edited by XIV-V (see edit history)
  • Like 2
Link to comment
Share on other sites

  • 1 month later...

Je n'ai pas supprimé de fichier. Ce que j'ai fait c'est que j'ai restauré le fichier qui se trouve dans override comme à l'origine, c'est à dire la déclaration de la classe sans le moindre attribut ni méthode.

 

Ceci, après avoir désinstallé le module.

Link to comment
Share on other sites

  • 5 months later...

Même problème ici. Le fichier original est bien vide cependant j'ai toujours cette erreur...

 

EDIT : J'ai trouvé la cause du problème. Je décris ici cela peut servir à d'autre.

 

Mon code d'installation ressemblait à qqch comme ca :

 


return parent::install() &&
	    $this->installOverrides() &&
	    $this->installDB();

 

Or il s'avère que "$this->installOverrides()" est déjà appelé par "parent::install()". Du coup la première fois il créer l'override correctement mais la 2eme il plantait car la classe existait déjà.

 

Voila.

Edited by wurzag (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...