我选择的CakePHP表单助手的字段名称不能正常工作,为什么?

时间:2010-03-31 07:43:02

标签: php cakephp

我正在创建一个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在控制控制器的视图中

1 个答案:

答案 0 :(得分:2)

一般情况下,几乎,只要您拨打FormHelper::input,第一个参数就会以下列格式之一显示:

  • 代表主要模式​​,或hasOnebelongsTo关联:$form->input('Model.field')
  • 用于hasMany个关联:$form->input("Model.{$n}.field")
  • 用于hasAndBelongsToMany个关联:$form->input("Model.Model.{$n}.field")

(在这些情况下,$n是迭代器(0123等),允许您添加多个记录到hasMany - 和hasAndBelongsToMany - 相关模型。)

您的具体案例很棘手,因为您要保存Control条记录及其所有MainAttribute条记录以及所有MainAttributeSubAttribute条记录。如果没有控制器中的某些数据操作,这是不可能的。我可能解决这个问题的方法如下。

在视图中:

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。