* 正規表現による入力チェック&差し戻し機能付きTracker [#zf572d85] - ページ: [[BugTrack2]] - 投稿者: [[TNG爆薬]] - 優先順位: 低 - 状態: 提案 - 状態: 保留 - カテゴリー: プラグイン - 投稿日: 2006-12-08 (金) 22:46:34 - バージョン: ** 概要 [#y0235208] ネットで買い物とか企業サイトの登録とかしようとすると必ずある機能~ 入力にエラーがあるとメッセージとともに再入力させられます ** ダウンロード [#n20032e9] [[tracker.inc.php.txt:http://cybercrypt.nm.land.to/files/pukiwiki/plugin/tracker.inc.php.txt]] ** 設定 [#v4432781] 設定ページに多少の追記が必要。以下に例を示します // *** 定義サンプル [#nee0756a] > * fields |項目名|見出し |形式|オプション|デフォルト値 |チェック |h |text |テキスト|text|20 |textのデフォルト値|not null,numeric| |page |ページ |page|20 |pageのデフォルト値|numeric,0or1| > * check |チェック名|正規表現 |表示メッセージ |h |not null |^(.+)$ |空白はダメ | |numeric |^([0-9]*)$|数字で入力してください| |0or1 |^(0[[]]1)$|0か1 | *** ソース [#ud5b13ab] * fields |項目名|見出し |形式|オプション|デフォルト値 |チェック |h |text |テキスト|text|20 |textのデフォルト値|not null,numeric| |page |ページ |page|20 |pageのデフォルト値|numeric,0or1| * check |チェック名|正規表現 |表示メッセージ |h |not null |^(.+)$ |空白はダメ | |numeric |^([0-9]*)$|数字で入力してください| |0or1 |^(0[[]]1)$|0か1 | ** メッセージ [#n09ff48f] 苦しい点としては、以下の2つがあります + 正規表現の中で用いられるORの記号'|'が表崩れの原因となる~ → 正規表現で用いられることの無い表現'[[]]'を用いて評価直前で置換している + checkという文字列を取ってしまったので、同名のフィールドが定義できない(定義できても、オプション設定ができない)~ → おそらくfieldsと同じ状態 // 新たに異なるファイル名にすると定数定義や関数名変更が面倒なのでそのままにしました。 オリジナルのバックアップを取ってから上書きしてから使ってみてください -------- - バグ報告です。フォーム設置ページと、投稿記事の親ページが異なる場合(第二引数で親ページを指定した場合)、差し戻し時に作成されるページが設置ページの階層化になってしまいます。 -- &new{2006-12-19 (火) 12:00:39}; - バグ報告ありがとうございます。多忙に付き放置しておりましたが、本日対策完了致しました。 -- [[TNG爆薬]] &new{2007-01-28 (日) 22:29:19}; - やっぱり差分をアップします -- [[TNG爆薬]] &new{2007-03-25 (日) 02:04:09}; 148a149,245 > // Check by regular expression - add from here -----> > > $error_flags = array(); > foreach (array_keys($fields) as $key) > { > // 送信された値を取得 > $value = array_key_exists($key,$_post) ? $_post[$key] : ''; > > $error_flags[$key] = ''; > > // カンマで区切られ、いくつも指定されたチェックのIDを取得 > $check = split(",", $fields[$key]->check); > foreach ($check as $checkid) { > > // チェックのリストにヒットするか > foreach ($config->get('check') as $check_cond) > { > if ($checkid == $check_cond[0]) { > // '|' を表に入れると崩れるので、正規表現で使用しな い'[[]]'で表し、直前で置換する > if (!(ereg(str_replace('[[]]', '|', $check_cond[1]), $value))) { > $error_flags[$key] = $check_cond[0]; > } > break; > } > } > // 最初にヒットしたエラーだけを処理 > if ($error_flags[$key] != '') { > break; > } > } > } > > // 1つでもエラーがあるか > $error = false; > foreach ($error_flags as $error_flag) { > $error = $error || ($error_flag != ''); > } > > if ($error) { > > $retval = convert_html(plugin_tracker_get_source($config->page.'/form')); > $hiddens = ''; > > foreach (array_keys($fields) as $name) > { > // 送信された値を取得 > $value = array_key_exists($name,$_post) ? $_post[$name] : ''; > > // 再入力しないで済むように送信された値をデフォルトに設定 > $fields[$name]->default_value = $value; > > // 自分に付け替え > if (is_a($fields[$name],'Tracker_field_submit')) { > $fields[$name]->page = $base; > } > > $replace = $fields[$name]->get_tag(); > > if (is_a($fields[$name],'Tracker_field_hidden')) > { > $hiddens .= $replace; > $replace = ''; > } else { > if ($error_flags[$name] != '') { > $mesasge = ''; > foreach ($config->get('check') as $check_cond) > { > if ($error_flags[$name] == $check_cond[0]) { > $message = $check_cond[2]; > break; > } > } > if (trim($message) == '') { > $message = 'error'; > } > $message = '<div><strong>' . $message . '</strong></div>'; > // スタイルシートに無いので自分で記述 > $replace = '<div class="error_message" style="background-color:#f66;padding:2px;">' > . $replace . $message . '</div>'; > } > } > $retval = str_replace("[$name]",$replace,$retval); > } > $reform = <<<EOD > <form enctype="multipart/form-data" action="$script" method="post"> > <div> > $retval > $hiddens > </div> > </form> > EOD; > > return array('msg'=>$refer, 'body'=>$reform); > } > > // Check by regular expression - add to here <----- > 259a357,359 > // Check by regular expression - add from here -----> > var $check; > // Check by regular expression - add to here <----- 270a371,373 > // Check by regular expression - add from here -----> > $this->check = $field[5]; > // Check by regular expression - add to here <----- #comment - [[pukiwiki:欲しいプラグイン/369]](trackerに入力必須チェックをつけたい) -- &new{2010-09-25 (土) 23:55:27}; //#comment