Your browser (Internet Explorer 6) is out of date. It has known security flaws and may not display all features of this and other websites. Learn how to update your browser.
X
Post

[タスク] My_Form_Fileでファイルのファイル必須のバリデーション条件を追加

ver 0.0.7の修正箇所。中規模の機能拡張です。



こちらも前の記事で書いたように、
Zend Frameworkの方でisValidを使用すると必ず必須チェックが行われるため、
それを外すための修正になります。



NotEmptyのバリデーションチェックを追加しました。
NotEmptyがセットされておらず、
かつファイルがアップロードされていない時にはisValidを実行しないようになっています。

なお、NotEmptyのバリデーションファイル内は次のようになっています。

class My_Validate_File_NotEmpty extends Zend_Validate_Abstract
{

    public function __construct($options = null)
    {
        return true;
    }

    public function isValid($value)
    {
        return true;
    }
}

見て分かるように中で入力チェックは行わず、常にtrueを返すようになっています。
これはクラス内でバリデーションを行うのではなく、
このバリデーションがセットされているかによってisValidを実行するか判定するためです。
My_Form_FileのisValidは次のようになっています。

public function isValid($files = null){

    if(!empty($files)){
        $target_files = $files;
        if(!is_array($target_files)){
            $target_files = explode('', $target_files);
        }
    }else{
        $file_info = $this->getFileInfo();

        foreach($file_info as $key => $value){
            if($value['error'] != UPLOAD_ERR_NO_FILE || in_array('My_Validate_File_NotEmpty', $value['validators'])){
                $target_files[] = $key;
            }
        }
    }

    $result = true;
    foreach($target_files as $target_file){
        if(!$this->_adapter->isValid($target_file)){
            $this->setErrorMessages($target_file, $this->_adapter->getErrors());
            $result = false;
        }
    }
       
    return $result;
}

ファイルのエラーがUPLOAD_ERR_NO_FILEであり、
かつMy_Validate_File_NotEmptyがセットされていない時には
バリデーションを実行しないようになっています。
これはZend_File_TransferのisValidにおいて、
UPLOAD_ERR_NO_FILEを除外する方法が(ライブラリ直接修正以外に)
見当たらなかったための措置です。

NotEmptyがセットされていればisValidは実行されますが、
Zend_File_TransferのisValidのエラーコードチェックにより
UPLOAD_ERR_NO_FILEが検出されるため、
My_Validate_File_NotEmptyで改めてチェックをする必要がないと判断しました。

そのため、NotEmptyはisValid関数を実行するかの判定フラグとして使用しており、
実際の入力チェックでは常にtrueを返すようにしてあります。


かなりイレギュラーな動作をするバリデーションになってしまいましたが、
元々が「ファイルのアップロード必須な挙動を、必須と任意の切り替えを可能にする」
という事で、普通のバリデーションとは目的が異なるためにこのようになりました。


この件は「My_Form_File」のドキュメント内、
「必須チェックについて」の項目に記述されています。

TrackBack URL :

Leave a comment  

name

email

website

Submit comment