CakePHP: Comment mettre à jour plusieurs enregistrements en même temps avec le helper Form
Sur une page d'édition du modèle de Test, je veux être en mesure de mettre à jour les "Questions.afin" de terrain sur l'ensemble de il est associé (par hasMany) des questions de la même forme.
J'ai prêt de la Gâteau au chapitre de livre sur saveMany()/saveAll() dans le livre, et je suis en utilisant le Model.0.field syntax
mais je ne peux pas comprendre comment le dire à CakePHP qui enregistrement correspond à qui d'entrée. Si le #
dans Model.#.field
correspondent à la question du champ de l'id? Voici ce que je suis en train de faire:
echo $this->Form->create( 'Question', array('action'=>'order'));
$n = 0;
foreach ($questions_array as $question) : ?>
<?php echo $this->Form->input('Question.'.$n.'.order' ); ?>
<?php echo $this->Form->input('Question.'.$n.'.id', array('type'=>'hidden', 'value'=>$question['Question']['id']) ); ?>
<input type="submit" value="Save" />
...
$n++;
endforeach;
$this->Question->Form->end();
La forme présente et apparaît pour sauver, mais la mise à jour order
valeurs ne correspondent pas à la bonne question d'enregistrements. Ce que je fais mal?
Mise à jour:
Ici est la order
action dans mon controller:
public function admin_order() {
$data = $this->request->data;
$this->Question->saveAll($data['Question']);
$this->Session->setFlash( "Order saved.");
$this->redirect( $this->referer() );
}
Qu'est-ce que "Qset" et comment s'inscrit-il dans votre décrite question?
Dave a quelques bonnes questions, aussi je vois que votre formulaire contient un bouton "soumettre" sur chaque ligne (cela ne devrait pas être un problème, juste remarqué). Pourriez-vous modifier votre question et ajouter votre contrôleur de code, voir "comment" vous êtes en train d'enregistrer vos données
Je suis l'incrémentation de $n, et désolé pour la confusion avec la "Qset". C'est le nom de ma classe, mais j'ai voulu le remplacer par Question afin de la rendre plus claire. C'était un copier/coller de l'erreur, dont je viens de corriger.
Oui j'ai volontairement d'inclure un bouton "soumettre" à côté de chaque entrée (parce que la forme peut être très long). Je viens de mettre à jour la question avec le code du contrôleur. Merci
OriginalL'auteur emersonthis | 2013-04-21
Vous devez vous connecter pour publier un commentaire.
CakePHP associe tous les domaines avec le même "index" pour être un simple "enregistrer" dans votre base de données. L'index (c'est à dire la
0
dansFoo.0.id
) ne pas avoir aucun rapport avec la " id " de l'histoire, c'est juste un nombre.Par exemple;
Comme mentionné dans le début de ma réponse, l'indice lui-même n'a pas d'importance, ce code ne exactement le même:
Aussi longtemps que les champs de la même enregistrement ont la même 'index', CakePHP va comprendre qu'ils appartiennent "ensemble".
Lors de la soumission de ces données et de les enregistrer à l'aide;
CakePHP mise à jour de deux lignes via le
Foo
modèle;table 'foos';
Votre code semble utiliser le même 'id' (
$qset['Qset']['id']
) pour chaque ligne, ce qui n'est probablement pas la bonne ID de mettre à jour les enregistrements$this->Form->input('Question.'.$n.'.order' );
Ma compréhension est que$n
est utilisé pour "lot" entrées dans un seul des dossiers, mais comment CakePHP savoir quelle ligne dans la base de données correspond à$n
?il sait quel est le dossier de la mise à jour basé sur le champ 'id';
Foo.0.id = 123
etFoo.0.name = 'hello'
va donc faire quelque chose commeUPDATE foos SET name='hello' WHERE id = 123;
J'ai fait une expérience. J'ai ajouté
'value' => $question['Question']['order']
au tableau d'options pour l'entrée et maintenant, toutes les valeurs s'affichent correctement. Je ne sais pas pourquoi cela a fait une différence.Viens de voir votre commentaire ci-dessus. Qui semblait le faire. Merci! Est-il surprenant qu'il était nécessaire de le faire? Je suis habitué à Gâteau en sachant à l'entrée de la valeur automatiquement.
Yup, j'ai compris, cependant,
$this->request
à l'intérieur du contrôleur est une référence à l' demande de l'objet qui est utilisé à l'intérieur de votre point de vue. Pour le démontrer, essayez ceci à l'intérieur de votre contrôleur:$this->request->data['hello'] = 'world';
et ce, à votre avis:echo $this->request['hello'];
. Ces données sont utilisées par le helper form afin de remplir automatiquement les valeurs de vos entrées. Si la demande-objet contient les données dans le bon format, vous n'avez pas à définir chacune des entrées de la valeur manuellement.OriginalL'auteur thaJeztah
OriginalL'auteur Matteus Barbosa