Bonjour,
Voila je rencontre un petit problème avec mon code, j'ai fait une liaison entre la classe Serie et Episode (dans la classe Episode j'ai la clé étrangère series_id)
Dans mon model Episode
<?php
App::uses('AppModel', 'Model');
class Episode extends AppModel {
public $name='Episode';
public $actsAs = array('Containable');
public $belongsTo = 'Serie';
}
Dans mon model Serie
<?php
App::uses('AppModel', 'Model');
class Serie extends AppModel {
public $name='Serie';
public $actsAs = array('Containable');
public $hasMany = 'Episode';
}
Dans mon controller de serie
public function ajout($id=null){
$this->loadModel('Serie','Episode');
if (!empty($this->request->data)) {
if ($this->Serie->saveAll($this->request->data)) {
$this->Flash->success(__('Cette série a été ajouté.'));
return $this->redirect(array('action' => 'index'));
}
}
if($id != null){
$this->Serie->id= $id;
$this->data=$this->Serie->read();
}
}
dans ajout.ctp
<div class="form-group">
<?php echo $this->Form->input('Episode.libelle', array ('type' => 'text','label'=>'Libelle:'));?>
</div>
Quand j'ajoute une serie je veux créer plusieurs episodes mais je veux dejà en créer un seul pour voir si ça marche déjà
sauf que ça ne sauvegarde pas la partie Episode et ça ne créé pas non plus l'épisode
Bonjour.
Pour commencer, si tu utilises le behavior Containable dans tous tes models, au lieu de le définir dans chacun de tes models, je te conseille de le définir directement dans ton AppModel, de cette manière il sera accessible dans tous tes models sans avoir à le définir dans chaque model.
Ensuite, si tu veux vérifier si des données ont étés soumises en POST via un formulaire, je te recommande d'utiliser $this->request->is('post')
au lieu de $this->request->data
qui lui est plus générique.
Plus bas, tu définies $this->data
, sauf que c'est la notation pour les models et non pour les controller, il te faut donc le modifier par $this->request->data
.
Pour terminer, pourquoi charges-tu le model Serie dans ton controller Series alors qu'il est automatiquement chargé dans ce controller ?
Montres nous tout le code de ton formulaire pour voir si tu n'a rien oublié pour que l'enregistrement avec association s'effectue correctement.
d'accord =) j'ai fait un saveAssocieted mais à cha que fois ça créée la série quand je veux modifier par exemple et de plus ça insere dans la bdd mais le libelle reste vide c'est étrange non ?
Montres nous tout le code de ton formulaire pour voir si tu n'a rien oublié pour que l'enregistrement avec association s'effectue correctement.
Comment veux-tu que nous puissions t'aider efficacement si tu ne nous fournis pas les informations que nous te demandons ?
Et puis, la fonction que tu nous montres se nomme ajout, donc par toute logique selon son nom, elle est faite pour ajouter un enregistrement et non pour en modifier un, surtout que le message flash indique Cette série a été ajouté.
ah excuse moi !
alors je dis ce que je fais
public function ajout($id=null){
$this->loadModel('Serie','Episode');
if (!empty($this->request->is('post'))) {
if ($this->Serie->saveAssociated($this->request->data)) {
return $this->redirect(array('action' => 'index'));
}
}
if($id != null){
$this->Serie->id= $id;
$this->data=$this->Serie->read();
}
}
quand je tape le titre (de la série) et le libelle ( de l'épisode)
et que je fais un debug avant la sauvegarde j'ai ça
array(
'Serie' => array(
'titre' => 'ghjkk'
),
'Episode' => array(
(int) 0 => array(
'libelle' => 'ghjk'
)
)
)
et quand je vais dans ma table Episode j'ai l'episode créé mais le libelle et vide
de plus : quand je fais la meme chose pour modif
$this->loadModel("Serie","Episode");
if (!$id) {
throw new NotFoundException(__('Serie invalide'));
}
$post = $this->Serie->findById($id);
if (!$post) {
throw new NotFoundException(__('Serie invalide'));
}
if ($this->request->is(array('post', 'put'))) {
$this->Serie->id = $id;
if ($this->Serie->saveAssociated($this->request->data)) {
// debug($this->request->data);die();
$this->Flash->success(__('Cette Serie a été modifié.'));
return $this->redirect(array('action' => 'index'));
}
$this->Flash->error(__('Impossible de mettre à jour cette Serie.'));
}
if (!$this->request->data) {
$this->request->data = $post;
}
}
ça me créé cette fois si mon épisode avec le libelle rempli sauf que la série est de nouveau créée =/
et je voudrais ajouter plein d'épisodes dans ma série
Quand je te parle du code du formulaire, c'est le formulaire en lui même dans la vue et non les fonctions du controller.
<body>
<div id="content">
<div class="row_5">
<div class="container">
<h1 class="titrePro">Ajouter une Serie</h1>
<?php echo $this->form->create('Serie',array('url'=>array('action'=>'ajout')));?>
<div class="form-group">
<?php echo $this->form->input('Serie.titre',array('class'=>'form-control', 'label'=>'Nom:')); ?>
</div>
<div class="form-group">
<?php echo $this->Form->input('Episode.0.libelle', array ('type' => 'text','label'=>'Libelle:'));?>
</div>
<div class="formBouton2">
<!-- bouton Valider -->
<div class="boutonValider">
<?php
$ajout = $this->Form->submit('Valider', array('class'=>'btn btn-primary top','role'=> 'button'));
$ajout .= $this->end('Envoyer', array('class' => 'btn btn-primary'));
echo $ajout;
?>
</div>
<!-- bouton Annuler -->
<div class="boutonAnnuler">
<?php
$url = $_SERVER['HTTP_REFERER'];
echo $this->Html->link('Annuler',$url,array('class' => 'btn btn-danger'));
?>
</div>
</div>
</div>
</div>
</div>
</body>
Alors, c'est normal que le libelle ne soit pas enregistré étant donné que tu lui met un index 0 (Episode.0.libelle).
Tu ne fermes à aucun moment ton formulaire, il te faut remplacer $this->end()
par $this->Form->end()
.
Il est ensuite préférable que tu commences d'abord par la création de l'enregistrement pour une série et ensuite une fois l'insertion faite en base de données, rediriger l'utilisateur vers la modification de cette série afin d'ajouter un épisode, quitte à ce que ce soit vers la même action, mais en y passant l'id de la série de manière à ce que ce ne soit plus un ajout de cette série, mais sa modification.
Tu dis que tu veux ajouter plusieurs épisodes, mais est-ce l'un après l'autre ou plusieurs en même temps ?
Oui je fais Episode.0.libelle car sinon je n'ai pas l'épisode qui s'enregistre. et le libelle ne s'enregistre pas dans ajout mais par contre il s'enregistre dans modif ce qui est bizarre ^^'
j'aimerais ajouter plusieurs épisodes donc je pense faire des blocks de input que j'ajouterais dynamiquement =)
quand je fais ceci
public function modif($id = null){
$this->loadModel("Serie","Episode");
if (!$id) {
throw new NotFoundException(__('Serie invalide'));
}
$post = $this->Serie->findById($id);
if (!$post) {
throw new NotFoundException(__('Serie invalide'));
}
if ($this->request->is(array('post', 'put'))) {
$this->Serie->id = $id;
unset($this->Serie->Episode->validate['series_id']);
$this->Serie->saveAssociated($this->request->data);
$this->Flash->success(__('Cette Serie a été modifié.'));
return $this->redirect(array('action' => 'index'));
$this->Flash->error(__('Impossible de mettre à jour cette Serie.'));
}
if (!$this->request->data) {
$this->request->data = $post;
}
}
je créée une serie "bidule" avec comme id 1, je vais dans modification et j'ajoute un épisode (le rempli le champs du non de l'épisode) il ne va pas me modiffier "bidule id1 mais il va me créée une autre série avec nom "bidule" et id 2 et le libelle de l'épisode sera créée