2010-03-31 2 views
0

Je crée un formulaire AJAX. Le problème est lorsque j'essaye de créer un formulaire d'entrée avec formhelper, l'attribut de nom de mon entrée n'est pas correctement renédé dans la vue. Voici mon code:Mon choix de nom de champ pour l'aide de formulaire de CakePHP ne fonctionne pas correctement, pourquoi?

$form->input('MainAttribute.'.$i.'.SubAttribute.'.$j.'.score', array('label' => '', 'options' => $scores)); 

Je l'ai créé de cette façon parce que je veux être à l'intérieur sous-attribut MainAttribute. Quand je le HTML inspecte, l'attribut name de la forme est de cutted comme:

name="data[SuperMainAttribute]" 

Comment puis-je spécifier l'attribut name à celui que je prévois de faire? (par exemple des données [MainAttribute] [0] [sous-attribut] [0] [note])

Edit:

Voici mes relations modèle:

contrôle hasMany MainAttribute

MainAttribute hasMany sous-attribut

le ctp est en vue du contrôleur de contrôle

+0

Si vos modèles sont configurés avec les bonnes relations, Cake le fera pour vous. Il n'est pas nécessaire de spécifier les dimensions du tableau. Essayez-le sans et pr ($ this-> données) dans votre contrôleur. –

+0

whoa je peux donc faire saveAll ($ this-> data) sans avoir à réorganiser la structure de $ this-> data? – user295284

+0

Pouvez-vous modifier votre question pour inclure les relations de modèle que vous avez définies?Ceci est important parce que 'Model :: saveAll()' _n'a pas enregistré les données de modèle associées à HABTM. –

Répondre

2

en général, presque chaque fois que vous appelez FormHelper::input, le premier paramètre apparaît dans un des formats suivants:

  • pour le modèle primaire ou hasOne et belongsTo associations: $form->input('Model.field')
  • pour hasMany associations: $form->input("Model.{$n}.field")
  • pour hasAndBelongsToMany associations: $form->input("Model.Model.{$n}.field")

(Dans ces cas-là s, $n est un iterator (0, 1, 2, 3, etc.), ce qui vous permet d'ajouter plusieurs enregistrements à hasMany -. et hasAndBelongsToMany modèles -Associated)

Votre cas précis est difficile, parce que vous voulez enregistrer un enregistrement Control, et tous ses enregistrements MainAttribute, et tous les enregistrements de MainAttributeSubAttribute. Ceci n'est pas possible sans manipulation de données dans le contrôleur. La façon dont j'aborderais probablement ce problème est la suivante.

De l'avis:

echo $form->create('Control', array('action'=>'add')); 

echo $form->input('Control.field_name'); 

$iLimit = 4; 
$jLimit = 2; 
for ($k=$i=0;$i<$iLimit;$i++) { 

    echo $form->input("MainAttribute.{$i}.field_name"); 

    for ($j=0;$j<$jLimit;$j++) { 
     echo $form->input("SubAttribute.{$k}.ixMainAttribute", array('type'=>'hidden','value'=>$i)); 
     echo $form->input("SubAttribute.{$k}.field_name"); 
     $k++; 
    } 
} 

echo $form->end('Submit'); 

En ControlsController:

function add() 
{ 
    if (! empty($this->data)) { 

     // Perform data validation separately... 

     if ($this->Control->save($this->data['Control'], false)) { 

      foreach ($this->data['MainAttribute'] as $k => $_data) { 

       $_subAttributes = Set::extract("/SubAttribute[ixMainAttribute={$k}]", $this->data); 

       $insert = array(
        'MainAttribute' => am($_data, array('control_id' => $this->Control->id)), 
        'SubAttribute' => $_subAttributes 
       ); 

       $this->Control->MainAttribute->saveAll($insert, array('validate'=>false)); 
      } 
     } 
    } 
} 

HTH.

Questions connexes