cakephp: динамические поля формы - PullRequest
0 голосов
/ 15 февраля 2012

Я только что начал с CakePHP, поэтому обнажился со мной :) ...

У меня есть форма, в которой все поля извлекаются динамически из таблицы базы данных 'FieldNames':

ID | FieldName
--------------
11 | username
22 | password
33 | Address
44 | etc

Это всего лишь пример, форма более сложная.

Я узнал и увидел в php doc, что если поля формы соответствуют 1: 1 с таблицей модели, метод Save является пользовательским, и создается новая строка со всеми значениями в соответствующих клетках. Но как это работает, если для моего образца формы все значения полей должны быть в несколько строк, по одному в таблице 'FieldValues' со следующей структурой.

ID | FieldId | Value                | DataSet
---------------------------------------------
1  | 11      | 'value for username' | 1
2  | 22      | 'value for password' | 1
3  | 33      | 'value for address'  | 1

FieldId = FK to Fieldnames.ID

Мне удалось сделать это способом, использующим «классику»

foreach field -> $sql = "sql insert query" -> $this->query( $sql )'

Мне просто интересно, могу ли я использовать «магию» в торте для решения этой задачи. Второй вопрос: если «волшебство» возможно, как я могу добавить второй параметр и для каждого набора данных установить новое значение DataSet?

Спасибо, Влад

P.S. Это приложение для построения форм, поэтому поля ДОЛЖНЫ быть динамическими, и я не могу использовать «статическую» реализацию формы (жестко закодировать имена полей в столбцах таблицы 1: 1). Имена и номера полей могут быть разными, поэтому я и использую их для базы данных.

1 Ответ

1 голос
/ 15 февраля 2012

Я предлагаю вам создать метод в вашей модели (где вы хотите сохранить свои поля), например:

// Field model
public function saveFields($data) {
    foreach($data as $field) {
        $this->save($field);
    }
}

Вы можете вызвать эту функцию в вашем FieldsController Add Action:

// FieldsController
$this->Field->saveFields($this->request->data);

Или в любом другом контроллере / модели с использованием ClassRegistry:

// FooController
$Field = ClassRegistry::init('Field');
$Field->saveFields($this->request->data);

Убедитесь, что ваши данные имеют правильный формат, например:

$data [0] [ ModelName ] = array(
    Field1 => Value1,
    Field2 => Value2 
)
...