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.2.1の修正箇所。処理の調整です。


ファイルのアップロード処理を行うコンポーネント「My_Form_File」
ですが、これは複数のファイルをアップロードしようとする場合、
何箇所か関連する処理をファイルの件数分だけ記述しないとならない問題がありました。

これを修正し、インスタンス内にアップロードするファイル情報を保存して、
以降は対応するメソッド一つで処理が実行できるようにしました。

具体的には次の通りです。
ここではサンプルプログラムの
「application/modules/admin/controllers/ProductsController.php」
内のコードを例に取ります。

private function initFileInstance(){
    $file = new My_Form_File();

    // 追加したメソッドはsetTmpField。
    $file->setField('products', array('file_s', 'file_l'));
    $file->setTmpField(array('file_name_tmp_s' => 'file_s', 'file_name_tmp_l' => 'file_l'));
    $file->addValidator('NotExists', $file->getFileDir());
    $file->addValidator('Extension', array('jpg', 'gif', 'png'));

    return $file;
}

My_Form_Fileのインスタンスを初期化する処理内で、
一時保存用の情報を追加するようにしてあります。

// 修正前、addAction中の処理
$file_info = $file->getFileInfo();
if(!empty($file_info['file_s']['name'])){
    $post_data['file_s'] = $file_info['file_s']['name'];
}else{
    $post_data['file_s'] = '';
}
if(!empty($file_info['file_l']['name'])){
    $post_data['file_l'] = $file_info['file_l']['name'];
}else{
    $post_data['file_l'] = '';
}

// 修正後
$file_info = $file->getFileInfo();
$post_data = array_merge($post_data, $file->getFileName($file_info));

post情報中にアップロードしたファイル名をセットする処理ですが、
元々は上に書かれている処理のようにアップロードするファイルが増える度に
同じ記述を繰り返す必要がありました。
これをgetFileName()メソッドでまとめて取り出せるように修正しました。

// 修正前、addAction中の処理
if($file_valid !== true){
    $file_error_message = $file->getErrorMessages();

    if(!empty($file_error_message['file_s'])){
        $error_msg['file_s'] = current($file_error_message['file_s']);
    }
    if(!empty($file_error_message['file_l'])){
        $error_msg['file_l'] = current($file_error_message['file_l']);
    }
    throw new Zend_Validate_Exception();
}

// 修正後
if($file_valid !== true){
    $error_msg = array_merge($error_msg, $file->getEachErrorMessages());
    throw new Zend_Validate_Exception();
}

ファイルのバリデーションでエラーがあった場合、
エラーメッセージをセット処理です。
これもファイルごとに処理を繰り返す必要があったのを
getEachErrorMessages()メソッドのみでまとめて取り出せるように修正しました。

// 修正前、addAction中の処理
$post_data['file_name_tmp_s'] = $file->uploadFileTmp('file_s');
$post_data['file_name_tmp_l'] = $file->uploadFileTmp('file_l');

// 修正後
$post_data = array_merge($post_data, $file->uploadFilesTmp());

アップロードしたファイルを一時保存する処理です。
ZF-Exでは登録処理を確認(confirm)、本登録(complete)の2段階に対応しているため、
確認時のために一時保存しているのがこの部分です。

ここもファイルごとに処理を記述していたところを、
uploadFilesTmp()メソッド1回で行うよう修正してあります。

// 修正前、addAction中の処理
if(!empty($post_data['file_name_tmp_s'])){
    $file->moveTmpFile($post_data['file_name_tmp_s'], $post_data['file_s']);
}
if(!empty($post_data['file_name_tmp_l'])){
    $file->moveTmpFile($post_data['file_name_tmp_l'], $post_data['file_l']);
}

// 修正後
$file->moveTmpFiles($post_data);

一時保存したファイルを正式な公開用ディレクトリに移動する処理です。
こちらも同様に1回のメソッド呼び出しで行うようにしてあります。

また、ドキュメントの「My_Form_File
にも複数ファイルアップロード時の処理について書かれているので、そちらも参照下さい。


ファイルアップロードに関わる処理を調整してると
次々と修正したい箇所が見えてきて、ここはまだまだ手直しの余地があると思う次第。

TrackBack URL :

Leave a comment  

name

email

website

Submit comment