【问题标题】:yii2 rules not applying to non-db attributes?yii2 规则不适用于非数据库属性?
【发布时间】:2016-01-25 18:49:35
【问题描述】:

我想一次上传多个文件。我有

一个模型:

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]) ?>

问题是,它也接受任何其他类型的文件!这是为什么?我究竟做错了什么?谢谢! 更新:我已经稍微改变了我的内容,这样你就可以更好地理解为什么我觉得它不起作用令人不安。恕我直言,它应该可以工作。你能帮我么?谢谢!

【问题讨论】:

    标签: forms validation yii2 rules modelattribute


    【解决方案1】:

    Yii2 验证规则也适用于非数据库模型属性。

    我认为这个问题有两个常见的原因:

    1) 确保添加正确的enctype 以将文件发送到服务器:

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

    2) yii\validators\FileValidatoraliasedfile)仅适用于 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-&gt;save()$model-&gt;validate()beforeValidate() 事件处理程序内部之前完成:

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

    【讨论】:

    • 好的,希望我能理解。所以问题是,不知何故,这个任务发生在我验证之后?但目前,此命令与if (Yii::$app-&gt;request-&gt;isPost) {... 语句相关联。也许是一个蹩脚的问题,但是我该如何将它与beforeValidate() 的东西混合起来......?
    【解决方案2】:

    在您的模型中尝试这种方式:

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

    【讨论】:

    • 我试过了,但不幸的是它没有任何作用。
    • 您遗漏了一些东西,请再次检查您的代码,然后尝试试运行。
    • 我错过了什么?我也试过没有[],但没有改变。
    猜你喜欢
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    • 2018-05-04
    • 1970-01-01
    相关资源
    最近更新 更多