🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

Q&A

解決済

1回答

1431閲覧

input type="file"を含むフォームで、Validationクラスの必須チェックが上手くできない

AkihiroIshii

総合スコア67

FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

0グッド

0クリップ

投稿2019/10/17 10:54

目的

FuelPHPでファイルをアップロードするためのフォームを作成しています。
ファイルを選択せずにsubmitするのを防ぐために、type="file"のフィールドにValidationクラスの必須チェックadd_rule('required')を付与しています。

質問

ファイルを選択せずにsubmitしようとすると必須チェックが上手く機能するのは確認できましたが、ファイルを選択してもバリデーションチェックNGの処理(下記コードの(★★★)部分)に入ってしまいます。
原因がわかる方がいましたら、ご指摘いただけると助かります。

ブラウザで見たフォームのイメージ

下記のようにファイルを選択してsubmit(アップロード)した場合も、バリデーションチェックNGの処理(下記コードの(★★★)部分)に入ってしまいます。
イメージ説明

コントローラの内容

PHP

1class Controller_Csv extends Controller_Template 2{ 3 public function action_index() 4 { 5 $form_data = ''; 6 7 //フォームを作成(type="file"のフィールドを含む) 8 $form = Fieldset::forge('csvform', array( 9 'form_attributes' => array( 10 'enctype'=>'multipart/form-data', 11 'class'=>'p-form' 12 ) 13 ) 14 ); 15 16 //フォームに項目を追加(type="file"と"submit"のみ) 17 $form->add('csvfile', '', array('type'=>'file', 'placeholder'=>'CSVファイル')) 18 ->add_rule('required'); //ファイル必須チェックを付与 19 $form->add('submit', '', array('type'=>'submit', 'value'=>'アップロード')); 20 21 //POST送信された場合 22 if(Input::method() === 'POST') 23 { 24 $val = $form->validation(); 25 26 //バリデーションチェックOKの場合 27 if($val->run()) 28 { 29 var_dump('OK'); 30 31 //バリデーションチェックNGの場合(★★★) 32 } 33 else 34 { 35 var_dump('NG'); 36 } 37 } 38 39 //ビューを作成 40 $this->template->head = View::forge('layout/head'); 41 $this->template->header = View::forge('layout/header'); 42 $this->template->footer = View::forge('layout/footer'); 43 $this->template->content = View::forge('contents/csv'); 44 $this->template->set_global('csvform', $form->build(''), false); 45 $this->template->set_global('form_data', $form_data); 46 } 47}

試したこと

type="file"の代わりにtype="text"の項目にした場合は、テキストボックスに入力してsubmitするとバリデーションOKの処理に入れました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

Validationクラスではなく、Uploadクラスのis_validメソッドを使うことで解決しました。

・FuelPHP Uploadクラスのドキュメント
http://fuelphp.jp/docs/1.8/classes/upload/usage.html

具体的には、add_rule('required')をフィールドに付与するのをやめて、バリデーションの判定条件をUpload::is_valid()がtrueであることにしました(下記コード★の箇所)。

PHP

1 //フォームに項目を追加(type="file"と"submit"のみ) 2 $form->add('csvfile', '', array('type'=>'file', 'placeholder'=>'CSVファイル')); 3 //->add_rule('required'); //(★)削除 4 $form->add('submit', '', array('type'=>'submit', 'value'=>'アップロード')); 5 6 //POST送信された場合 7 if(Input::method() === 'POST') 8 { 9 //$val = $form->validation(); //(★)削除 10 11 //バリデーションチェックOKの場合 12 //if($val->run()) (★)削除 13 if(Upload::is_valid()) //(★)追加 14 { 15 var_dump('OK'); 16 17 //バリデーションチェックNGの場合 18 } 19 else 20 { 21 var_dump('NG'); 22 } 23 }

Validationクラスのような警告は出せませんが、Sessionクラスのset_flashメソッドでエラーメッセージをViewに渡して表示する対応にて代替することにします。

投稿2019/10/17 14:19

AkihiroIshii

総合スコア67

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問