ethna の regexp チェックは VAR_TYPE_FILE属性の時は効かないので custom で実装してみる。
class APPID_ActionForm extends Ethna_ActionForm{ var $form_template = array( 'uploadName' => array( 'name' => 'アップロードファイル', 'required' => false, /// 各アクションフォームで必須に 'form_type' => FORM_TYPE_FILE, 'type' => VAR_TYPE_FILE, 'max' => '10000', /// 10000KBまで 'custom' => 'checkFile', 'extension' => array( 'zip', 'lzh' ), 'regexNG' => '[^\.a-z0-9_-]+', 'regexp_error' => 'ファイル名に禁止文字が含まれています', ), ... ); ... /** * カスタムチェックメソッド: アップロードファイルをチェックする * 拡張子制限 * 禁止文字正規表現制限 * * @access public * @param string $name フォーム項目名 * @return object Ethna_Error エラーオブジェクト(エラーが無い場合はnull) */ function &checkFile( $name ){ $form_vars = $this->check( $name ); if ($form_vars == null) { return null; } /// 拡張子制限 $fileRequest = $_FILES[$name]['name']; if( array_key_exists( 'extension', $this->form[$name] ) ){ $extension = $this->form[$name]['extension']; if( ! eregi( '('.implode(')|(',$extension).')$', $fileRequest ) ){ return $this->action_error->add( $name, "{form}は拡張子「".implode('」「',$extension)."」形式のみです" ); } } /// 禁止文字正規表現制限 if( array_key_exists( 'regexNG', $this->form[$name] ) ){ $regexNG = $this->form[$name]['regexNG']; if( array_key_exists( 'regexp_error', $this->form[$name] ) ){ $regexp_error = $this->form[$name]['regexp_error']; } if( eregi( $regexNG, $fileRequest ) ){ return $this->action_error->add( 'uploadName', $regexp_error, E_FORM_REGEXP ); } } return null; } }あとは、各アクションで
class APPID_Form_Upload extends APPID_ActionForm{ ... var $form = array( ... 'uploadName' => array( 'required' => true, ), ... ); } class APPID_Action_Upload extends APPID_ActionClass{ ... function prepare(){ ... if( 0 < $this->action_form->validate() ){ return 'form_fileUpload'; } ... return null; } ... function perform(){ /// アップロードファイルの具体的な処理 } }とすればOK。 追記(2009/03/21):/blog/remix/2009/03/post_174.html