Bonjour, je remercie d'avance ceux qui prendrons le temps de lire mon problème.
Alors voilà. J'ai une table 'users' qui contient le login et le mdp de chaque utilisateurs. Dans une seconde table 'hotels' j'ai les informations de l'hotel. Et dans une troisième table 'clients' les informations des clients.
Voici ma vue edit:
<div class="row">
<h1>Editez votre profil</h1><p> </p>
<div class="span4">
<?php echo $this->Form->create('User'); ?>
<?php echo $this->Form->input('username',array('label'=>"Nom de votre hôtel")); ?>
<?php echo $this->Form->input('mail',array('label'=>"E-mail")); ?>
</div>
<div class="span4">
<b>Changer de mot de passe</b>
<?php echo $this->Form->input('pass1',array('label'=>"Mot de passe", 'type'=>'password')); ?>
<?php echo $this->Form->input('pass2',array('label'=>"Confirmez", 'type'=>'password')); ?>
<?php echo $this->Form->input('test',array('value'=>"mdp",'type'=>"hidden")); ?>
<?php echo $this->Form->end('Enregister'); ?>
</div>
<div class="span4">
<?php echo $this->Form->create('Hotel'); ?>
<?php echo $this->Form->input('location',array('label'=>"Votre adresse")); ?>
<?php echo $this->Form->input('codepostal',array('label'=>"Code postal")); ?>
<?php echo $this->Form->input('ville',array('label'=>"Ville")); ?>
<?php echo $this->Form->input('test',array('value'=>"adresse",'type'=>"hidden")); ?>
<?php echo $this->Form->input('user_id'); ?>
<?php echo $this->Form->end('Sauvegarder'); ?>
</div>
</div>
<?php echo $this->element('sql_dump'); ?>
Comme vous pouvez le voir, il y a deux formulaires, l'un destiné à la table users et l'autre à la table hotel. Ils contiennent un champs hidden test pour savoir quel formulaire est envoyé.
Voici ma fonction edit:
function edit(){
$user_id = $this->Auth->user('id');
if(!$user_id){
$this->redirect('/');
die();
}
$this->User->id = $user_id;
$passError = false;
if($this->request->is('put') || $this->request->is('post')){
$d = $this->request->data;
$d'Hotel']'user_id'] = $d'User']'id'] = $user_id;
//Si on change les données liées à l'adresse
if(isset($d'Hotel']'test']) && $d'Hotel']'test'] =="adresse" ){
if($this->Hotel->save($d'Hotel'])){
$this->Session->setFlash("Votre profil a bien été édité","notif");
}
}
// Si on change le mot de passe ou les infos users
if(isset($d'User']'test']) && $d'User']'test'] == "mdp"){
if(!empty($d'User']'pass1'])){
if($d'User']'pass1'] == $d'User']'pass2']){
$d'User']'password'] = $d'User']'pass1'];
}else{
$passError = true;
}
}
if($this->User->save($d'User'])){
$this->Session->setFlash("Votre profil a bien été édité","notif");
}else{
$this->Session->setFlash("Impossible de sauvegarder les données","notif",array('type'=>'error'));
}
if($passError) $this->User->validationErrors'pass2'] = array('Les mots de passe ne sont pas identiques');
}
}else{
$this->request->data = $this->User->read();
}
$this->request->data'User']'pass1'] = $this->request->data'User']'pass2'] = '';
}
}
Mon model hotel :
<?php
class Hotel extends AppModel{
public $belongsTo = array('User');
}
Ma table hotel contient un champs user_id.
Et sur ma page d’édition, j'ai bien mes deux formulaire mais mon champs user_id est un select vide. Ne devrait-il pas être automatiquement caché et avoir pour valeur l'id de l'utilisateur connecté ?
En plus de cela, si dans la fonction edit je rajoute $this->request->data = $this->Hotel->read(); il ne lit pas mes informations, les champs sont vide. Alors que les infos username et mail sont bien affichées.
Pour finir la sauvegarde se passe à peu près bien à ceci près que la liaison n'est apparement pas faite parce que si je rentre par exemple une ville et que je change il va sauvegardé une nouvelle ligne et non modifier celle existante.
J'ai essayé d'adapter les tutos et tout mais là je bloque et votre aide serait... d'une grande aide :)
Merci à vous les amis...
Salut,
Donc pour repondre rapidement a ton probleme, concernant le user_id, non Cake ne masque que les champs id. Si tu veux mettre ce champs en hidden, il faut le faire manuellement :
<?php echo $this->Form->input('user_id', array('type' => 'hidden')); ?>
Par contre si j'ai une suggestion, étant donner que ce champs represente actuellement l'utilisateur connecter, je te conseil de ne pas mettre ce champs dans ton formulaire mais plutot de definir cette valeur avant la sauvegarde. Niveau sécurité, c'est beaucoup plus sur :
$d'Hotel']'user_id'] = $this->Auth->user('id');
Pour finir, concernant le request->data, vu ton code, c'est normal qu'il ne prenne pas en compte les hotels puisque a la fin de ton code tu ecrase data avec les données utilisateurs. Ce que tu pourrai faire c'est peut être d'ajouter sa dans un nouvelle index du tableau (a tester) :
$this->request->data] = $this->User->read();
$this->request->data] = $this->Hotel->read();
Voila essayes et dis nous si sa marche
Bonjour et merci pour ta réponse superman ^^ Alors ok pour le hidden, je m'en doutais, mais bon c'est pas le important ça.
Concernant cette indication:
$d'Hotel']'user_id'] = $this->Auth->user('id');
Je le fais avec cette ligne 2 :
$user_id = $this->Auth->user('id');
et la ligne 11 :
$d'Hotel']'user_id'] = $d'User']'id'] = $user_id;
non ?
Et enfin que veux tu dire par ajouter dans un nouvel index ?
$this->request->data] = $this->User->read();
$this->request->data] = $this->Hotel->read();
EDIT: Je viens de me rendre compte d'ailleurs que la sauvegarde ne se fait pas si je change le mdp ou l'username .. enfin tout ce qu'il y a dans le form User quoi.
Salut, je viens de creer une application rapidement pour tester ton cas. J'ai pas inclus tout les champs mais je pense que cela simule assez bien ce que tu veux faire. Je n'ai pas non plus chercher a optimiser mon code (pas de validation par exemple aussi), donc il faudra que le fasse toi meme. Par contre tout marche.
Bref, j'ai commencer par ne faire qu'un seul Form dans ma vue :
<?php echo $this->Form->create('User'); ?>
<?php echo $this->Form->input('Hotel.id'); ?>
<?php echo $this->Form->input('username'); ?>
<?php echo $this->Form->input('password'); ?>
<?php echo $this->Form->input('Hotel.location'); ?>
<?php echo $this->Form->input('Hotel.ville'); ?>
<?php echo $this->Form->end('Sauvegarder'); ?>
Ensuite dans mon controlleur, j'utlise simplement la methode saveAll pour sauvegarder aussi les liaisons :
public function edit(){
if($this->request->is('put') || $this->request->is('post')){
$data = $this->request->data;
if(empty($data'User']'password'])){
unset($data'User']'password']);
}
$data'User']'id'] = $this->Auth->user('id');
if($this->User->saveAll($data)){
$this->Session->setFlash('Sauvegarder');
}else{
$this->Session->setFlash('Erreur');
}
}else{
// Etant donnee que les models sont liee, lire les infos utilisteur permettera
// de recuperer aussi les infos de l'hotel
$this->User->id = $this->Auth->user('id');
$this->request->data = $this->User->read();
unset($this->request->data'User']'password']);
}
}
Et enfin mes models (je ne suis pas sur que tu les ai fait comme sa) :
class Hotel extends AppModel{
public $belongsTo = array('User');
}
class User extends AppModel {
public $hasOne = array('Hotel');
}
Voila, essayes sa, sa devrait fonctionner. Sa marche chez moi en tout cas.
a+
Re bonsoir, Merci encore pour cette aide qui va m'être précieuse.
Alors je vais tester ça dans la soirée et je te tiendrais au courant.
en attendant je viens d'apprendre que dans l'input NomDuModel.Champ ça revient (en plus simple) que de faire de form. Cakephp va automatiquement détecter qu'il est question d'une autre table ?
Enfin est-il vraiment nécessaire de faire la liaison dans les deux sens ? Enfin quand est-ce qu'il est nécéssaire de la faire dans les deux sens ?
Merci encore pour tout ;)
Oui tu peux en effet directement specifier le Nom_du_model.Champ dans les inputs, ou Nom_du_model est totalement arbitraire (Sa n'a pas besoin d'être un model existant mais dans ton cas, sa permet tres simplement d'avoir une seul form pour plusieurs model liée).
Il n'est pas vraiment necessaire de faire de liaison dans les 2 sens. Dans le cas actuel, on est pas obliger de liée Hotel a User. Par contre si tu as besoin de récupérer l'utilisateur liée a un hotel, alors oui la liaison peut être necessaire.
Pas de souci, test sa et reviens ici pour nous dire si sa a marcher
Et bien je viens de le faire (trop pressé de voir si c'était bon^^) et... non ça ne marche pas. J'ai le message flash erreur. :'(
EDIT: d'ailleurs sql_dump m'indique ces requêtes :
SELECT COUNT(*) AS count
FROM users
AS User
WHERE User
.id
= 1
SELECT COUNT(*) AS count
FROM users
AS User
WHERE User
.username
= 'Admin' AND User
.id
!= 1
Y a pas un bug ? ^^ un coup il demande id = 1 et après id != 1
As quel moment il t'affiche ces requêtes?
Voici ce que j'ai lorsque j'arrive sur ma page edit ($this->User->read()) :
SELECT `User`.`id`, `User`.`username`, `User`.`password`, `Hotel`.`id`, `Hotel`.`location`, `Hotel`.`ville`, `Hotel`.`user_id` FROM `hepl`.`users` AS `User` LEFT JOIN `hepl`.`hotels` AS `Hotel` ON (`Hotel`.`user_id` = `User`.`id`) WHERE `User`.`id` = 1 LIMIT 1
Il m'affiche cela quand j'envoie le formulaire.
Sinon quand j'arrive sur ma page edit j'ai tout ça
SELECT `User`.`id`, `User`.`username`, `User`.`mail`, `User`.`password`, `User`.`phone`, `User`.`media_id`, `User`.`hotel_id`, `User`.`role`, `User`.`description`, `User`.`location`, `Hotel`.`id`, `Hotel`.`codepostal`, `Hotel`.`ville`, `Hotel`.`nombrechambre`, `Hotel`.`piscine`, `Hotel`.`location`, `Hotel`.`user_id` FROM `users` AS `User` LEFT JOIN `hotels` AS `Hotel` ON (`Hotel`.`user_id` = `User`.`id`) WHERE `User`.`id` = 1 LIMIT 1
SELECT `Media`.`id`, `Media`.`name`, `Media`.`url`, `Media`.`activite_id`, `Media`.`category_id`, `Media`.`user_id`, `Media`.`client_id`, `Media`.`animateur_id`, `Media`.`type`, `Media`.`ref`, `Media`.`ref_id`, `Media`.`file`, `Media`.`position` FROM `medias` AS `Media` WHERE `Media`.`user_id` = (1)
function edit(){
$passError = false;
if($this->request->is('put') || $this->request->is('post')){
$data = $this->request->data;
if(empty($data'User']'password'])){
unset($data'User']'password']);
}
$data'User']'id'] = $this->Auth->user('id');
if(!empty($d'User']'pass1'])){
if($d'User']'pass1'] == $d'User']'pass2']){
$d'User']'password'] = $d'User']'pass1'];
}else{
$passError = true;
}
}
if($this->User->saveAll($data)){
$this->Session->setFlash("L'utilisateur a bien été enregistré");
}else{
$this->Session->setFlash("Impossible de sauvegarder les données");
}
}else{
// Etant donnee que les models sont liee, lire les infos utilisteur permettera
// de recuperer aussi les infos de l'hotel
$this->User->id = $this->Auth->user('id');
$this->request->data = $this->User->read();
unset($this->request->data'User']'password']);
}
}
le edit.ctp
<div class="row">
<h1>Editez votre profil</h1><p> </p>
<div class="span8">
<?php echo $this->Form->create('User'); ?>
<?php echo $this->Form->input('Hotel.id'); ?>
<?php echo $this->Form->input('username',array('label'=>"Nom de votre hôtel")); ?>
<?php echo $this->Form->input('mail',array('label'=>"E-mail")); ?>
<?php echo $this->Form->input('pass1',array('label'=>"Mot de passe", 'type'=>'password')); ?>
<?php echo $this->Form->input('pass2',array('label'=>"Confirmez", 'type'=>'password')); ?>
<?php echo $this->Form->input('hotel.location',array('label'=>"Votre adresse")); ?>
<?php echo $this->Form->input('hotel.codepostal',array('label'=>"Code postal")); ?>
<?php echo $this->Form->input('hotel.ville',array('label'=>"Ville")); ?>
<?php echo $this->Form->end('Sauvegarder'); ?>
</div>
</div>
<?php echo $this->element('sql_dump'); ?>
Le model hotel est exactement comme tu l'as mis et voila le model User:
<?php
class User extends AppModel{
public $hasMany = array(
'Media' => array(
'dependent' => true
)
);
public $hasOne = array('Hotel');
public $validate = array(
'username' => array(
array(
'rule' => 'alphanumeric',
'required' => true,
'allowEmpty' => false,
'message' => "Ce nom d'utilisateur n'est pas valide"
),
array(
'rule' => 'isUnique',
'message' => "Ce nom d'utilisateur est déjà pris"
)
),
'mail' => array(
array(
'rule' => 'email',
'required' => true,
'allowEmpty' => false,
'message' => "Cet email n'est pas valide"
),
array(
'rule' => 'isUnique',
'message' => "Cet email est déjà pris"
)
),
'password' => array(
'rule' => 'notEmpty',
'message' => "Vous devez preciser un mot de passe",
'allowEmpty' => false
)
);
function beforeSave($options = array()){
if(!empty($this->data'User']'password'])){
$this->data'User']'password'] = AuthComponent::password($this->data'User']'password'],null,true);
return true;
}
}
}
Tout me parait bon donc vérifie que les données passent bien les tests de validations. Aussi dans ton controlleur, tu utilises $data (celui que j'ai mis dans mon exemple) mais tu continue d'utiliser ton ancienne variable $d. A premiere vue, sa ne joue pas sur le resultat mais bon on ne sais jamais, essayes.
Aussi un petit conseil pour la verification des mots de passe, tu peux mettre sa dans ton model. Je fais généralement comme ceci :
// Model User
public $validate = array(
'pass1' => array(
array(
'rule' => array('identicalFieldValues', 'pass2'),
'message' => "Les mots de passes ne sont pas les memes"
)
)
);
public function identicalFieldValues( $field=array(), $compare_field=null ){
foreach( $field as $key => $value ){
$v1 = $value;
$v2 = $this->data$this->name]$compare_field];
if($v1 !== $v2) return false;
else continue;
}
return true;
}
J'avais pas pensé à changé ça ^^ Mais en effet ça ne change rien. Et les tests de validation tu veux dire les règles du model User ?
Et bien j'ai essayé et il ne repère aucune erreur j'ai l'impression. Par exemple si je mets 2 mots de passe différents j'ai aucun message.
Oui, met tes tests de validations pour le mot de passe dans le model user comme dans mon exemple precedent. Sa te renverra un message d'erreur comme pour les autres champs.
A mon avis tu n'es plus tres loin de la solution. Il doit y avoir un bug sur les validations je pense. Essaye dans la methode saveAll de rajouter ceci :
if($this->User->saveAll($data, array('validate' => false))){
// ok
}
Sa permet de désactiver les validations pour nous permettre de voir si l'erreur vient de la
Alors j'ai tout rajouter selon tes conseils. Toujours le message d'erreur. Mais j'ai remarqué plusieurs choses. Si je ne mets pas le validate à false, la règle de validation pour le mail est bien respectée (si je mets un email invalide ça m'indique bien qu'il n'est pas correct).
Ensuite quand je soumets le formulaire, j'ai mon erreur "impossible de sauvegarder les données" et le champs Hotel.id apparaît et n'est donc plus hidden (alors qu'avant que le formulaire soit soumit, il est caché.
EDIT: Après un petit test voilà quelque chose. La sauvegarde se fait enfin MAIS dans la table hotel, les champs sont tous vides sauf le user_id. Si on fait une nouvelle sauvegarde, la table hotel a une deuxième ligne également vide (au lieu de modifier la première). Et pour que la sauvegarde se fasse il faut renseigner tous les champs. Autrement dit même ceux qu'on ne souhaite pas modifier. En revanche les infos dans la table user s'enregistre correctement.
Pourquoi ne pas faire deux actions distinctes ? Tu as deux formulaires, avec en plus chacun sa base, du couo tu peuaire deux actions. Le premier formulaire va viser editUser() par exemple et le deuxième editHotel(). Comme ça tu ne jongles pas trop avec les validations. Ça pourra sans doute simplifier le développement.
Je ne savais pas que c'était possible. Comment on fait appel à deux actions dans une même page ? puisqu'une url est de la manière suivante : app/controller/action/params1... et non app/controller/action1/action2. Je pense que c'est plus compliqué de faire deux actions distinctes.
Cependant là c'est tout de même bizarre. Pourquoi rien ne se sauvegarde dans ma base de donnée hotel ? :'(
Regarde du côté là http://book.cakephp.org/2.0/en/core-libraries/helpers/form.html#options-for-create, tu as $options'action']. L'url ce n'est que pour l'utilisateur, ça n'a pas de valeurs concrète dans le code.
CakePHP cache ce fonctionnement, du coup ça peut être obscur mais tu peux faire une action pour le GET( affichage du formulaire) et faire une action pour le POST(envoi du formulaire). CakePHP a tendance a utiliser une action pour les deux, d'où le if sur le type de requête
if($this->request->is('put') || $this->request->is('post')){
.
Une action doit être utilisé pour une fonctionnalité (affichage, envoi, listing, ...). Hors là tu as deux formulaires, d'où deux actions.
<div class="row">
<h1>Editez votre profil</h1><p> </p>
<div class="span4">
<?php echo $this->Form->create('User', array('action' => 'editUser')); ?>
<?php echo $this->Form->input('username',array('label'=>"Nom de votre hôtel")); ?>
<?php echo $this->Form->input('mail',array('label'=>"E-mail")); ?>
</div>
<div class="span4">
<b>Changer de mot de passe</b>
<?php echo $this->Form->input('pass1',array('label'=>"Mot de passe", 'type'=>'password')); ?>
<?php echo $this->Form->input('pass2',array('label'=>"Confirmez", 'type'=>'password')); ?>
<?php echo $this->Form->input('test',array('value'=>"mdp",'type'=>"hidden")); ?>
<?php echo $this->Form->end('Enregister'); ?>
</div>
<div class="span4">
<?php echo $this->Form->create('Hotel', array('action' => 'editHotel')); ?>
<?php echo $this->Form->input('location',array('label'=>"Votre adresse")); ?>
<?php echo $this->Form->input('codepostal',array('label'=>"Code postal")); ?>
<?php echo $this->Form->input('ville',array('label'=>"Ville")); ?>
<?php echo $this->Form->input('test',array('value'=>"adresse",'type'=>"hidden")); ?>
<?php echo $this->Form->input('user_id'); ?>
<?php echo $this->Form->end('Sauvegarder'); ?>
</div>
</div>
dans le Controller.php :
<?php
public function edit(){
// placer le code relatif a l'affichage du formulaire et des informations
}
public function editUser() {
// placer le code relatif a la modification et la sauvegarde d'un utilisateur
}
public function editHotel() {
// placer le code relatif a la modification et la sauvegarde d'un hotel
}
?>
Peux tu nous redonner le code que tu possèdes ? Car il y a eu pas mal de modifications réalisées.
Ah d'accord d'accord en effet c'est obscur ^^
Oui voilà mon code à présent:
UsersController :
function admin_edit(){
$passError = false;
if($this->request->is('put') || $this->request->is('post')){
$data = $this->request->data;
if(empty($data'User']'password'])){
unset($data'User']'password']);
}
$data'User']'id'] = $this->Auth->user('id');
if(!empty($data'User']'pass1'])){
if($data'User']'pass1'] == $data'User']'pass2']){
$data'User']'password'] = $data'User']'pass1'];
}else{
$passError = true;
}
}
if($this->User->saveAll($data)){
$this->Session->setFlash("L'utilisateur a bien été enregistré");
}else{
$this->Session->setFlash("Impossible de sauvegarder les données");
}
}else{
// Etant donnee que les models sont liee, lire les infos utilisteur permettera
// de recuperer aussi les infos de l'hotel
$this->User->id = $this->Auth->user('id');
$this->request->data = $this->User->read();
unset($this->request->data'User']'password']);
}
}
Model Hotel:
<?php
class Hotel extends AppModel{
public $belongsTo = array('User');
}
Model User:
<?php
class User extends AppModel{
public $hasMany = array(
'Media' => array(
'dependent' => true
)
);
public $hasOne = array('Hotel');
public $validate = array(
'username' => array(
array(
'rule' => 'alphanumeric',
'required' => true,
'allowEmpty' => false,
'message' => "Ce nom d'utilisateur n'est pas valide"
),
array(
'rule' => 'isUnique',
'message' => "Ce nom d'utilisateur est déjà pris"
)
),
'mail' => array(
array(
'rule' => 'email',
'required' => true,
'allowEmpty' => false,
'message' => "Cet email n'est pas valide"
),
array(
'rule' => 'isUnique',
'message' => "Cet email est déjà pris"
)
),
'password' => array(
'rule' => 'notEmpty',
'message' => "Vous devez preciser un mot de passe",
'allowEmpty' => false
),
'pass1' => array(
'rule' => array('identicalFieldValues', 'pass2'),
'message' => "Les mots de passes ne sont pas les memes"
)
);
public function identicalFieldValues( $field=array(), $compare_field=null ){
foreach( $field as $key => $value ){
$v1 = $value;
$v2 = $this->data$this->name]$compare_field];
if($v1 !== $v2) return false;
else continue;
}
return true;
}
function beforeSave($options = array()){
if(!empty($this->data'User']'password'])){
$this->data'User']'password'] = AuthComponent::password($this->data'User']'password'],null,true);
return true;
}
}
}
admin_edit.ctp :
<div class="row">
<h1>Editez votre profil</h1><p> </p>
<div class="span8">
<?php echo $this->Form->create('User'); ?>
<?php echo $this->Form->input('Hotel.id'); ?>
<?php echo $this->Form->input('username',array('label'=>"Nom de votre hôtel")); ?>
<?php echo $this->Form->input('mail',array('label'=>"E-mail")); ?>
<?php echo $this->Form->input('pass1',array('label'=>"Mot de passe", 'type'=>'password')); ?>
<?php echo $this->Form->input('pass2',array('label'=>"Confirmez", 'type'=>'password')); ?>
<?php echo $this->Form->input('hotel.location',array('label'=>"Votre adresse")); ?>
<?php echo $this->Form->input('hotel.codepostal',array('label'=>"Code postal")); ?>
<?php echo $this->Form->input('hotel.ville',array('label'=>"Ville")); ?>
<?php echo $this->Form->end('Sauvegarder'); ?>
</div>
</div>
<?php echo $this->element('sql_dump'); ?>
(j'ai viré les span4 dans les form parce que ça ne marchait pas. Enfin si j'avais bien mes span mais le bouton submit n'envoyait rien du tout)
Tu ne fais aucune sauvegarde sur les Hotels dans ton action edit(). C'est normal ?
EDIT : tu fais une règle de validation dans ton Model sur pass1 et pass2 et tu le refais dans ton Controller, ce n'est pas un peu redondant ? Il y a une raison pour doubler ?
Bonsoir,
la validation est redondante en effet ^^ Pour ce qui est de la sauvegarde, le saveAll n'est-il pas sensé sauvegarder dans Hotel également ?
Si en effet c'est lui qui doit faire le boulot. Par contre, est ce que çane serait pas Hotel.location au lieu de hotel.location,... dans ton formulaire ? Fais un debug avant la sauvegarde pour voir si ton tableau est correctement ordonnancé pour un saveAll(), tu as le modèle du tableau dans la doc.
... Effectivement avec un H majuscule c'est mieux! Des fois je me demande si je réfléchi bien --' bon la sauvegarde est bien faite dans les deux tables. Mais bon il faut toujours que tous les champs soient renseignés pour que le formulaire soit envoyé pourquoi ça ?
PS: Une idée de pourquoi les span "cassaient" le formulaire ?
Mais bon il faut toujours que tous les champs soient renseignés pour que le formulaire soit envoyé pourquoi ça ?
Le problème ne viendrait il pas de tes règles de validation ?
Tu peux faire un debug($this->User->validates()) avant ton saveAll() et si c'est à false, le problème vient bien de tes règles de validation.
Bon passons c'est histoire de validation c'est pas le plus important (pour le moment).
J'ai fais un bout de code ressemblant pour ajouter cette fois non pas un hotel mais un particulier (belongsTo hotel) dans la table j'ai un champs hotel_id.
function admin_edit($id=null){
if($this->request->is('post') || $this->request->is('put') ){
$d = $this->request->data'Particulier'];
if($d'password'] != $d'passwordconfirm']){
$this->Session->setFlash("Les mots de passes ne correspondent pas","notif",array('type'=>'error'));
}else{
$d'hotel_id'] = $this->Auth->user('id');
if($this->Particulier->saveAll($this->request->data)){
$this->Session->setFlash("Le client a bien été enregistré");
$this->redirect(array("action"=>"index"));
}
}
}elseif($id){
$this->request->data = $this->Particulier->findById($id);
if($id) {
unset($this->request->data'Particulier']'password']);
}
}
$this->Particulier->id = $this->Auth->user('id');
$d'users'] = $this->Particulier->User->find('list');
$this->set($d);
}
Si je fais un debug($d'hotel_id']); j'ai bien l'id de l'utilisateur connecté. Mais il ne sauvegarde pas ce champ.
Voici mon admin_edit.ctp
<div class="row">
<h1>Editer ou ajouter un client</h1><p> </p>
<div class="span8">
<?php echo $this->Form->create('User'); ?>
<?php echo $this->Form->input('Particulier.id'); ?>
<?php echo $this->Form->input('User.id'); ?>
<?php echo $this->Form->input('User.username',array('label'=>"login")); ?>
<?php echo $this->Form->input('Particulier.prenom',array('label'=>"",'placeholder'=>'Prénom')); ?>
<?php echo $this->Form->input('Particulier.nom',array('label'=>"","placeholder"=>"Nom")); ?>
<?php echo $this->Form->input('User.mail',array('label'=>"E-mail")); ?>
<?php echo $this->Form->input('password',array('label'=>"Mot de passe")); ?>
<?php echo $this->Form->input('passwordconfirm',array('label'=>"Confirmez", 'type'=>'password')); ?>
<?php echo $this->Form->input('Particulier.adresse',array('label'=>"Votre adresse")); ?>
<?php echo $this->Form->input('Particulier.codepostal',array('label'=>"Code postal",'type'=>'text')); ?>
<?php echo $this->Form->input('Particulier.ville',array('label'=>"Ville")); ?>
<?php echo $this->Form->end('Sauvegarder'); ?>
</div>
</div>
Faut-il que je rajoute un input hotel_id ?
Je me permets de rajouter un petit UP parce que ça me bloque ^^ et comme je ne suis pas familiarisé avec l'anglais, la DOC ne m'aide pas beaucoup :(
Salut,
Je n'ai pas le temps de vraiment à répondre à ton problème tout de suite, cependant concernant la doc, elle existe aussi en Français : http://book.cakephp.org/2.0/fr/index.html
J'ai enfin réglé le problème de méthode assez barbare ! Merci à tous pour votre aide.