yii2 правила, не относящиеся к атрибутам не-db?

Я хотел бы загрузить несколько файлов одновременно. я имею

модель:

class KakiKingModel extends ActiveRecord {

    public $uploadedFiles;

    public function rules() {
        return [
            [['uploadedFiles'], 'file', 'extensions' => 'txt', 'checkExtensionByMimeType' => false, 'skipOnEmpty' => true, 'maxFiles' => 2]];
    }
    ...

контроллер:

use yii\web\UploadedFile;
...
public function actionUpload() {
    $model = new KakiKingModel;
    $t = new KakiKingModel;

    if (Yii::$app->request->isPost) {
        $files = UploadedFile::getInstances($model, 'uploadedFiles');

        $t = [];
        $i = 0;
        foreach ($files as $i => $file) {
            $t[$i] = new KakiKingModel;
            $t[$i]->contentUploadedFile = file($file->tempName);
            $t[$i]->assign(); // assign file content to model attributes
            $i++;
        }

        if (Model::validateMultiple($t)) {
            foreach ($t as $item) {
                $item->save(false);
            }
            return $this->redirect(['index']);
        } else {
            return $this->render('upload', [
                        'model' => $model,
                        't' => $t,
            ]);
        }
    }

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

Посмотреть:

$form = ActiveForm::begin([
    ....
    'options' => ['enctype' => 'multipart/form-data'],
    ...
        <?= $form->field($model, 'uploadedFiles[]')->fileInput(['multiple' => true]) ?>

и проблема в том, что он принимает любые другие типы файлов! Это почему? Что я делаю неправильно? Спасибо! ОБНОВЛЕНИЕ: Я немного изменил свой контент, чтобы вы могли лучше понять, почему меня беспокоит то, что он не работает. Должно работать ИМХО. Не могли бы вы мне помочь? Спасибо!

2 ответа

Правила проверки Yii2 применяются и к атрибутам модели, не относящимся к базе данных.

Я думаю, что есть две общие причины этой проблемы:

1) Убедитесь, что вы добавили правильно enctype для отправки файлов на сервер:

use yii\widgets\ActiveForm;

...

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

2) yii \ validators \ FileValidatorпсевдонимом file) работает только с экземплярами класса yii\web\UploadedFile (это абстракция нативного суперглобального массива $_FILES PHP), убедитесь, что вы присвоили правильное значение атрибуту до его проверки.

Для одного файла используйте \ yii\web\UploadedFile:: getInstance ():

use yii\web\UploadedFile;

...

$this->file = UploadedFile::getInstance($this, 'file');

Для нескольких файлов используйте \ yii\web\UploadedFile:: getInstance ():

use yii\web\UploadedFile;

...

$this->files = UploadedFile::getInstances($this, 'files');

Это можно сделать прямо перед звонком $model->save() или же $model->validate() или внутри beforeValidate() обработчик события:

/**
 * @inheritdoc
 */
public function beforeValidate()
{
    $this->files = UploadedFile::getInstances($this, 'files');

    return parent::beforeValidate();
}

Попробуйте так в своей модели:

    namespace app\models;

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

    /**
    * UploadForm is the model behind the upload form.
    */
    class UploadForm extends Model
    {
    /**
     * @var UploadedFile|Null file attribute
     */
   public $uploadedFiles;

    /**
     * @return array the validation rules.
     */
    public function rules()
    {
        return [
            [['uploadedFiles'], 'file'],
        ];
    }
    }
    ?>

Ввиду:

<?php
use yii\widgets\ActiveForm;

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

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

<button>Submit</button>

<?php ActiveForm::end(); ?>
Другие вопросы по тегам