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

14 réponses


djtec
Auteur
Réponse acceptée

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

Tu as bien initialiser l'helper en lui injectant le controller ?

djtec
Auteur

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();
djtec
Auteur

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 là ce n'est pas bon ?

djtec
Auteur

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?

Je ne comprend pas le problème tu dis que data est vide mais là je vois bien des données.

djtec
Auteur

Dans mon postcontroller il est plein mais dans le form.php il est vide

djtec
Auteur

Personnes à une idée????

Tu le debug ou le request data dans ton form ?

djtec
Auteur

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

Mmmh bizarre tu peux copier ta class Form, ton dispatcher et enfin ton request ?

djtec
Auteur

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;
    }

}