Bonjour
je suis entrain de faire un petit site avec cakephp avec un système de membre,
un membre peut publier un évènement, après il peut l’éditer ou le supprimer, mon problème c'est que quand un membre fait une publication un autre membre dès qu'il se connecte peut le supprimé, je ne sais pas comment empêcher ça, j'aimerais juste que seul le membre qui a publié l'évènement aie la possibilité de le supprimer, j'ai jeté un coup sur le book de cake par rapport à l'autorisation, j'avoue que j'ai pas compris grande, si quelqu'un a une idée dessus et peut m’éclairer je serai ravi.merci
voici mon code de ma fonction delete.
public function delete($id) {
$this->loadModel('User');
$evenement=$this->Event->find('all');
$user_auth=$this->Auth->User('id');
$user=$this->Event->user;
if($user=$this->Auth->User('id')){
$this->Event->id=$id;
$file=$this->Event->Field('event','content','filename');
unlink(IMAGES.uploads.DS.$file);
$this->Event->delete($id);
$this->redirect($this->referer());
}
else{
$this->redirect($this->referer());
}
}
Si tu fais la suppression en GET et non en POST, il te suffit par exemple de faire comme ça :
$event = $this->Event->findById($id);
if ($this->Auth->user('id') == $event'Event']'user_id']) {
if ($this->Event->delete($event'Event']'id'])) {
$this->Session->setFlash("L'événement a bien été supprimé");
return $this->redirect(array('action' => 'index'));
}
}
return $this->redirect($this->referer());
$this->Event->user_id , ça n'existe pas dans le cas présent.
Je suppose que ton Event a un user_id dans sa table. Il te faut vérifier que l'id de l'utilisateur correspond bien à ce user_id.
oui user_id =$this->Auth->user('id') mais mon problème c'est à ce niveau l'id de l'utilisateur c'est aussi $this->Auth->user('id') oubien?
Bonjour.
oui user_id =$this->Auth->user('id') mais mon problème c'est à ce niveau l'id de l'utilisateur c'est aussi $this->Auth->user('id') oubien?
Non, $this->Auth->user('id') c'est l'ID en session de l'utilisateur, il te faut vérifier que sa corresponde bien avec le champ de liaison dans ta table events , user_id par exemple (selon comment tu l'as nommé).
Alors pour commencer, ne donnes la possibilité du lien d'édition et de suppression, que si l'utilisateur est celui qui a publié l'événement.
Ensuite, dans ta fonction de suppression (delete), au lieu de faire un find('all') , fais soit un findById($id) ou un find('first') , car je ne vois pas du tout l'intérêt de faire un find('all') pour la suppression d'un seul enregistrement.
Pour terminer, une fois que tu as fait ça, tu vérifies suite à ta requête, que la valeur user_id retournée correspond bien à l' id de la session, par exemple avec $this->Session->read('Auth.User.id').
Un petit conseil, pour sécuriser encore plus la suppression, passes la en POST et lors de l'appel à la fonction delete , tu vérifies que c'est bien une requête POST et non GET.
Il est facile de créer un formulaire pour un lien, avec $this->Form->postLink.
Il faudra que tu expliques aussi pourquoi tu charges le modèle User, alors que tu n'y fait aucun traitement dans cette table pour la suppression.
merci pour ta réponse Lartak11, stp dit comment je peux donner la possibilité du lien d'édition et de suppression que à l'utilisateur qui a publié l'événement?
meric
Sur la page d'affichage de l'événement, tu peux faire quelque chose comme ça :
<?php if ($this->Session->read('Auth.User.id') == $event'Event']'user_id']) {
echo $this->Html->link('Edit', array('action' => 'edit', $event'Event']'id']));
echo $this->Form->postLink('Supprimer', array('action' => 'delete', $event'Event']'id']), array('class' => 'delete'), 'Voulez vous vraiment supprimer l\'événement ?');
} ?>
ok merci beaucoup j'ai encore une question,quand je fais find('first') par exemple pour avoir le user_id ce n'est pas $user_id=$this->Event->user_id?