0

在 yii2 项目中,我有自己的文件结构设置。上传的任何内容都将保存为文件类型。我可以使用 yii2 上传到 temp 文件夹中的文件来获取文件尺寸。使用这些尺寸,我设置自己的宽度和高度并进行比较。如果高度和宽度大于我声明的值,它会在表单中显示错误消息。我无法做到这一点。

我的活动表格

<div class="company-form">

    <?php
    $form = ActiveForm::begin([
        'action'=>['company/logo', 'id'=>$model->company_id],
        'validateOnSubmit' => true,
        'options' => 
            ['enctype' => 'multipart/form-data','class' => 'disable-submit-buttons','id'=> 'companyLogoForm'],
            'fieldConfig' => [
                'template' => "<div class=\"row\">
                <div class=\"col-xs-6 margin-top-8\">{label}</div>\n<div class=\"col-xs-6 text-right\">{hint}</div>
                \n<div class=\"col-xs-12 \">{input}</div>
                </div>",               
            ],                                        
    ]); ?>

    <?= $form->errorSummary($model, $options = ['header'=>'','class'=>'pull-left']); ?>

    <?= $form->field($model, 'company_name')->hiddenInput(['maxlength' => true])->label(false) ?>

    <?= $form->field($file, 'file')->fileInput([])->label(Yii::t('app', 'Attach Logo'),['class'=> 'margin-top-8']) ?>

    <div class="form-group">
        <?= Html::submitButton($model->isNewRecord ? Yii::t('app', 'Save') : Yii::t('app', 'Save'), ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary','data' => ['disabled-text' => 'Please Wait']]) ?>
    </div>

    <?php ActiveForm::end(); ?>

</div>

我的控制器动作

public function actionLogo($id)
    {
        $model = $this->findModel($id);

        if ($model->load(Yii::$app->request->post()) && $model->validate()) {

            $file = new File;
            $file->load(Yii::$app->request->post());
                $a = UploadedFile::getInstance($file,'file');
                $size = getimagesize($a->tempName);
                $maxWidth = 500;
                $maxHeight = 500;
                if ($size[0] > $maxWidth || $size[1] > $maxHeight)
                    {
                        $model->addError('file', $error = 'Error Message');
                      if($model->hasErrors()){
                          return ActiveForm::validate($model);
                      }

                    }

                $file->file = UploadedFile::getInstance($file,'file');
                $file->file_name = $file->file->name;
                $file->file_user = Yii::$app->user->id;
                $file->file_type = 1;

                if($file->save()){
                    $file->file_path = Files::getFilePath($file->file_id);
                    $validDir = $file->file->createFileDir($file->file_path, $file->file_id);

                    if($validDir){
                        $file->file->saveAs($file->file_path, false);
                        if($file->save()){
                            $model->company_file = $file->file_id;
                            $model->save();
                            return $this->redirect(['index']);
                        }
                }
            }
        }
    }

如何在控制器中添加错误消息并将其传递给我在模态框中的表单上显示。

注意:我的表单显示在模态框上。

谢谢!!

4

2 回答 2

0

您应该在您的模型中处理文件 - 或者更好的是,UploadForm为此目的创建一个特定模型。在这种情况下,您可以使用文件验证或自定义验证器在模型验证期间设置错误。内置yii\validators\FileValidator为您提供了很多开箱即用的 pf 验证规则。

这实际上在文档中得到了很好的解释:上传文件

另请参阅FileValidator的文档

验证上传的图像文件的示例:

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;
        }
    }
}
于 2016-09-21T09:29:28.257 回答
0

试试这个验证规则

['imageFile', 'image', 'minWidth' => 250, 'maxWidth' => 250,'minHeight' => 250, 'maxHeight' => 250, 'extensions' => 'jpg, gif, png', 'maxSize' => 1024 * 1024 * 2],
于 2016-09-21T09:43:55.493 回答