作成したフィルタの導入例
作成したフィルタはGlobalFilterList.class.phpで、以下のように指定すると全てのモジュールに対して適用されます。
$this->filters[‘MappingRequestVarsFilter’] =& new MappingRequestVarsFilter;
$this->filters[‘OptimizeRequestVarsFilter’] =& new OptimizeRequestVarsFilter;
作成したフィルタはGlobalFilterList.class.phpで、以下のように指定すると全てのモジュールに対して適用されます。
$this->filters[‘MappingRequestVarsFilter’] =& new MappingRequestVarsFilter;
$this->filters[‘OptimizeRequestVarsFilter’] =& new OptimizeRequestVarsFilter;
入力データのトリミングを一括処理するフィルタの例。
class OptimizeRequestVarsFilter extends Filter
{
function execute (&$filterChain, &$controller, &$request, &$user)
{
static $loaded;
if($loaded===NULL){
$loaded=true;
$params=$request->getParameters();
foreach($params as $tmpKey => $tmpValue){
if(is_array($request->getParameter($tmpKey))){
//
}else{
$request->setParameter($tmpKey,trim($tmpValue));
}
}
$filterChain->execute($controller,$request,$user);
}else{
$filterChain->execute($controller,$request,$user);
}
}
}
これを登録して使用しています。簡単だけど結構便利。
久保敦啓さんがインプレスのPHPムック本「まるごとPHP」に書かれていたフィルタです。
mojaviではユーザからの入力を$requestで一元管理しているけれど、HTML_QuickFormでは$_POST、$_GETで管理しているため、以下のフィルタを使うとよいとのこと。
class MappingRequestVarsFilter extends Filter
{
function execute(&$filterChain, &$controller, &$request, &$user)
{
static $loaded;
if ($loaded === null) {
$loaded = true;
if ($_SERVER[‘REQUEST_METHOD’] === ‘GET’) {
$_GET = array();
$_GET = &$request->getParameters();
} else {
$_POST = array();
$_POST = &$request->getParameters();
}
$filterChain->execute($controller, $request, $user);
} else {
$filterChain->execute($controller, $request, $user);
}
}
}
mojavi + QuickForm で独自ルールを追加する際のサンプル。
ここではユーザID登録のように、データベースと一意性を絡めたルールを追加した。
仮定:データベースへの接続はPearのDBを使用
—————————————————
function initialize(&$controller, &$request, &$user){
//親クラスinitialize関数を呼び出す
parent::initialize(&$controller, &$request, &$user);
//親クラスで定義したDBオブジェクトを変数に格納
$mydb=$request->getAttribute(‘mydb’);
$myForm=new HTML_QuickForm(‘myForm’,’post’);
$myForm->addElement(‘text’,’userID’,’ユーザID’);
$myForm->registerRule(‘idCheck’,’callback’,’_idCheck’,get_class($this));
$myForm->addRule(‘userID’,’そのIDは使用中です’,’idCheck’,$mydb);
}
function _idCheck($value,$mydb){
$sql=”SELECT user_id FROM tbl_user WHERE user_id='” . $value . “‘;”;
$result=$mydb->query($sql);
if(DB::isError($result)){
return false;
}elseif($result->numrows()>0){
return false;
}else{
return true;
}
}
これでできるはず。