Мой выбор имени поля для помощника формы CakePHP не работает должным образом, почему? - PullRequest
0 голосов
/ 31 марта 2010

Я создаю форму AJAX. Проблема в том, что когда я пытаюсь создать форму ввода с помощью formhelper, атрибут name моего ввода неправильно отображается в представлении. Вот мой код:

$form->input('MainAttribute.'.$i.'.SubAttribute.'.$j.'.score', array('label' => '', 'options' => $scores));

Я создал его таким образом, потому что я хочу, чтобы SubAttribute был внутри MainAttribute. Когда я проверяю HTML, атрибут имени формы обрезается как:

name="data[SuperMainAttribute]"

Как мне указать атрибут name для того, который я планирую сделать? (например, данные [MainAttribute] [0] [SubAttribute] [0] [счет])

Edit:

Вот мои модельные отношения:

Элемент управления имеет много MainAttribute

MainAttribute hasMany SubAttribute

Ctp находится в поле зрения контроллера управления

1 Ответ

2 голосов
/ 01 апреля 2010

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

НТН.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...