My choice of fieldname for CakePHP's form helper is not working properly, why?
I'm creating an AJAX form. The problem is when I'm trying to create a input form with formhelper, my input's name attribute is not correctly renedered in the view. Here's my code:
$form->input('MainAttribute.'.$i.'.SubAttribute.'.$j.'.score', array('label' => '', 'options' => $scores));
I created it that way because I want SubAttribute to be inside MainAttribute. When I inspect the HTML, the name attribute of the form is cutted of like:
name="data[SuperMainAttribute]"
How can I specify the name attribute to the one that I'm planning on doing? (e.g. data[MainAttribute][0][SubAttribute][0][score])
Edit:
Here are my model relationships:
Control hasMany MainAttribut开发者_如何学运维e
MainAttribute hasMany SubAttribute
The ctp is in a view of the Control Controller
In general, almost anytime you call FormHelper::input
, the first parameter will appear in one of the following formats:
- for the primary model, or
hasOne
andbelongsTo
associations:$form->input('Model.field')
- for
hasMany
associations:$form->input("Model.{$n}.field")
- for
hasAndBelongsToMany
associations:$form->input("Model.Model.{$n}.field")
(In these cases, $n
is an iterator (0
,1
,2
,3
, etc.), allowing you to add multiple records to hasMany
- and hasAndBelongsToMany
-associated models.)
Your specific case is tricky, because you want to save a Control
record, and all of its MainAttribute
records, and all of each MainAttribute
's SubAttribute
records. This isn't possible without some data manipulation in the controller. The way I'd probably tackle this problem is the following.
In the view:
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');
In 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.
精彩评论