我正在创建一个AJAX表单。问题是当我尝试使用formhelper创建输入表单时,我的输入的name属性在视图中没有被正确地重新编译。这是我的代码:
$form->input('MainAttribute.'.$i.'.SubAttribute.'.$j.'.score', array('label' => '', 'options' => $scores));
我是这样创建的,因为我希望SubAttribute在MainAttribute中。当我检查HTML时,表单的name属性被剪切为:
name="data[SuperMainAttribute]"
如何指定我计划进行的名称属性? (例如data [MainAttribute] [0] [SubAttribute] [0] [score])
编辑:
以下是我的模特关系:
控制hasMany MainAttribute
MainAttribute hasMany SubAttribute
ctp在控制控制器的视图中
答案 0 :(得分:2)
一般情况下,几乎,只要您拨打FormHelper::input
,第一个参数就会以下列格式之一显示:
hasOne
和belongsTo
关联:$form->input('Model.field')
hasMany
个关联:$form->input("Model.{$n}.field")
hasAndBelongsToMany
个关联:$form->input("Model.Model.{$n}.field")
(在这些情况下,$n
是迭代器(0
,1
,2
,3
等),允许您添加多个记录到hasMany
- 和hasAndBelongsToMany
- 相关模型。)
您的具体案例很棘手,因为您要保存Control
条记录及其所有MainAttribute
条记录以及所有MainAttribute
条SubAttribute
条记录。如果没有控制器中的某些数据操作,这是不可能的。我可能解决这个问题的方法如下。
在视图中:
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');
在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。