5 Pertanyaan: Yii2 menyimpan array bidang formulir ke bidang basis data tunggal

pertanyaan dibuat di Sat, May 2, 2015 12:00 AM

Bagaimana cara saya menyimpan array bidang di Yii2 pengaturan saat ini /default hanya berfungsi untuk bidang yang bukan array.

Di bawah ini adalah bidang formulir yang harus saya simpan ke dalam satu bidang:

 
<div class="repeat">
<table class="wrapper" width="100%">
    <thead>
        <tr>
            <td width="10%" colspan="4"><span class="add">Add</span></td>
        </tr>
    </thead>
    <tbody class="container">
    <tr class="template row">
        <td width="10%"><span class="move">Move</span></td>

        <td width="10%">An Input Field</td>

        <td width="70%">
            <?= $form->field($model, 'field1ofarray[{{row-count-placeholder}}]')->textInput(['maxlength' => 255])->label('Field Label') ?>
            <?= $form->field($model, 'fieldofarray[{{row-count-placeholder}}]')->textInput(['maxlength' => 255])->label('Som field') ?>
            <?= $form->field($model, 'field3ofarray[{{row-count-placeholder}}]')->textInput(['maxlength' => 255])->label('Field Label') ?>
            <?= $form->field($model, 'field4ofarray[{{row-count-placeholder}}]')->dropDownList(['instock' => 'Instock', 'soldout' => 'Sold Out', 'scheduled' => 'Scheduled']); ?>
        </td>

        <td width="10%"><span class="remove">Remove</span></td>
    </tr>
    </tbody>
</table>

Pengontrol Saat Ini (Saya perlu tahu bagaimana saya bisa mengulang array dan menyimpan serta menyimpan bidang normal lainnya di formulir saya):

 
public function actionCreate()
{
    $model = new GrailWall();

    if ($model->load(Yii::$app->request->post()) && $model->save()) {
        return $this->redirect(['view', 'id' => $model->id]);
    } else {
        return $this->render('create', [
            'model' => $model,
        ]);
    }
}
    
5
5 Jawaban                              5                         

Dalam kasus saya, saya tidak perlu melakukan perubahan apa pun pada controller.

Anda bisa membuat bidang dalam catatan db Anda, sesuatu seperti 'config_json` dan kemudian mendefinisikan properti virtual dengan pengambil dan penyetel dalam model Anda.

 
public function getConfig()
{
    return json_decode($this->config_json);
}

public function setConfig($value)
{
    $this->config_json = json_encode($value);
}

Juga atur properti virtual Anda agar aman dalam aturan sehingga Penugasan Masif berfungsi.

 
public function rules()
{
    return [
        [['company_id', 'created_at', 'updated_at'], 'integer'],
        [['class'], 'required'],
        [['config_json'], 'string'],
        [['class'], 'string', 'max' => 255],
        [['config'], 'safe']
    ];
}

Sekarang Anda dapat mengatur input seperti ini di tampilan Anda

 
<?= $form->field($model, 'config[ga_id]', ['labelOptions' => ['label' => 'Google Analytics Tracking ID']])->textInput(['maxlength' => true]) ?>
    
8
2016-01-08 10: 00: 16Z

Anda dapat menggunakan loadMultiple (), lihat ini

ini tentang input tabular /multipel.

Kalau tidak, muat modal yang Anda perlukan menggunakan memuat ($_ POST [nama_form_Anda].

    
2
2017-05-19 06: 55: 28Z

model

 
public function getNetworkTypeArray()
{
    return explode(',', $this->network_type);
}

public function setNetworkTypeArray(array $value)
{
    $this->network_type = implode(',', $value);
}

controller

 
public function actionUpdate($id)
{
    $model = $this->findModel($id);
    if ($model->load(Yii::$app->request->post())) {
        $model->setNetworkTypeArray($model->network_type);
        if ($model->save()) {
            return $this->redirect(['index']);
        }
    }

    $model->network_type = $model->getNetworkTypeArray();
    return $this->render('update', [
        'model' => $model,
    ]);
}
    
1
2017-04-25 10: 39: 53Z
 
$form->field($form, 'email[]')->textInput(['id' => 'email-0']);

akan merender:

 
<input type="text" name="Form[email][]" id="email-0">

Harap perhatikan tanda kurung kotak ganda di ($form, 'email[]'). Atribut ID harus ditetapkan secara unik unik, jika tidak, ID duplikat akan ditampilkan, yang tidak sesuai dengan standar W3C /javascript.

    
0
2016-03-16 22: 50: 29Z

alih-alih menyimpan dalam array, Anda dapat menyimpan dalam string, untuk itu menggunakan variabel tne seperti biasa dalam tampilan, mis:  fieldofarray sebagai gantinya fieldofarray[],

dan di controller menggunakan fungsi implode, mis:

 
  public function actionCreate()
    {
        $model = new someModel();

        if ($model->load(Yii::$app->request->post())) {
          $model->fieldofarray = implode (",",$model->fieldofarray);
          $model->save();

            return $this->redirect(['view', 'id' => $model->id]);
        } else {
            return $this->render('create', [
                'model' => $model,
            ]);
        }
    }
    
0
2017-07-01 06: 52: 15Z
sumber ditempatkan sini