Yii2在另一个模型上多次上传

时间:2018-06-03 20:57:08

标签: yii2

我需要帮助构建一个包含多个附件的简单协议表单,用户可以在以后更改这些附件(文件)。也就是说,附件必须绑定到协议。

(在这种情况下,我创建了2个表:mod_protocolmod_files

我的代码应该如何保留,以便在插入新表单时,将此表单的附件写入mod_files表? (我不确定如何构建一个循环来编写文件)

我正处于这个项目的开始阶段,请查看我的文件:

协议表格

<div class="protocol-form">

    <?php $form = ActiveForm::begin(); ?>

    <?= $form->field($model, 'title')->textInput(['maxlength' => true]) ?>

    <?= $form->field($model, 'description')->textarea(['rows' => 8]) ?>

    <?= $form->field($model, 'files[]')->fileInput(['multiple' => true,]) ?>


    <div class="form-group">
        <?= Html::submitButton($model->isNewRecord ? 'Save' : 'Save', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
    </div>

    <?php ActiveForm::end(); ?>

</div>

协议模型

<?php

namespace app\modules\protocol\models;

use Yii;

class Protocol extends \yii\db\ActiveRecord
{
    public static function tableName()
    {
        return 'mod_protocol';
    }

    public function rules()
    {
        return [
            [['name'], 'required'],
            [['name','description'], 'string', 'max' => 200],
        ];
    }

    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'name' => 'Nome',
            'description' => 'Descrição'
        ];
    }

}

协议控制器

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

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

文件模型

<?php

namespace app\modules\protocol\models;

use Yii;

class Files extends \yii\db\ActiveRecord
{
    public static function tableName()
    {
        return 'mod_files';
    }

    public function rules()
    {
        return [
            [['filename','protoco_id'], 'safe'],
        ];
    }

    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'filename' => 'Nome do Arquivo',
            'protoco_id' => 'Protocolo'
        ];
    }

}

1 个答案:

答案 0 :(得分:1)

所以如果file是一个数组:

use yourapp/model/ModFile;
...
public function actionCreate()
{
    $model = new Protocol();

    // I would write some logic, verify this saves first.
    foreach($model->files as $file) {
       $model_file = new ModFile();
       $model_file->file = $file;
       $model_file->save();
    }

    // If successful then save the main model.
    if ($model->load(Yii::$app->request->post()) && $model->save()) {
        return $this->redirect(['view', 'id' => $model->id]);
    } else {
        return $this->render('create', [
            'model' => $model,
        ]);
    }
}