Développer un site - Jour 5

Par lexis parker, il y a 7 ans


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

Lartak, il y a 7 ans

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.

Lartak, il y a 7 ans

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.

lexis parker, il y a 7 ans

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

Lartak, il y a 7 ans

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.

lexis parker, il y a 7 ans

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

lexis parker, il y a 7 ans

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

Carouge10, il y a 7 ans

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

Carouge10, il y a 7 ans

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

Router::prefix('cockpit', 'admin');
lexis parker, il y a 7 ans

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)); } } ?>
Carouge10, il y a 7 ans

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 ? }
lexis parker, il y a 7 ans

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

lexis parker, il y a 7 ans

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

lexis parker, il y a 7 ans

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

Carouge10, il y a 7 ans

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)

lexis parker, il y a 7 ans

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

Carouge10, il y a 7 ans

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

lexis parker, il y a 7 ans

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>
Carouge10, il y a 7 ans

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

lexis parker, il y a 7 ans

non (: !!!

Carouge10, il y a 7 ans

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)") ?
Lartak, il y a 7 ans

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, il y a 7 ans

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.

Carouge10, il y a 7 ans

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

Lartak, il y a 7 ans

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