0

В проекте yii2 у меня есть собственная настройка структуры файла. Все загруженные будут сохранены как тип файла. Я могу получить размер файла, используя файл, загруженный во временную папку yii2. Используя эти размеры, я устанавливаю свою собственную ширину и высоту и сравниваю их. Если высота и ширина больше, чем то, что я объявил, оно отображает сообщение об ошибке в форме. Который я не могу этого сделать.yii2 Размеры для проверки и отображения сообщения об ошибке в форме

Мой Active Form

<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> 

My Controller Action

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']); 
         } 
       } 
      } 
     } 
    } 

Как добавить сообщение об ошибке в контроллере и передать, что для отображения на моей форме на коробке модальной.

Примечание: моя форма отображается в коробке мода.

спасибо !!

+0

использование пользовательский проверка функционирование иона в правиле модели. –

ответ

0

Вы должны обработать обработку файлов в своей модели - или даже лучше, создать для этой цели определенную модель UploadForm. В этом случае вы можете использовать проверку файлов или специальный валидатор для установки ошибок во время проверки модели. Встроенный yii\validators\FileValidator дает вам множество правил проверки подлинности из коробки.

Это на самом деле очень хорошо объяснено в документации: Uploading Files

Смотрите также документации для 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; 
     } 
    } 
} 
+0

Нет проблемы здесь. У меня есть структура файловой структуры .. моя собственная .. И когда я загружаю файлы изображений, она будет сохранена как тип файла. Файлы в структуре файла могут быть любыми файлами, которые могут быть pdf, jpg и т. Д. Валидаторы файлов не имеют правил для ограничения размеров файла. Скажите, что мой файл - это файл изображения, который я хочу получить в размерах, сопоставляя их с размерами, которые я установил, и передайте ошибку, если размер больше заданного размера. –

+0

Извините, я неправильно понял, что ошибки не были видны в модели. Лучшим подходом было бы создать в этом случае собственный собственный валидатор файлов и использовать его в своей модели; вы можете создать его на 'FileValidator' и добавить свои собственные проверки там – jlapoutre

0

Попробуйте это правило проверки

['imageFile', 'image', 'minWidth' => 250, 'maxWidth' => 250,'minHeight' => 250, 'maxHeight' => 250, 'extensions' => 'jpg, gif, png', 'maxSize' => 1024 * 1024 * 2], 
+0

Это невозможно, потому что я использую fileValidator. fileValidator не имеет атрибутов minWidth и maxHeight. –

+0

исправлено: по моей ошибке, вместо этого вы можете использовать функцию проверки изображений. –