Bonjour ou bonsoir,
Voila je rencontre un petit problème avec mon code.
je n'arrive pas a edit des articles qui se trouve en basse de donne
les champs de mon formulaire son vide

Décrivez ici votre code ou ce que vous cherchez à faire
admin_edit.php

<div class="page-header">
    <h1>Editer un article</h1>
</div>
<form action="<?php echo Router::url('admin/posts/edit');?>" method="post">
    <?php echo $this->Form->input('name','Titre'); ?>
    <?php echo $this->Form->input('slug','Url'); ?>
    <?php echo $this->Form->input('id','hidden'); ?>
    <?php echo $this->Form->input('content','Contenu',array('type'=>'textarea','class'=>'xxlarge','rows'=>8)); ?>
    <?php echo $this->Form->input('online','En ligne',array('type'=>'checkbox'));?>
    <div class="actions">
        <input type="submit" class="btn primary" value="Envoyer">
    </div>
</form>

PostsController.php

<?php 
class PostsController extends Controller{

    function index(){
        $perPage = 10;
        $this->loadModel('Post');
        $condition = array('online' => 1,'type'=>'post');
        $d['posts'] = $this->Post->find(array(
            'conditions' => $condition,
            'limit' => ($perPage*($this->request->page-1)).','.$perPage
        ));
        $d['total'] = $this->Post->findCount($condition);
        $d['page'] = ceil($d['total'] / $perPage);
        $this->set($d);
    }

    function view($id,$slug){

        $this->loadModel('Post');
        $d['post'] = $this->Post->findFirst(array(
            'fields'     => 'id,slug,content,name',
            'conditions' => array('online' => 1,'id'=>$id,'type'=>'post')
        ));
        if(empty($d['post'])){
            $this->e404('Page introuvable');
        }
        if($slug != $d['post']->slug){
            $this->redirect("posts/view/id:$id/slug:".$d['post']->slug,301);
        }
        $this->set($d); 
    }
    function admin_index(){
        $perPage = 10;
        $this->loadModel('Post');
        $condition = array('type'=>'post');
        $d['posts'] = $this->Post->find(array(
            'fields' => 'id,name,online',
            'conditions' => $condition,
            'limit' => ($perPage*($this->request->page-1)).','.$perPage
        ));
        $d['total'] = $this->Post->findCount($condition);
        $d['page'] = ceil($d['total'] / $perPage);
        $this->set($d);
    }

    function admin_edit($id = null){
        $this->loadModel('Post');
        if($this->request->data){

            $this->Post->save($this->request->data);
            $this->Session->setFlash('Le contenu a bien été modifié');
            $id = $this->Post->id;
        }
        if($id){
            $this->request->data = $this->Post->findFirst(array(
                'conditions' => array('id'=>$id)
            ));
            #$d['id'] = $id;
        }
        #$this->set($d);    
    }

    function admin_delete($id){
        $this->loadModel('Post');
        $this->Post->delete($id);
        $this->Session->setFlash('Le contenu a bien été suprimé');
        $this->redirect('admin/posts/index');
    }
}
?>

Ce que je veux

edite les articles de ma base de donne

Ce que j'obtiens

