XIV-V Posted September 3, 2012 Share Posted September 3, 2012 (edited) 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 : 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 ? 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 September 3, 2012 by XIV-V (see edit history) Link to comment Share on other sites More sharing options...
Garnaud Posted September 3, 2012 Share Posted September 3, 2012 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 More sharing options...
XIV-V Posted September 4, 2012 Author Share Posted September 4, 2012 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now