Bonjour à tous, Je reviens encore une fois demander votre aide, car je n'arrive pas à comprendre pourquoi je ne peux pas accéder au contenu de mon objet request. Un bref historique, j'ai continué à développer mon MVC à partir du tuto MVC Grafikart, pour pouvoir uploader des modules. La partie backoffice fonctionne correctement. C'est le front qui ne marche pas. En gros, sur ma page j'ai bien l'objet request de ma page DashsController.php qui dispose des toutes les variables dont j'ai besoin. Mais si J'essaie de les appeler, les champs sont vides. [code] Request Object ( [url] => /fabien/dashs [page] => 1 [prefix] => admin [data] => [extensionData] => [mod] => [parent_menu] => [controller] => dashs [action] => index [params] => Array ( ) [modules] => Array ( [0] => stdClass Object ( [id] => 10 [module] => showcontent [position] => 13 ) [1] => stdClass Object ( [id] => 8 [module] => showcontent [position] => 13 ) ) ) [/code] Je pense en fait que je n'appelle pas le bon objet request. Si je fais un debug($this->request) dans mon controller de module, il ne me retourne rien, mais alors rien du tout !! En effet, chaque module que je charge sur la page du Dashs (ou autre) a son propre objet request. Du coup, je ne sais pas si le fait d'avoir 1 ou plusieurs fois le même objet request écrase les précédents. Si ce n'est pas le cas, comme puis-je accéder à l'objet request initial qui contient les données qui m'intéressent? Je cherche depuis hier et je n'arrive pas à récupérer ce fichu contenu !!! Si vous avez une idée, je suis preneur. Cordialement, Fabien
Salut,
J'ai suivi ta piste et j'ai modifié ça
$modulesController$k] = new $name$k]($this->request);
par ça
$modulesController$k] = new $name$k]($modules$k]);
Il ne me reste plus qu'à faire mes jointures de tables et je pense que ça devrait le faire.
Merci pour ton aide
Fabien
Bonjour,
Du coup, je ne sais pas si le fait d'avoir 1 ou plusieurs fois le même objet request écrase les précédents.
???
Tu peux expliquer un peu comment tu construits ces objets request et ou tu les stockes?
Bon alors je vais essayer d'expliquer, mais bon c'est pas gagné !!
J'ai créé une fonction loadModule dans mon dispatcher, qui est ensuite chargée dans ma fonction __construct du dispatcher (code ci-dessous).
var $request; // variable d'instance
function __construct() {
$this->request = new Request();
Router::parse($this->request->url, $this->request);
// on charge notre fonction controller pour récupérer les fchiers xxController à appeler
$controller = $this->loadController();
// on charge automatiquement toutes les methodes de la classe Controller
// on appelle la fonction qui correspond au nom de mon action dans mon controller
// ex. si dans l'url saisie est /pages/view/ dans notre controller PagesController on va appeler la fonction view(){}
// mais avant de tout récupérer, on va s'assurer que la fonction existe
// si l'action demandée n'est pas dans le tableau des controller, dans ce cas on renverra une rreur au lieu d'afficher la vue
// on va également éviter de retrouner le sméthodes de la classe parente c'est à dire du fichier Controller.php
// on est obligé de composer avec l'update de PHP 5.4 qui n'apprécie pas l'utilisation de string dans les index des array
$action] = $this->request->action;
if ($this->request->prefix) { // est-ce que j'ai un prefixe
$action[0] = $this->request->prefix . '_' . $action[0];
}
if (!in_array($action[0], array_diff(get_class_methods($controller), get_class_methods('Controller')))) {
$this->error("Le controller " . $this->request->controller . " n'a pas de methode " . $action[0] . " !");
}
call_user_func_array(array($controller, $action[0]), $this->request->params);
//debug($action);
// on fait pareil pour les modules, pour récupérer les controllers des modules
$moduleController = $this->loadModule();
//debug($moduleController[0]->modules);
// on va récupérer l'action de notre module
//$moduleAction = $this->request->modules->position;
//debug($this->request);
//debug($moduleController);
foreach ($this->request->modules as $k => $v) {
//debug($v);
$action[1]$k] = $v;
if ($this->request->prefix) {
// on vérifie en premier si on a un prefix
// puis on vérifie si une action a été passée
$action[1]$k]->action = (isset($this->request->action) && $this->request->action == 'index' || $this->request->action == 'view') ? 'admin_view' : 'admin_edit';
$action[1]$k]->controller = objectToArray($moduleController$k]->modules);
//debug(get_class_methods($action[1]$k]->controller));
//debug(get_class_methods('Controller'));
} else {
$action[1]$k]->action = 'view';
$action[1]$k]->controller = $moduleController$k]->modules;
}
$action[1]$k]->params = array();
// si notre méthode n'est pas dans le tableau des methodes de la classe parente, on envoie une erreur
$modController = objectToArray($action[1]$k]->controller);
//debug($modController);
$modAction = objectToArray($action[1]$k]->action);
//debug($modAction);
$var1 = array_diff(get_class_methods($modController), get_class_methods('Controller'));
//debug($var1);
if (!in_array($modAction, $var1)) {
$moduleController$k]->Session->setFlash("Le module " . $action[1]$k]->module . " n'a pas de methode " . $action[1]$k]->action . " !");
}
// on va vérifier si la classe est déjà chargée
//if (!class_exists($modController)) {
call_user_func_array(array($moduleController$k], $action[1]$k]->action), $action[1]$k]->params);
//}
}
//debug($action);
// on va lui demander de rendre la vue automatiquement
$controller->render($action);
//debug($controller);
}
function loadModule() {
// on va récupérer de façon automatique le nom du module
$modules = $this->request->modules;
// on ne fait tout ceci que si $modules !empty
//debug($modules);
if (!empty($modules)) {
$name = array();
$file = array();
foreach ($modules as $k => $v) {
//debug($v);
$name$k] = ucfirst($v->module) . 'Controller';
//debug($name$k]);
$file$k] = ROOT . DS . 'module' . DS . 'mod_' . $this->request->modules$k]->module . DS . $name$k] . '.php';
//debug($file);
// on inclue les fichiers une seule fois
if (!file_exists($file$k])) {
// dans ce cas on lance une erreur
$this->error("Le module " . 'mod_' . $this->request->modules$k]->module . " n'est pas disponible !");
}
include_once $file$k];
// je vais créer un nouvel objet
$modulesController$k] = new $name$k]();
$modulesController$k]->modules = $name$k];
}
// je vais renvoyer cet objet dans mon render pour pouvoir y accéder
//debug($modulesController);
return $modulesController;
}
}
Ensuite, c'est le controller qui prend le relai, et qui va vérifier si l'action qui est demandée est un admin_index ou admin_view
Comme ca, si le module est en mode édition, on récupère tout son contenu dans les helpers, et si il est en mode view on est censé récupérer les données de la bdd.
public function render($action) {
//debug($action);
// on vérifie si la vue a été rendue
if ($this->rendered) {
//return false;
}
extract(self::$vars); // les variables sont au même niveau que notre vue.
//debug(extract($this->mods));
### on vérifie en premier si on a à faire à une page de module
if ($this->request->controller == "modules") {
//debug('nous sommes dans un modules');
### si on est dans un module on va en premier lieu vérifier si on est en mode édition
if (isset($action[0]) && !empty($action[0]) && $action[0] == "admin_edit") {
//debug('nous sommes en mode edition');
### on charge alors le module et on le met en buffer
$view = ROOT . DS . 'module' . DS . 'mod_' . $action[1][0]->module . DS . 'view' . DS . $action[0] . '.php';
$moduleContainer = ROOT . DS . 'view' . DS . $this->request->controller . DS . $action[0] . '.php';
### on stock la vue dans le buffer
ob_start();
if (file_exists($view)) {
//debug("Nous chargeons la vue : $view");
require $view;
//debug(ob_end_flush());
### on envoie la vue dans le template du module
$layout_module = ob_get_clean();
} else {
$this->Session->setFlash("Le module que vous essayez de charger n'a pas de méthode $action[0] !", "error");
return false;
}
ob_start();
if (file_exists($moduleContainer)) {
//debug("Nous chargeons la vue : $moduleContainer");
require $moduleContainer;
//debug(ob_end_flush());
### on envoie la vue dans le template du module
$layout_mainbody = ob_get_clean();
} else {
$this->Session->setFlash("Le module que vous essayez de charger n'a pas de méthode $action[0] !", "error");
return false;
}
}
}
if (isset($action[0]) && !empty($action[0]) && $action[0] != "admin_edit") {
// on va vérifier en premier lieu si $view commence pas un "/", car dans ce cas, ca veut dire que c'est un dossier spécifique qu'il faut charger (ex. page d'erreur 404)
if (strpos($action[0], '/') === 0) {
$view = ROOT . DS . 'view' . $action[0] . '.php';
//debug($view);
} else {
$view = ROOT . DS . 'view' . DS . $this->request->controller . DS . $action[0] . '.php';
//debug($view);
}
ob_start();
//if (isset($view))
if (file_exists($view))
require $view;
//debug(ob_flush());
$layout_mainbody = ob_get_clean();
}
if (isset($action[1]) && !empty($action[1]) && isset($action[0]) && !empty($action[0]) && $action[0] != "admin_edit") {
// on transforme notre objet en array
$convert = objectToArray($action[1]);
//debug($convert);
// on va vérifier tous nos modules présents. mais on vérifie en premier qu'on envoie bien un tableau
if (is_array($convert)) {
$zone = array();
foreach ($convert as $k => $v) {
//debug($v);
$zone$k] = ROOT . DS . 'module' . DS . 'mod_' . $v'module'] . DS . 'view' . DS . $v'action'] . '.php';
ob_start();
require $zone$k];
// on vérifie si on est dans une extension
switch ($v'position']) {
case 0:
$layout_mainbody$k] = ob_get_clean();
break;
case 1:
$layout_top_a$k] = ob_get_clean();
break;
case 2:
$layout_top_b$k] = ob_get_clean();
break;
case 3:
$layout_top_c$k] = ob_get_clean();
break;
case 4:
$layout_top_d$k] = ob_get_clean();
break;
case 5 :
$layout_menu_a$k] = ob_get_clean();
break;
case 6 :
$layout_menu_b$k] = ob_get_clean();
break;
case 7 :
$layout_menu_c$k] = ob_get_clean();
break;
case 8 :
$layout_menu_d$k] = ob_get_clean();
break;
case 9 :
$layout_breadcrumb$k] = ob_get_clean();
break;
case 10 :
$layout_showcase_a$k] = ob_get_clean();
break;
case 11 :
$layout_showcase_b$k] = ob_get_clean();
break;
case 12 :
$layout_showcase_c$k] = ob_get_clean();
break;
case 13 :
$layout_showcase_d$k] = ob_get_clean();
break;
case 14 :
$layout_feature_a$k] = ob_get_clean();
break;
case 15 :
$layout_feature_b$k] = ob_get_clean();
break;
case 16 :
$layout_feature_c$k] = ob_get_clean();
break;
case 17 :
$layout_feature_d$k] = ob_get_clean();
break;
case 18 :
$layout_utility_a$k] = ob_get_clean();
break;
case 19 :
$layout_utility_b$k] = ob_get_clean();
break;
case 20 :
$layout_utility_c$k] = ob_get_clean();
break;
case 21 :
$layout_utility_d$k] = ob_get_clean();
break;
case 22 :
$layout_maintop_a$k] = ob_get_clean();
break;
case 23 :
$layout_maintop_b$k] = ob_get_clean();
break;
case 24 :
$layout_maintop_c$k] = ob_get_clean();
break;
case 25 :
$layout_maintop_d$k] = ob_get_clean();
break;
case 26 :
$layout_sidebar_a$k] = ob_get_clean();
break;
case 27 :
$layout_sidebar_b$k] = ob_get_clean();
break;
case 28 :
$layout_content_top_a$k] = ob_get_clean();
break;
case 29 :
$layout_content_top_b$k] = ob_get_clean();
break;
case 30 :
$layout_content_bottom_a$k] = ob_get_clean();
break;
case 31 :
$layout_content_bottom_b$k] = ob_get_clean();
break;
case 32 :
$layout_mainbottom_a$k] = ob_get_clean();
break;
case 33 :
$layout_mainbottom_b$k] = ob_get_clean();
break;
case 34 :
$layout_mainbottom_c$k] = ob_get_clean();
break;
case 35 :
$layout_mainbottom_d$k] = ob_get_clean();
break;
case 36 :
$layout_extension_a$k] = ob_get_clean();
break;
case 37 :
$layout_extension_b$k] = ob_get_clean();
break;
case 38 :
$layout_extension_c$k] = ob_get_clean();
break;
case 39 :
$layout_extension_d$k] = ob_get_clean();
break;
case 40 :
$layout_bottom_a$k] = ob_get_clean();
break;
case 41 :
$layout_bottom_b$k] = ob_get_clean();
break;
case 42 :
$layout_bottom_c$k] = ob_get_clean();
break;
case 43 :
$layout_bottom_d$k] = ob_get_clean();
break;
case 44 :
$layout_footer_a$k] = ob_get_clean();
break;
case 45 :
$layout_footer_b$k] = ob_get_clean();
break;
case 46 :
$layout_footer_c$k] = ob_get_clean();
break;
case 47 :
$layout_footer_d$k] = ob_get_clean();
break;
case 48 :
$layout_footer$k] = ob_get_clean();
break;
case 49 :
$layout_noposition$k] = ob_get_clean();
break;
}
}
//debug($zone);
}
}
// on appelle notre template
require ROOT . DS . 'view' . DS . 'layout' . DS . $this->layoutDirectory . DS . $this->layout . '.php';
// on oublie pas d'indiquer que la vue a été rendue
$this->rendered = true;
//debug($this->request);
}
Je ne sais pas si ces informations seront suffisantes !!
Merci pour ton aide
Comment tu as obtenu l'object Request affiché dans ton premier post. tu as placé le debug ou ?
Je l'ai placé sur mon controller DashsController.php
class DashsController extends Controller {
public $mod;
//put your code here
// ne fait que charger des modules
function admin_index() {
// on charge le model du module
$this->loadModel('Module');
// on va récupérer tous les modules qui nous concernent
$this->mod = $this->Module->find(array(
'fields' => 'id,module,position',
'conditions' => array(
'type' => 1,
'page' => 1,
'online' => 1
)
));
//debug($mod);
$this->request->modules = $this->mod;
debug($this->request);
}
}
ici ton $this fait réference au controller DashController et donc au Controller principal, si tu remplaces modules , tu remplaces le module du controller principale... je sais pas si ça répond à ta question
Je suis désolé, je n'ai pas compris ta réponse.
Si je comprends bien, le $this->request, dans mon DashsController fait référence à ma class DashsController.
Mais du coup, pour mes modules, je ne sais pas comment faire pour au lieu d'avoir un $this->request qui fasse référence à mon ShowmoduleController, j'obtienne un $this->request qui fasse appel à mon DashsController plutôt
Du coup, si tu peux me réexpliquer juste ce que je devrais modifier.
Merci
Fabien
Pourtant si, puisque je récupère bien dans mon controller l'ensemble de mes données.
C'ets le premier code que j'ai posté tout en haut, où il y a l'objet request
J'ai pas décrypter tout ton code mais:
Passe la reqûete du dispatcher ici:
$modulesController$k] = new $name$k]($this->request);
Cette requête là sera alors disponible dans $modulesController$k]
Dans ton code, je sais pas si l'objet request existe..
Si il n'existe pas, on devrait avoir une erreur quand tu accedes à request.. mais si il existe, il n'y a aucune raison pourqu'il soit nul une fois rajouté les modules...
place aussi une variables public $modules dans l'objet request, ça peut aussi venir de là le soucis
Salut,
Désolé je n'ai pas pu tester plus tôt ta solution.
Comme tu le pensais, j'ai bien une erreur quand je veux accéder à l'objet request.
Mais en faisant comme ca du coup plus rien dans mon code ne fonctionne.
Je vais creuser ce que tu me dis et essayer de trouver une solution.
Je te tiens au courant.
Merci
Coucou,
Je reviens demander ton aide car j'ai nouveau problème
Maintenant, j'ai bien le contenu de mes tables de disponible dans mon objet request.
J'ai également modifié ma méthode find() pour ajouter des jointures de tables.
Jusque là tout est ok.
Le problème, c'est lorsque j'ai deux modules qui font appel à la même vue. (je précise que le deuxième module est une copie du premier, mais avec des données différentes en base, mais tous deux appellent la même vue => admin_view.php)
Du coup, lorsque je fais mes boucles pour charger mes modules, tout se passe bien, sauf que les deux modules affichent la même chose.
J'ai regardé ce qui était mis dans le buffer, dans le doute, et bien les deux modules ont la même info, alors que leurs objets request sont différents.
Du coup, je bloque pas mal, car je ne comprends pas pourquoi le deuxième module ne récupère pas les informations qui lui sont propres.
D'ailleurs, quand je regarde de plus près, le premier module m'affiche les informations du deuxième module !! encore plus étrange !!
Merci pour ton aide.
Fabien