Pertanyaan Yii2 menyimpan larik bidang formulir ke bidang basis data tunggal


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

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 melalui larik dan menyimpan serta menyimpan bidang normal lainnya dalam 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
2018-05-02 12:04


asal


Jawaban:


Dalam kasus saya, saya tidak perlu melakukan perubahan pada controller sama sekali.

Anda bisa membuat bidang dalam catatan db Anda, sesuatu seperti 'config_json` dan kemudian menentukan 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 mengatur properti virtual Anda agar aman dalam aturan sehingga pekerjaan Penugasan Besar.

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
2018-01-08 10:00



Anda dapat menggunakan loadMultiple (), lihat ini

ini adalah tentang input tabular / multiple.

Jika tidak, muat modal yang Anda butuhkan menggunakan load ($ _ POST [your_form_name].


2
2018-05-02 16:30



$form->field($form, 'email[]')->textInput(['id' => 'email-0']);

akan membuat:

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

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


0
2018-03-16 22:50



model

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

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

pengontrol

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,
    ]);
}

0
2018-04-25 10:23



alih-alih menyimpan dalam array Anda dapat menyimpan dalam string, untuk itu gunakan variabel tne normal pada tampilan, mis: fieldofarray sebagai gantinya fieldofarray[],

dan dalam pengontrol 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:39