正規表現による入力チェック&差し戻し機能付きTracker

  • ページ: BugTrack2
  • 投稿者: TNG爆薬?
  • 優先順位: 低
  • 状態: 保留
  • カテゴリー: プラグイン
  • 投稿日: 2006-12-08 (金) 22:46:34
  • バージョン:

概要

ネットで買い物とか企業サイトの登録とかしようとすると必ずある機能
入力にエラーがあるとメッセージとともに再入力させられます

ダウンロード

tracker.inc.php.txt

設定

設定ページに多少の追記が必要。以下に例を示します

定義サンプル

* fields

項目名見出し形式オプションデフォルト値チェック
textテキストtext20textのデフォルト値not null,numeric
pageページpage20pageのデフォルト値numeric,0or1

* check

チェック名正規表現表示メッセージ
not null^(.+)$空白はダメ
numeric^([0-9]*)$数字で入力してください
0or1^(0[[]]1)$0か1

ソース

* 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                  |

メッセージ

苦しい点としては、以下の2つがあります

  1. 正規表現の中で用いられるORの記号'|'が表崩れの原因となる
    → 正規表現で用いられることの無い表現'[[]]'を用いて評価直前で置換している
  2. checkという文字列を取ってしまったので、同名のフィールドが定義できない(定義できても、オプション設定ができない)
    → おそらくfieldsと同じ状態

新たに異なるファイル名にすると定数定義や関数名変更が面倒なのでそのままにしました。 オリジナルのバックアップを取ってから上書きしてから使ってみてください


  • バグ報告です。フォーム設置ページと、投稿記事の親ページが異なる場合(第二引数で親ページを指定した場合)、差し戻し時に作成されるページが設置ページの階層化になってしまいます。 -- 2006-12-19 (火) 12:00:39
  • バグ報告ありがとうございます。多忙に付き放置しておりましたが、本日対策完了致しました。 -- TNG爆薬? 2007-01-28 (日) 22:29:19
  • やっぱり差分をアップします -- TNG爆薬? 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 <-----
    

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-04-11 (水) 08:06:10
Site admin: PukiWiki Development Team

PukiWiki 1.5.2+ © 2001-2019 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u7. HTML convert time: 0.199 sec.

OSDN