2016-01-25 3 views
4

Я бы хотел загрузить сразу несколько файлов. У меня естьПравила yii2 не применяются к атрибутам non-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]) ?> 

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

ответ

1

Попробуйте этот путь в вашей модели:

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

Я пробовал, но, к сожалению, это не имеет значения. – user2511599

+0

у вас пропало что-то плз проверить код еще раз, и попытаться сушить пробег. –

+0

что мне не хватает? Я тоже пробовал без '[]', но никаких изменений. – user2511599

4

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

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

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

use yii\widgets\ActiveForm; 

... 

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

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

Для одноразового использования файла \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(); 
} 
+0

Я думаю, у меня есть все это, и, к сожалению, все еще не работает ... – user2511599

+0

ладно, надеюсь, я это понимаю. Итак, проблема в том, что каким-то образом это назначение происходит ** после ** проверки мной? Но на данный момент эта команда привязана к 'if (Yii :: $ app-> request-> isPost) {...' statement. Может быть, хромой вопрос, но как я могу его смешивать с этой функцией beforeValidate()? – user2511599