tags:

views:

179

answers:

1

Hi, 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 MainAttribute

MainAttribute hasMany SubAttribute

The ctp is in a view of the Control Controller

+1  A: 

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 and belongsTo 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.

Daniel Wright