YUI2.7.0のEditable Table(編集可能な表)でのバリデーション(その2:バリデータを自作する)
今回は、DataTableの「セルエディタ(Cell Editor)に設定するバリデータ(validator)」を自作してみる。
YAHOO.widget.DataTable.validateNumberのソースを見ると、以下のように書けばいいことがわかる。
- 引数として入力値をとる関数
- 引数を検証し、OKならoData、NGならundefinedを返す
前回のログで作ったサンプルに、「null値(未入力)チェック」を仕掛けてみる。列のdefaultValueには「入力してください.」と入力のガイドをいれてみた(下の図)。
上の画面(の入力フィールド)をそのままSavaすると、「入力してください」というガイドが、表に一時保管されてしまうので注意。これを消してSaveすると、セルエディタには「入力してください」という初期値が設定され(エラーメッセージの代わりにもなる)、セルエディタが閉じない。これとは別に、エラーメッセージを、表の上に赤字で表示してみた(下図)。
以下が、HTMLの全文。validateRequiredが、自作したバリデータになっている。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>DataTable Validate</title> <style type="text/css"> </style> <link rel="stylesheet" type="text/css" href="../scripts/lib/yui/build/fonts/fonts-min.css" /> <link rel="stylesheet" type="text/css" href="../scripts/lib/yui/build/paginator/assets/skins/sam/paginator.css" /> <link rel="stylesheet" type="text/css" href="../scripts/lib/yui/build/datatable/assets/skins/sam/datatable.css" /> <script type="text/javascript" src="../scripts/lib/yui/build/yahoo-dom-event/yahoo-dom-event.js"></script> <script type="text/javascript" src="../scripts/lib/yui/build/animation/animation.js"></script> <script type="text/javascript" src="../scripts/lib/yui/build/element/element.js"></script> <script type="text/javascript" src="../scripts/lib/yui/build/paginator/paginator-min.js"></script> <script type="text/javascript" src="../scripts/lib/yui/build/datasource/datasource-min.js"></script> <script type="text/javascript" src="../scripts/lib/yui/build/datatable/datatable-min.js"></script> <style type="text/css" id="defaultstyle"> #main { margin: 2px; padding: 3px; } .ez_error { /* red(エラー用) */ color:#ff0000; } </style> <script type="text/javascript" src="data.js"></script> <script type="text/javascript"> EzTable = function() { var myDataSource; var myDataTable; var Dom = YAHOO.util.Dom; // null値検証 var validateRequired = function(oData){ if(oData == null || oData.length == 0){ // エラーの場合、undefindを返せばいい。 Dom.get('ez_error_res').innerHTML = '入力してください.'; return undefined; } return oData; } return { /** * 初期処理 */ init: function() { // DataTable用:列定義 var myColumnDefs = [ { key:"areacode", label:"コード", width:50, resizeable:true, sortable:true}, { key:"state", label:"都道府県", width:150, resizeable:true, sortable:true}, { key:"notes", label:"メモ (編集可)", editor:new YAHOO.widget.TextboxCellEditor( { validator:validateRequired, defaultValue:'入力してください.' } ), resizeable:true, sortable:true} ]; // DataTable用:コンフィグ属性 var myConfigs = { sortedBy:{key:"areacode",dir:"asc"}, paginator: new YAHOO.widget.Paginator({ rowsPerPage: 10, template: YAHOO.widget.Paginator.TEMPLATE_ROWS_PER_PAGE, rowsPerPageOptions: [10,25,50,100], pageLinks: 5 }), caption:"都道府県" }; // DataSourceのインスタンス化 myDataSource = new YAHOO.util.DataSource(Data.areacodes); myDataSource.responseType = YAHOO.util.DataSource.TYPE_JSARRAY; myDataSource.responseSchema = { fields: ["areacode","state"] }; // DataTableのインスタンス化 myDataTable = new YAHOO.widget.DataTable("table1", myColumnDefs, myDataSource, myConfigs); // クリックでハイライトするようにハンドラを設定 myDataTable.subscribe("rowClickEvent", myDataTable.onEventSelectRow); /* * セルの処理 */ // ダブルクリックでセルのエディターを呼ぶ。 myDataTable.subscribe("cellDblclickEvent", myDataTable.onEventShowCellEditor); }, // initの終わり oDS: myDataSource, oDT: myDataTable }; }(); </script> </head> <body class=" yui-skin-sam" onload="EzTable.init()"> test_datatable_validate2 <br> <div id="main"> <p>いくつかのオプションを加えたサンプルです。<br/> 編集可能な部分はダブルクリックで変更できます。</p> <div id="ez_error_res" class="ez_error"></div> <div id="table1"></div> <div id="result"></div> </div> </body> </html>