开发者

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

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