0

yii2 プロジェクトでは、独自のファイル構造をセットアップしています。アップロードされたものはすべて、ファイル タイプとして保存されます。yii2 によって一時フォルダーにアップロードされたファイルを使用して、ファイルのサイズを取得できます。これらの寸法を使用して、独自の幅と高さを設定し、それらを比較します。高さと幅が私が宣言したものよりも大きい場合、フォームにエラーメッセージが表示されます。私にはそれができません。

私のアクティブなフォーム

<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 検証ルールが提供されます。

これは実際にはドキュメントでかなりよく説明されています: 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;
        }
    }
}
于 2016-09-21T09:29:28.257 に答える