Как в Yii2 получить два параметра в одном поле?

Здравствуйте! Подскажите, пожалуйста, как можно реализовать следующую задачу: 

1. У нас есть таблица полей - `fields` с полями `id` и `name`.
2. Также есть таблица форм - `forms` с полями `id` и `name`.
3. Имеется таблица соответствия формы и поля - `form_fields` с полями `id`, `id_form` и `id_field`. 

Таким образом, форма формируется из полей в соответствии с таблицей `form_fields`. Например, если у нас есть условие, что `$forma->field->name = input`, то выводится элемент input.

Для сбора значений из формы мы создали модель `Field_data`, которая содержит поля `id_field` и `data`. Когда мы передаем данные из input, мы используем код: 

```php
$model = new Fiel_data(); 
```

и значения будут сохраняться в поле `data` через:

```php
<?= $form->field($model, 'data') ?>
```

Однако, у меня возникла проблема: как передать `id_field` при этом? Мне нужен пост-запрос вида `Field_Data:[id_field, data]`.

Мы стремимся автоматизировать процесс создания форм, добавляя типы полей в базу данных и собирая формы на основе этих типов. Подскажите, пожалуйста, что еще необходимо реализовать для достижения этой цели?
  • 24 сентября 2024 г. 15:04
Ответы на вопрос 2
Чтобы передать два параметра (например, `id_field` и `data`) в одном поле формы, вы можете использовать различные подходы. Один из способов — это использовать массивы в значениях форм. Вот шаги, как это можно реализовать в Yii2.

### Шаги реализации

1. **Измените модель `Field_data`:** Убедитесь, что в модели `Field_data` вы правильно настроили правила валидации, чтобы они соответствовали вашим нуждам. Вам не нужно добавлять дополнительные поля в вашу модель, так как вы будете передавать `id_field` через массив.

2. **Измените форму в представлении:**

   Вместо того чтобы просто использовать `$form->field($model, 'data')`, вы можете использовать массив для передачи `id_field` вместе с данными:

   ```php
   foreach ($formFields as $field) {
       echo $form->field($model, "data[{$field->id}]")->textInput()->label($field->name);
   }
   ```

   Здесь мы предполагаем, что у вас есть массив `$formFields`, который содержит поля формы, а `$field->id` — это идентификатор поля.

3. **Обработка данных в контроллере:**

   После того как данные будут отправлены из формы, вы получите массив `data` в вашем контроллере. Например:

   ```php
   if (Yii::$app->request->isPost) {
       $model->load(Yii::$app->request->post());
       
       // Данные машинки поля будут выглядеть следующим образом:
       // data = [
       //     [id_field1 => value1],
       //     [id_field2 => value2],
       // ]
       $fieldDataArray = $model->data;

       foreach ($fieldDataArray as $idField => $data) {
           // Сохранение каждого поля с его значением
           $fieldData = new Field_data();
           $fieldData->id_field = $idField;
           $fieldData->data = $data;
           $fieldData->save();
       }
   }
   ```

4. **Сохранение в базе данных:**

   В вашем цикле по массиву `fieldDataArray` вы создаете экземпляр `Field_data`, устанавливаете `id_field` и `data`, а затем сохраняете в базу данных.

### Заключение

Используя массивы в полях форм, вы можете легко передавать два параметра, такие как `id_field` и `data`, и обрабатывать их на стороне сервера. Это подход дает вам возможность в дальнейшем расширять свой функционал и добавлять новые типы полей без необходимости переписывать логику формы.
Добавьте просто скрытое поле для передачи id_field, а в основное поле передавайте только данные: 

<?php foreach ($fields as $field): ?>
    <?= Html::activeHiddenInput($model, "[$field->id]id_field", ['value' => $field->id]) ?>
    <?= $form->field($model, "[$field->id]data")->textInput(['value' => $model->data]) ?>
<?php endforeach; ?>


В результате вы получите примерно такую структуру post запроса:

Field_Data[1][id_field] = 1
Field_Data[1][data] = "значение поля 1"
Field_Data[2][id_field] = 2
Field_Data[2][data] = "значение поля 2"


А уже в контроллере обрабатывайте полученные поля как вам нужно:

if (Yii::$app->request->post('Field_Data')) {
    foreach (Yii::$app->request->post('Field_Data') as $fieldData) {
        $model = new FieldData();
        $model->id_field = $fieldData['id_field'];
        $model->data = $fieldData['data'];
        if ($model->validate()) {
            $model->save();
        }
    }
}
Похожие вопросы