Bonsoir,
Alors Grafikart met les données récupérez dans une variable data du request pour l'utilisé dans le helpers Form et bien moi au niveau du helpers elle est vide.
Voici mon code de admin_edit
function admin_edit($id = null) {
$this->loadModel('Post');
if($id) {
$this->request->data = $this->Post->findFirst(array(
'conditions' => array('id' => $id)
));
//debug($this->request);
}
}
Et mon code du helper
public $controller;
public function __construct($controller) {
$this->controller = $controller;
debug($this->controller->request);
}
Au niveau de admin_edit data est bien rempli par un objet et dans le helper j'ai un tableau array vide.
Savez-vous d'ou cela pourrez venir?
Merci d'avance...
C'est bon j'ai trouvé en faites dans le constructeur data est forcément vide vu que la fonction admin_edit qui remplit data est chargé après le constructeur du form en fesant un debug dans ma fonction input et ben data est bien remplit.
Merci Grafikart et bonne continuation ++
Oui tiens voilà ma fonction construct de controller.php
public function __construct($request = null) {
$this->Session = new Session();
$this->Form = new Form($this);
$this->Html = new Html();
if($request) {
$this->request = $request;
}
require APP.DS.'config'.DS.'hook.php';
}
Et j'ai bien mit public $data dans le request
Essaie d'envoyer le request avant le new Form:
if($request) {
$this->request = $request;
}
$this->Session = new Session();
$this->Form = new Form($this);
$this->Html = new Html();
Non toujours pas voilà mon debug dans le construct du form [code]Request Object ( [url] => /admin/posts/edit/3 [page] => 1 [prefix] => admin [data] => Array ( ) [controller] => posts [action] => edit [params] => Array ( [0] => 3 ) )[/code]
Ben oui mais je vois pas du tout d'ou viens le problème car j'ai fait comme dans ton tuto Voici le debug dans mon controller juste après la mise des data [code]Request Object ( [url] => /admin/posts/edit/3 [page] => 1 [prefix] => admin [data] => stdClass Object ( [id] => 3 [title] => Mon titre [contenu] => test [online] => 0 [slug] => mon-titre [category_id] => [user_id] => 1 [created_at] => [modified_at] => ) [controller] => posts [action] => edit [params] => Array ( [0] => 3 ) )[/code] Ca pourrait venir de quoi à ton avis?
Celui ci: [code]Request Object ( [url] => /admin/posts/edit/3 [page] => 1 [prefix] => admin [data] => Array ( ) [controller] => posts [action] => edit [params] => Array ( [0] => 3 ) )[/code] Est dans le constructeur du form Et celui là: [code]Request Object ( [url] => /admin/posts/edit/3 [page] => 1 [prefix] => admin [data] => stdClass Object ( [id] => 3 [title] => Mon titre [contenu] => test [online] => 0 [slug] => mon-titre [category_id] => [user_id] => 1 [created_at] => [modified_at] => ) [controller] => posts [action] => edit [params] => Array ( [0] => 3 ) )[/code] Dans l'action admin_edit de mon controller
J'ai resoulu mon problème mais voici mes classes.
Mon dispatcher:
class Dispatcher {
var $request;
function __construct() {
$this->request = new Request();
Router::parse($this->request->url, $this->request);
$c = $this->loadController();
$a = $this->request->action;
if($this->request->prefix) {
$a = $this->request->prefix.'_'.$a;
}
if(!in_array($a, array_diff(get_class_methods($c), get_class_methods('Controller')))) {
$this->error('Le controller '.$this->request->controller.' n\'a pas de méthode '.$a);
}
call_user_func_array(array($c, $a), $this->request->params);
$c->render($a);
}
function error($e) {
$c = new Controller($this->request);
$c->Session = new Session();
$c->Html = new Html();
$c->e404($e);
}
function loadController() {
$name = ucfirst($this->request->controller).'Controller';
$file = APP.DS.'controllers'.DS.$name.'.php';
require $file;
return new $name($this->request);
}
}
Mon request:
class Request {
public $url;
public $page = 1;
public $prefix = false;
public $data = false;
public $file = false;
public function __construct() {
$this->url = $_SERVER'PATH_INFO'];
if(isset($_GET'page']) && is_numeric($_GET'page']) && $_GET'page'] > 0) {
$this->page = round($_GET'page']);
}
if(!empty($_POST)) {
$this->data = $_POST;
}
if(!empty($_FILES)) {
$this->file = $_FILES;
}
}
}
Et ma classe form:
class Form {
public $controller;
public function __construct($controller) {
$this->controller = $controller;
}
/*
* Fonction pour ouvrir un formulaire
*
* @params $url
* @params $opt array optionnal
*
* @return html code
*/
public function open($url, $opt = array()) {
if(empty($opt'method'])) {
$method = 'POST';
} else {
$method = $otp'method'];
}
$h = '<form action="'.$url.'" method="'.$method.'">'."\n";
return $h;
}
/*
* Fonction pour fermer un formulaire
*
* echo $this->Form->close(array(
0 => array(
'type' => 'submit',
'value' => 'Envoyer',
'class' => 'btn primary'
),
1 => array(
'type' => 'reset',
'value' => 'Effacer',
'class' => 'btn danger'
)
* ));
*
* @params $btn array optionnal
*
* @return html code
*/
public function close($btn = array()) {
$b = '';
if(isset($btn)) {
$b .= '<div class=?"actions">'."\n";
foreach($btn as $value) {
$b .= '<input type="'.$value'type'].'" class="'.$value'class'].'" value="'.$value'value'].'">'."\n";
}
$b .= '</div>'."\n";
}
$h = $b.'</form>'."\n";
return $h;
}
/*
* Création de input
*
* @params $name
* @params $label optionnal
* @params $opt array optionnal
*
* @return html code
*/
public function input($name, $label, $opt = array()) {
$h = '<div class="clearfix">'."\n";
$attr = '';
if(!empty($opt)) {
foreach($opt as $k => $v) {
$attr .= $k.'="'.$v.'" ';
}
}
if(!empty($label)) {
$h .= '<label for="'.$name.'">'.$label.'</label>'."\n";
}
$h .= '<div class="input">'."\n";
if($opt'type'] == 'password') {
$h .= '<input type="password" name="'.$name.'" id="'.$name.'" value="" '.$attr.'>'."\n";
} elseif($opt'type'] == 'file') {
$h .= '<input type="file" name="'.$name.'" id="'.$name.'" value="" '.$attr.'>'."\n";
} elseif($opt'type'] == 'hidden') {
$h .= '<input type="hidden" name="'.$name.'" id="'.$name.'" value="" '.$attr.'>'."\n";
} elseif($opt'type'] == 'textarea') {
$h .= '<textarea name="'.$name.'" id="'.$name.'" '.$attr.'></textarea>'."\n";
} elseif($opt'type'] == 'radio') {
} elseif($opt'type'] == 'checkbox') {
} else {
$h .= '<input type="text" name="'.$name.'" id="'.$name.'" value="'.$this->controller->request->data->$name.'" '.$attr.'>'."\n";
}
$h .= '</div></div>'."\n";
return $h;
}
}