можно ли загрузить файл в модели, которая наследуется от ActiveRecord в yii2?

Я сгенерировал модель с Gii из таблицы базы данных в yii2. Эта модель наследуется от ActiveRecord. затем я создал форму из этой модели. теперь я хочу загрузить файл с этой формой. можно ли загрузить файл той же модели (унаследованной от ActiveRecord)?

если да, то как? если нет, что я могу сделать?


person mojtaba.sln    schedule 30.07.2016    source источник
comment
обновите свой вопрос и покажите связанную модель, контроллер/действие и представление   -  person scaisEdge    schedule 31.07.2016


Ответы (1)


Да, это возможно, но лучше использовать отдельную форму. Это хорошо описано в официальной документации в статье Загрузка файлов.

Создать отдельную форму:

namespace app\models;

use yii\base\Model;
use yii\web\UploadedFile;

class UploadForm extends Model
{
    /**
     * @var UploadedFile
     */
    public $imageFile;

    public function rules()
    {
        return [
            [['imageFile'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg'],
        ];
    }

    public function upload()
    {
        if ($this->validate()) {
            $this->imageFile->saveAs('uploads/' . $this->imageFile->baseName . '.' . $this->imageFile->extension);
            return true;
        } else {
            return false;
        }
    }
}

Ввод файла рендеринга:

<?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]) ?>

    <?= $form->field($model, 'imageFile')->fileInput() ?>

    <button>Submit</button>

<?php ActiveForm::end() ?>

Настройте контроллер для обработки загрузки файлов:

namespace app\controllers;

use Yii;
use yii\web\Controller;
use app\models\UploadForm;
use yii\web\UploadedFile;

class SiteController extends Controller
{
    public function actionUpload()
    {
        $model = new UploadForm();

        if (Yii::$app->request->isPost) {
            $model->imageFile = UploadedFile::getInstance($model, 'imageFile');
            if ($model->upload()) {
                // file is uploaded successfully
                return;
            }
        }

        return $this->render('upload', ['model' => $model]);
    }
}

Загрузка нескольких файлов также рассматривается в этой статье.

Также см. этот связанный вопрос.

Если вы хотите использовать его с ActiveRecord и сохранить путь к файлу в качестве атрибута модели, вы можете добавить создание и сохранение модели в методе формы upload(). Еще одним хорошим примером работы с формами является SignupForm из расширенного шаблона:

<?php

namespace frontend\models;
use yii\base\Model;
use common\models\User;

/**
 * Signup form
 */
class SignupForm extends Model
{
    public $username;
    public $email;
    public $password;


    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            ['username', 'trim'],
            ['username', 'required'],
            ['username', 'unique', 'targetClass' => '\common\models\User', 'message' => 'This username has already been taken.'],
            ['username', 'string', 'min' => 2, 'max' => 255],
            ['email', 'trim'],
            ['email', 'required'],
            ['email', 'email'],
            ['email', 'string', 'max' => 255],
            ['email', 'unique', 'targetClass' => '\common\models\User', 'message' => 'This email address has already been taken.'],
            ['password', 'required'],
            ['password', 'string', 'min' => 6],
        ];
    }

    /**
     * Signs user up.
     *
     * @return User|null the saved model or null if saving fails
     */
    public function signup()
    {
        if (!$this->validate()) {
            return null;
        }

        $user = new User();
        $user->username = $this->username;
        $user->email = $this->email;
        $user->setPassword($this->password);
        $user->generateAuthKey();

        return $user->save() ? $user : null;
    }
}

Как видите, проверка и создание модели выделены в отдельную форму, это лучше, чем обрабатывать их непосредственно в модели (особенно при загрузке файлов). Но для простых целей использование только модели также может быть приемлемым.

person arogachev    schedule 01.08.2016
comment
Большое спасибо. Мой код генерирует ошибку, и я думаю, что это связано с моей моделью, которая наследуется от ActiveRecord. - person mojtaba.sln; 01.08.2016