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(); ?>