Bonjour à tous,
Encore une fois je sollicite votre aide.
J'ai pas mal avancé sur mon CMS custom.
Mes modules s'affichent où il faut sans causer de soucis.
Néanmoins j'ai une question ?
Certains de mes modules nécessitent des Helpers biens spécifiques.
Je n'ai pas envie d'avoir ma classe Form() complètement polluée de nouveaux champs, dans tous les sens.
Du coup je me pose la question. Est-il possible de faire un entends de la classe Form()?
Bon, en fait je pose la question, mais j'ai quand même essayé ! :)
J'ai ajouté un moduleHelper dans mes modules.
J'ai créé une classe loadModuleHelper dans mon Controller.php :
public function loadModuleHelper($name) {
$file = ROOT . DS . 'module' . DS . 'mod_' . strtolower(substr($name, 0, -6)) . DS . ucfirst($name) . '.php';
require_once $file; // on évite d'inclure plusieurs fois le même model
//debug($name);
if (!isset($this->$name)) {
$this->$name = new $name();
// on va également envoyer dans le loadmodel le formulaire
if (isset($this->Form)) {
$this->$name->Form = $this->Form;
}
}
}
J'ai fait un moduleHelper extends Form
class ShowcontentHelper extends Form {
//put your code here
public function __construct() {
parent::__construct($this);
}
public function input($name, $label, $option = array(), $required = false) {
debug($name);
}
}
Mais si je veux accéder aux propriétés de mon Helper quand je suis dans ma vue, du coup j'ai une erreur.
En gros, il me dit que le controller principal n'a pas la propriété moduleHelper.
<?php debug($this->ShowcontentHelper); ?>
Erreur : Notice: Undefined property: ModulesController::$ShowcontentHelper in /Applications/MAMP/htdocs/aaaaa/module/mod_showcontent/view/admin_edit.php on line 10
La fonction de Debug me montre que mon script Helper est bien chargé pourtant.
Comment puis-je faire en sorte que mon Controller principal récupère également les propriétés de ma classe fille ?
Si vous pouvez me mettre sur la piste je suis preneur. A chaque fois je réussi à me démerder tout seul après.
Fabien
Salut,
Alors j'ai cherché (enfin on m'a un peu aidé quand même), mais voila le résultat, si au lieu de charger mon helper dans mon mondule secondaire, et bien je le charge dans le module principale, alors j'accède aux methodes de mon helper fille.
Je ne dis pas que cette solution est pérenne, mais elle fonctionne.
Je te dirai si je rencontre des soucis dans mes prochaines évolutions.
Un grand merci pour ton aide, qui m'a expliqué un peu mieux ce qu'est la POO.
Fabien
Salut,
if (!isset($this->$name)) {
$this->$name = new $name();
// on va également envoyer dans le loadmodel le formulaire
if (isset($this->Form)) {
$this->$name->Form = $this->Form;
}
}
Imaginons avec ce code que $name = "monHelper".
On aurait
$this->monHelper = new monHelper();
Comment tu assignes une variable à ton objet si elle n'est pas prédéfinie avant ?
Est-ce que dans les variables de ta classe, t'as un
private $monHelper = null; ?
Plutôt que de faire un $this->name, tu devrais avoir une variable array contenant une liste de helper.
Genre
class MonControlleur{
private $mes_helpers = array();
public function loadModuleHelper($name) {
$file = ROOT . DS . 'module' . DS . 'mod_' . strtolower(substr($name, 0, -6)) . DS . ucfirst($name) . '.php';
require_once $file; // on évite d'inclure plusieurs fois le même model
//debug($name);
if (!array_key_exists($name, $this->mes_helpers)) {
$this->meshelpers$name] = new $name();
// on va également envoyer dans le loadmodel le formulaire
if (isset($this->Form)) {
$this->meshelpers$name]->Form = $this->Form;
}
}
}
}
Ça te corrigerait le problème ?
Bisous !
Salut,
Je n'avais pas pensé à utiliser des array pour gérer cela.
Je vais essayer ce que tu me dis, je te tiens au courant !!
Fabien
Salut,
Bon alors je viens d'implémenter ce que tu m'as proposé, mais j'ai peur de ne pas comprendre.
Dans mon code, lorsque je fais ça :
$this->$name = new $name();
en toute logique je créé mon objet.
ex. si $name='monHelper'; , je dois pouvoir appeler l'objet $this->monHelper ?
Donc depuis n'importe où dans mon code, je dois pouvoir accéder aux methodes de l'objet $this->monHelper, si le fichier .php qui le concerne est chargé correctement?
Du coup, j'ai du mal à comprendre ce que tu me proposes. Pourquoi passer par un array des helpers autorisés? En effet, il faudra qu'à chaque fois que je créé un helper que j'aille alimenter cet array ?
D'ailleurs, je regarde un peu plus près mes controllers, et si je fais ça dan smon controller de module:
debug($this->ShowcontentHelper);
Je vois tous le contenu stocké pour mon controller.
Par contre, si je fais ça dans ma vue :
debug($this->ShowcontentHelper);
Il cherche à accéder au controller de mon module principal.
Ce n'est sans doute pas super clair, alors j'apporte quelques précisions:
En gros, sur ma page d'édition de mes modules, je vais avoir par exemple
ModulesController et ShowcontentController qui vont se charger en même temps.
Du coup, mon objet
$this->$name = new $name();
est associé à ModulesController au lieu d"être associé à ShowcontentController
Je vais continuer à creuser, pour faire en sorte que tous mes helpers qui sont chargés avec mes modules soient associés à ces mêmes modules.
Fabien
Salut,
Imaginons une classe Voiture
public class Voiture{}
Cette classe voiture a un moteur
public class Voiture{
private $moteur = "";
}
Tu veux faire rouler ta classe Voiture.
public class Voiture{
private $moteur = "";
public function roule(){
$this->roues = new Roues();
$this->roues->rouler();
}
}
Le souci, c'est que tu n'as pas de roue, donc ça ne peut pas marcher.
Pour faire rouler ta voiture, tu dois lui donner des roues.
public class Voiture{
private $moteur = "";
private $roues = null;
public function roule(){
$this->roues = new Roues();
$this->roues->rouler();
}
}
Tu vois l'idée ?
Je pars du principe d'utiliser un tableau à remplir car tu ne connais pas à l'avance le nom du helper que tu vas appeler.
Ton tableau, défini dans les variables de ta classe pourra être rempli de n'importe quel type d'helper peu importe leur nom.
Bisous
J'adore l'exemple !!
Donc si je suis cet exemple, ma class Voiture correspond à ma class Form
Dans ce cas, le load de mes Helpers doit se faire dans la class Form et non dans ma class Controller principal?
Ainsi, tous mes paramètres sont sensés être accessibles?
Néanmoins, cela ne change pas mon problème, puisque si je fais cela, mon nouveau Helper reste associé au module principale, et non au module secondaire. et j'ai besoin qu'il soit associé au module secondaire.
je vais méditer sur ton exemple, il est limpide. J'espère trouver la solution tout seul.
Merci bien
Salut,
Dans mon exemple, ma classe Voiture correspond à ta classe Controller.
Ce qui ne va pas c'est que tu fais un $this->$name comme moi quand je faisais un $this->roues avant d'avoir ajouté la ligne private $roues = null;
Bisous