un formulaire vide :(

24 réponses


Bonjour.
Il nous faudrait déja connaître sur quelle url tu te trouves, car dans ta fonction tu as deux cas, la création d'un nouvel enregistrement et celui d'édition d'un enregistrement existant.
Si tu te trouves dans le premier cas et donc avec une url sans l'ID de l'enregistrement, c'est plutôt normal que tu n'aies aucune valeur préremplie dans le formulaire.

salut pour ta reponse si rapide boss , je suis sur localhost/Tuto/Site/posts/edit/4

Dans ce cas là, il n'y aurait pas un problème concernant l'url ?
Car si je me rappelle bien, dans le tutoriel, les fonctions avec le prefix admin ne sont censées être accessibles que via un prefix dans l'url du type admin ou autre.
Sauf que là dans l'url tu nous en indique une de type publique.

Stp boss en langage plus simple je suis perdu je ne sais quoi faire

Ce que je disais, c'est que normalement tu devrais plutôt avoir une url du type : localhost/Tuto/Site/admin/posts/edit/4 au lieu de localhost/Tuto/Site/posts/edit/4.

Merci une foi de plus pour ta reponse si rapide Mr Lartak l'url dont je voudrai edite es
localhost/Tuto/Site/cockpit/posts/edit/4

Bonsoir,
Ta méthode admin_edit($id) devrait se trouver dans le Controller "AdminPostsController", non ?

bonsoir Carouge10 je n'ai vu nul par sur le tuto jour 5 cela aide moi
Controller.php

<?php 
class Controller{

    public $request;

    private $vars = array();

    public $layout = 'default';
    private $rendered = false;

    function __construct($request = null){

        if($request){
            $this->request = $request;          
        }
        require ROOT.DS.'config'.DS.'hook.php';
    }

    public function render($view){

        if($this->rendered){return false;} 

        extract($this->vars);
        if(strpos($view,'/')===0){
            $view = ROOT.DS.'view'.$view.'.php';
        }else{

            $view = ROOT.DS.'view'.DS.$this->request->controller.DS.$view.'.php';
        }

        ob_start();
        require ($view);
        $content_for_layout = ob_get_clean();
        require ROOT.DS.'view'.DS.'layout'.DS.$this->layout.'.php';

        $this->rendered = true;
    }

    public function set($key,$value=null){

        if(is_array($key)){
            $this->vars += $key;
        }else{

        $this->vars[$key] = $value;
        }
    }

    function loadModel($name){

        $file = ROOT.DS.'model'.DS.$name.'.php';
        require_once($file);
        if(!isset($this->$name)){
            $this->$name = new $name(); 
        }
    } 

    function e404($message){
        header("HTTP/1.0 404 Not Found");
        $this->set('message',$message);
        $this->render('/errors/404');
        die();
    }

    function request($controller,$action){
        $controller .= 'Controller';
        require_once ROOT.DS.'controller'.DS.$controller.'.php';
        $c = new $controller();
        return $c->$action();
    }

    function redirect($url,$code = null){
        if($code == 301){
            header("HTTP/1.1 301 Moved Permanently");
        }
        header("Location:".Router::url($url));
    }
}
?>

Exact, il doit le faire plus tard.

Pourquoi tu as les dernières ligne de commenté ?

function admin_edit($id = null){
        $this->loadModel('Post');
        if($this->request->data){

            $this->Post->save($this->request->data);
            $this->Session->setFlash('Le contenu a bien été modifié');
            $id = $this->Post->id;
        }
        if($id){
            $this->request->data = $this->Post->findFirst(array(
                'conditions' => array('id'=>$id)
            ));
            #$d['id'] = $id; // Pourquoi ce dièse devant ?
        }
        #$this->set($d);    // Pourquoi ce dièse devant ?
    }

Carouge10 j' ai mis en commentaire et j'ai oublie merci beacoup boss

je vien de test mon code mais le probleme n'es toujour pas resolu

lorsque je fait inspetion comme sur le tuto jour 5 a la 58minut 44' je n'ai pas id en parametre j'ai ceci

<form action="/Tuto/Site/cockpit/posts/edit"method="post">....</form>

pas id en parametre comme sur la video et mes champs son vide

l'id est en champ hiddent pour sauvegarder l'édition.
Qu'elle est le "href" du bouton te permettant de demander l'édition ? (la page listant tes posts)

je ne pas de href sur la page "admin_edit.php "a vrai dire boss je sais pas ou alle regle le probleme

sur la page admin_index, la où tu listes tout tes posts

mon code admin_index

<div class="page-header">
    <h1><?php echo $total ?>  Articles</h1>
</div>
<table>
    <thead>
        <tr>
            <th>ID</th>
            <th>Titre</th>
            <th>Actions</th>
        </tr>
    </thead>
    <tbody>
        <?php foreach ($posts as $k => $v):?>
            <tr>
                <td><?php echo $v->id; ?></td>
                <td><?php echo $v->name; ?></td>
                <td>
                    <a href="<?php echo Router::url('admin/posts/edit/'.$v->id); ?>">Editer</a>
                    <a onclick="return confirm('Voulez vous vraiment suprimer ce contenu');"href="<?php echo Router::url('admin/posts/delete/'.$v->id); ?>">Suprimer</a>
                </td>
            </tr>
        <?php endforeach; ?>
    </tbody>
</table>

quand tu inspectes ce code, tu retrouves bien l'id sur chaque lien ?

non (: !!!

Donc l'erreur viens d'avant

  • As-tu activé les erreurs PDO ?
  • Que donne un var_dump($d) juste avant d'envoyer $d à la vu ("$this->set($d)") ?

je voudrai edite es localhost/Tuto/Site/cockpit/posts/edit/4

Dans ce cas là, il te faut aller sur l'url dont tu parles, sauf que dans ton message il n'y avait pas le prefix cockpit.
Par contre, dans le tutoriel, il y a l'id dans l'url de l'attribut action, sauf que toi tu ne le met pas.
Dans l'action du controller il instancie la valeur de $d['id'] avec une chaîne de caractère vide au tout début, pour que la variable soit quand même disponible dans la vue dans le cas d'un nouvel enregistrement.
Par contre ce que je ne comprends pas, c'est que dans toutes les url dans ton code concernant l'administration, tu les prefixe avec admin et toi tu dis que tu veux accéder à l'url avec le prefixe cockpit, il faudrait peut-être que ce que tu souhaites soit en adéquation avec ce que tu mets dans ton code.

@Lartak, le tutoriel utilise se préfixe avec un préfix avec le rooter

Router::prefix('cockpit', 'admin');

Je le sais bien ça, mais s'il veut accéder à une url avec cockpit comme prefix, il faut bien que dans les url de ces liens et formulaires qu'il définisse le prefix cockpit et non le prefix admin.
Par exemple, c'est comme s'il voulait aller dans une ville en particulier et que dans son GPS il en indique une autre, il ne pourra jamais y arriver.

Non, c'est le router qui fera la transition.
L'un de mes sites est fait avec ce tutoriel et à aucun moment je mets "cockpit" dans le code

En effet, je retire ce que j'ai dit alors.