Jump to content

Etendre une classe AdminXxxController pas prévu ?


Recommended Posts

Hello,

 

J'ai essayé d'être le plus complet possible, j'espère que vous prendrez le temps de lire malgré tout, car il y a là qqch de vraiment étrange au niveau actuel de mon savoir.

 

J'essaie d'étendre la page détail d'une catégorie CMS pour y ajouter quelques champs. Dans le backoffice elle se trouve à cet endroit (attention à l'id 2, si vous n'en avez pas..):

 

/administrator/index.php?controller=admincmscontent&id_cms_category=2&updatecms_category

 

Voici les classes en question :

  • AdminController (classe grand mère)
  • AdminCmsCategoriesControllerCore (classe mère)
  • AdminCmsCategoriesController (classe fille)

Donc là je tente de surcharger la fonction AdminCmsCategoriesControllerCore::renderForm(). Cette méthode comporte un tableau avec les champs à afficher dans son interface en backoffice :

 

$this->fields_form = array(....);

 

 

A la fin de sa fonction renderForm(), elle a une ligne

return parent::renderForm();

 

Celle ci appelle AdminController::renderForm() de la classe grand mère si l'on peut dire.

 

Le problème

 

Le problème vient dans ma fonction de surcharge : /override/controllers/admin/AdminCmsCategoriesController.php -> fonction renderForm(). Si je veux ajouter des champs, je récrit le tableau qui comporte les champs (vu ci-dessus)

 

$this->fields_form = array(....);

 

Mais à un moment il faut bien appeler la classe mère AdminCmsCategoriesControllerCore::renderForm(). Celle ci récrit ce tableau sans tenir compte de s'il existe déjà ou non et s'il a des éléments à l'intérieur.

 

Par conséquent, mes champs ajoutés sont ignorés.

 

J'en déduis deux choses :

  1. Les controleurs admins ne sont pas overridables. Est-ce un oubli de prestashop ou est-ce que je n'ai pas compris la démarche ?
  2. Il faut éviter d'appeler la classe mère (AdminCmsCategoriesControllerCore) (qui écrase le tableau) et la by passer en appelant directement la grand mère (AdminController::renderForm) avec qqch comme ca :

$par = get_parent_class($this);
$gdParent = get_parent_class($par);
return $gdParent::renderForm();

 

Au lieu de :

return parent::renderForm();

 

La 2e possibilité marche (appeler la classe grand mère directement), mais ca ne me semble pas très propre et un peu contraire au lois de l'orienté objet.

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

Ce n'est pas spécifique aux AdminXXXController, tu auras le même problème avec les autres Controllers ou d'autres classes reposant sur le même principe d'héritage.

 

J'utilise ta 2e possibilité :

return $gdParent::renderForm();

 

Ce n'est peut être pas le plus propre, mais ça l'est plus que de faire un copier coller du code.

Link to comment
Share on other sites

L'appel au grand parent oblige de reproduire (copier coller) le code de la mère dans la fille, puisque la fille ne fait plus appel à la mère..

 

On est d'accord ? A moins que tu voie les choses autrement, et là tu m'intéresse.

 

La première méthode consiste en fait a écrire dans le coeur... et ça on est bien d'accord que c'est beurk !

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