以下のページでは save プロパティにPHPプログラムを指定することでデータ登録ができる説明をしました。
⇒JavaScript jQuery w2ui.grid を使ったグリッド処理・外部データへ登録(save)
この場合は PHP プログラムにデータの変更された部分のみが $_GET['request']['changes'] に配列データとして格納されます。 渡された $_GET['request']['changes'] に従ってレコード毎に個別に変更カラムデータを再設定しています。
今回は $_GET['request']['changes'] の内容を1レコード全てのカラムデータとして渡すことで PHP では1レコードを一括で処理する様に変更します。
尚、最初の読込ファイルは以下の様に以前のものと同様です。
■JSON 形式のテストデータ(data-get.json)
{
records: [
{ recid: 1, fname: "John" , lname: "Doe" , email: "jdoe@gmail.com", sdate: "2020/03/01" },
{ recid: 2, fname: "Stuart" , lname: "Motzart", email: "smot@gmail.com", sdate: "2020/03/12" },
{ recid: 3, fname: "Jin" , lname: "Franson", email: "jgra@gmail.com", sdate: "2020/03/13" },
{ recid: 4, fname: "Susan" , lname: "Ottie" , email: "sott@gmail.com", sdate: "2020/03/24" },
{ recid: 5, fname: "Kelly" , lname: "Silver" , email: "ksil@gmail.com", sdate: "2020/03/25" },
{ recid: 6, fname: "Francis", lname: "Gatos" , email: "fgat@gmail.com", sdate: "2020/03/26" },
{ recid: 7, fname: "Mark" , lname: "Welldo" , email: "mwel@gmail.com", sdate: "2020/03/27" },
{ recid: 8, fname: "Thomas" , lname: "Bahh" , email: "tbah@gmail.com", sdate: "2020/03/28" }
]
}
それでは records 部分を url にて JSON ファイルを指定し、登録処理を追加したソースを示します。
■url プロパティによる JSON ファイルを指定と登録処理を追加について
<!DOCTYPE html>
<html>
<head>
<title>w2ui Grid-2 url2</title>
<meta charset="utf-8" />
<link rel="stylesheet" type="text/css" media="screen" href="./dist/w2ui.min.css" />
<script type="text/javascript" src="./libs/jquery/jquery-2.1.4.min.js"></script>
<script type="text/javascript" src="./dist/w2ui-1.5.rc1.js"></script>
</head>
<body>
<div id="grid" style="width: 500px; height: 200px;"></div>
<button onclick="save();">save</button>
<script>
$(function () {
// id="grid" へのグリッド設定
$('#grid').w2grid({
name: 'grid',
method: 'GET',
columns: [
{ field: 'recid', caption: 'ID', size: '50px' },
{ field: 'fname', caption: 'First Name', size: '30%' , editable: { type: 'text' } },
{ field: 'lname', caption: 'Last Name' , size: '30%' , editable: { type: 'text' } },
{ field: 'email', caption: 'Email' , size: '40%' , editable: { type: 'text' } },
{ field: 'sdate', caption: 'Start Date', size: '100px' }
],
url: {
get: 'data-get.json',
save: 'saverow.php'
}
});
});
// 登録関数
function save() {
//レコード配列初期化
var rows = new Array();
//レコード分の処理
for(i = 0; i < w2ui["grid"].records.length; i++) {
//'recid' で1レコード取得
var rec = w2ui["grid"].get(w2ui["grid"].records[i]['recid']);
if (rec) {
//レコードが存在する場合
if (rec.w2ui) {
//「w2ui」が存在する場合
if (rec.w2ui.changes) {
//変更箇所が存在する場合、レコードデータに設定
$.extend(rec, rec.w2ui.changes);
//オブジェクト[rec.w2ui]の削除
delete rec.w2ui;
//配列に追加
rows.push(rec);
}
}
}
}
//[save]の機能を使って得点計算を起動(CallBack:onSave)
w2ui["grid"].request("save", { changerows : rows });
}
</script>
</body>
</html>
今回の HTML ファイルには登録用のボタンを設け、そのクリックイベント処理用の登録関数を作成しました。
この登録関数の処理は grid の get は1レコード分のデータを取得できますが w2ui プロパティ内の changes プロパティに変更カラム情報が入っています。 このプロパティが存在していれば、そのレコードは変更された証拠となります。 よってこの情報を取得したレコード情報のプロパティに上書きし、登録用レコード配列に追加します。
w2ui.changes プロパティですが今回の w2ui のバージョンが w2ui-1.5.rc1.js なのでこの様になりました。 (w2ui-1.4.js では w2ui.changes ではなく changes 直で良かったようですが)
最後に request メソッドで grid の[save]機能を呼出します。request メソッドの定義は以下の通りです。
request( cmd, [params, [url, [callBack]]]) <パラメータ> ・cmd :string コマンド名("POST"または"GET")を指定します。 ・params :object 送信する追加パラメータのオブジェクトを指定します。 ・url :string リクエストURLを指定します。 ・callBack:function コールバック関数を指定します。
■saverow.php プログラム
<?php
// PHP 5.5.0 未満のため
if (!function_exists('array_column')) {
// 「array_column」宣言
function array_column($arr, $strKey) {
$arrOut = array();
for ($i = 0; $i <= count($arr); $i++) {
if (isset($arr[$i][$strKey])) {
$arrOut[] = $arr[$i][$strKey];
}
}
return $arrOut;
}
}
// リクエスト取得
$arrReq = json_decode($_GET['request'], true);
$strJsonFile = 'data-get.json';
// 元のデータJSONファイル
$strJson = file_get_contents($strJsonFile);
$arrData = json_decode($strJson, true);
// 動作による処理
switch ($arrReq['cmd']) {
case 'save':
// 変更データ存在チェック
if (!isset($arrReq['changerows']) || count($arrReq['changerows']) == 0) {
break;
}
// recid列の配列(KEY:0からの連番)
$arrRecid = array_column($arrReq['changerows'], 'recid');
// 新規配列に元データと変更データから追加処理
$arrNew = array();
foreach ($arrData['records'] as $value) {
$i = array_search($value["recid"], $arrRecid);
if ($i === false) {
// 変更が無い場合
$arrNew['records'][] = $value;
} else {
// 変更が有った場合
$arrNew['records'][] = $arrReq['changerows'][$i];
}
}
$arrNew['records'] = array_values($arrNew['records']);
$arrNew['total'] = count($arrNew['records']);
// JSON文字列生成
$strJson = json_encode($arrNew, JSON_UNESCAPED_UNICODE);
// テキストファイル書込(data-get.json)
file_put_contents($strJsonFile , $strJson);
break;
}
?>
この PHP プログラムでは $_GET['request']['changerows'] で渡される変更レコードデータを、元のレコードデータとマージする様な処理を行います。
最初の HTML ファイルを実行し、以下の図の Save ボタンをクリックすると data-get.json が変更され、 ページの再読込を行うと変更した値になるはずです。
コメント