Как правило, почти каждый раз, когда вы вызываете 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));
}
}
}
}
НТН.