Webixライブラリを使ってWebアプリを開発する手順を複数回にわたって説明します。(その3)作業日報追加画面No.043
前回までで、作業日報用のデータベースを作成し、作業日報一覧の表示画面とDBを検索するRESTIFを紹介しましたが、今回は、作業日報を追加する画面を作成します。まずは、PC向けで作成し、その後、スマホ用に変更します。
新規作成は、一覧表画面の中に新規登録のボタンを配備し、そのボタン押下で、新規登録用の画面を開いて、必要事項を入力し、サーバに登録依頼をする動作となります。新規追加画面(後日、編集画面と兼務しますが)とDBにINSERTするREST IFを作成します。
作業日報でカメラ撮影映像も追加できるように、別の記事で記載しますが、今回の新規登録画面では、その機能を省略して実装します。(スマホ画面にするタイミングで修正予定です)
新規登録の画面デザインは、Webixサイトでサービスしているsnippet editorを使って、デザインします。
リアルタイムに画面デザインを確認できるので、サイズやレイアウト変更作業が簡単です。
今回の新規登録画面は、windowコンポーネントで実装します。
以下のような画面デザインにします。
以下のリンクで画面デザイン確認できます。snippet editorで、事前デザインできるのは、作業性が向上するのでいいツールです。
尚、スタイルシートはcompactを使っているので、ツール使うときもスタイルを変更しておく必要があります。
以下のURLにアクセスすると上記画面デザインを確認できます。
画面描画のソースは、以下のとおりです。
//======================================================================
//File Name : DR0011_dailyreport_winform.php
//Encoding : UTF-8
//Creation Date : 2024-06-16
//
//Copyright © 2024 sunsunfarm. All rights reserved.
//
//This source code or any portion thereof must not be
//reproduced or used in any manner whatsoever.
//======================================================================
webix.i18n.setLocale("ja-JP");
//======================================================================
//File Name : DR0011_dailyreport_winform.php
//Encoding : UTF-8
//Creation Date : 2024-06-16
//
//Copyright © 2024 sunsunfarm. All rights reserved.
//
//This source code or any portion thereof must not be
//reproduced or used in any manner whatsoever.
//======================================================================
webix.i18n.setLocale("ja-JP");
var DR0011_win_job_info = "DR0011";
var DR0011_win_resize_height=530;
var DR0011_win_resize_width=500;
var DR0011_win_resize_top=5;
var DR0011_win_resize_left=5;
var DR0011_form_minwidth = 5000;
function DR0011_create_data_win_show(){
$$("DR0011_dailyreport_win").config.modal = true;
DR0011_dailyreport_win.show();
DR0011_dailyreport_form_clear();
$$("DR0011_dailyreport_win_form1").clearValidation();
$$("DR0011_dailyreport_udate_btn").enable();
$$("DR0011_dailyreport_udate_btn").define("label","登録");
$$("DR0011_dailyreport_udate_btn").refresh();
$$("DR0011_dailyreport_cancel_btn").define("label","キャンセル");
$$("DR0011_dailyreport_cancel_btn").refresh();
$$("DR0011_dailyreport_delete_btn").hide();
$$("DR0011_dailyreport_delete_btn").disable();
$$("DR0011_dailyreport_editmode").setValue("3"); //1:閲覧 2:更新 3:新規登録
return true;
}
function DR0011_dailyreport_form_clear(){
$$("DR0011_id").setValue("");
$$("DR0011_report_id").setValue("");
}
function DR0011_disp_win_show(permission_info,session_info,dailyreport_code){
$$("DR0011_mess").setValue("");
}
var DR0011_dailyreport_form1 = [
{ margin:20,cols:[
{view:"text",id:"DR0011_id" ,name:"DR0011_id" ,label:"id" ,width: 30,labelWidth:100,labelAlign:"right",inputAlign:"right",readonly:true,hidden:true},
{view:"text",id:"DR0011_report_id" ,name:"DR0011_report_id" ,label:"作業日報id",width: 200,labelWidth:100,labelAlign:"right",inputAlign:"right",readonly:true},
{view:"text",id:"DR0011_user_id" ,name:"DR0011_user_id" ,label:"user_id",width: 200,labelWidth:100,labelAlign:"right",inputAlign:"right",hidden:true},
]},
{ margin:20,cols:[
{view: "datepicker",id:"DR0011_report_date",name:"DR0011_report_date", label:"作業日", format:webix.Date.dateToStr("%Y/%m/%d"),width: 220,invalidMessage:"未指定です",labelWidth:100,labelAlign:"right"},
]},
{ margin:20,cols:[
{view:"datepicker",type:"time",stringResult:true ,label:"作業開始時刻",width: 220,labelWidth:100,labelAlign:"right",id:"DR0011_start_time",name:"DR0011_start_time" },
{view:"select", label:"経過時間", value:"1.0",width: 160,labelWidth:100,labelAlign:"right", inputAlign:"right",id:"DR0011_duration_hour",name:"DR0011_duration_hour" ,
options:["1.0","1.5","2.0","2.5","3.0","3.5","4.0","4.5","5.0","5.5","6.0" ],
}
]},
{ margin:20,cols:[
{view:"datepicker",type:"time",stringResult:true ,label:"作業終了時刻",width: 220,labelWidth:100,labelAlign:"right",id:"DR0011_end_time",name:"DR0011_end_time" },
{view:"select", label:"作業人数", value:"2",width: 160,labelWidth:100,labelAlign:"right", inputAlign:"right",id:"DR0011_workers",name:"DR0011_workers",
options:["1","2"]
}
]},
{ margin:10,cols:[
{view:"select", label:"作業場所", value:"畑",width: 200,labelWidth:100,labelAlign:"right", inputAlign:"right",id:"DR0011_work_place",name:"DR0011_work_place",
options:["自宅","畑","倉庫畑","柑橘畑","田んぼ畑","その他"]
},
{ view:"button", id:"DR0011_gps_get_btn",name:"DR0011_gps_get_btn", css:"webix_primary", value: "GPS取得", align:"center", width: 80,
click:function(){
}
},
{view:"text",id:"latitude",name:"latitude",label:"緯度",width: 150,labelWidth:40,labelAlign:"right",inputAlign:"right",value:"",id:"DR0011_latitude",name:"DR0011_latitude"},
]},
{ margin:10,cols:[
{view:"select", label:"作業内容", value:"畑",width: 200,labelWidth:100,labelAlign:"right", inputAlign:"right",id:"DR0011_work_details",name:"DR0011_work_details",
options:["収穫","水やり","肥料","監視","耕作","水やり","出荷","その他"]
},
{width:80},
{view:"text",id:"longitude",name:"longitude",label:"経度",width: 150,labelWidth:40,labelAlign:"right",inputAlign:"right",value:"",id:"DR0011_longitude",name:"DR0011_longitude"},
]},
{ margin:20,cols:[
{view:"text",id:"DR0011_memo" ,name:"DR0011_memo" ,label:"メモ",width: 450,labelWidth: 100,labelAlign:"right"},
]},
{ margin:20,cols:[
{view:"label", width:450,label: "",id:"DR0011_mess",css:"red"},
{view:"text",id:"DR0011_dailyreport_editmode" ,name:"DR0011_dailyreport_editmode" ,label:"editmode",width: 200,labelWidth: 100,labelAlign:"right",hidden:true},
]},
];
DR0011_dailyreport_win = webix.ui({
view:"window",
id: "DR0011_dailyreport_win",
move:true,
resize:true,
height : DR0011_win_resize_height,
width : DR0011_win_resize_width,
top : DR0011_win_resize_top,
left : DR0011_win_resize_left,
head:{
cols:[
{template:"作業日報情報(DR0011)", type:"header", borderless:true},
{view:"icon", icon:"wxi-close", tooltip:"画面を閉じます", click: function(){
//閲覧モードの場合は、すぐに閉じる
var form_mode = $$("DR0011_dailyreport_editmode").getValue(); //1:閲覧 2:更新 3:新規登録
if(form_mode == "1")
{
DR0011_dailyreport_win.hide();
$$("DR0011_dailyreport_editmode").setValue("1"); //1:閲覧 2:更新 3:新規登録
return;
}
webix.confirm({
title:"確認",
ok:"はい",
cancel:"いいえ",
text: "操作を中断して画面を閉じますか?",
})
.then(function(result){
//「はい」の場合
DR0011_dailyreport_win.hide();
$$("DR0011_dailyreport_editmode").setValue("1"); //1:閲覧 2:更新 3:新規登録
})
.fail(function(){
//「いいえ」の場合(2枚目)
webix.message({type:"debug",text:"操作を継続できます。"});
});
}}
]
},
body:{
rows:[
{
margin:5,
view:"form",
id: "DR0011_dailyreport_win_form1",
name: "DR0011_dailyreport_win_form1",
elements:DR0011_dailyreport_form1,
elementsConfig:{
bottomPadding:14
},
width:DR0011_win_resize_width,
margin:3
},
{height:40,
cols:[
{},
{ view:"button", css:"webix_danger", id:"DR0011_dailyreport_delete_btn",name:"DR0011_dailyreport_delete_btn",label:"削除", align:"center", width: 100,
click:function(){
var dailyreport_id = $$("dailyreport_id").getValue();
webix.confirm({
title:"確認",
ok:"はい",
cancel:"いいえ",
text:dailyreport_name+"を削除しますか?"
})
.then(function(result){
$$("DR0011_dailyreport_editmode").setValue("4"); //1:閲覧 2:更新 3:新規 4:削除
})
.fail(function(){
webix.message("操作をキャンセルしました。");
});
}
},
// 更新,登録
{ view:"button", css:"webix_primary", id:"DR0011_dailyreport_udate_btn",name:"DR0011_dailyreport_udate_btn",label: "編集", align:"center", width: 100,
click:function(){
$$("DR0011_mess").setValue("");
var edit_mode = $$("DR0011_dailyreport_editmode").getValue(); ///1:閲覧 2:更新 3:新規登録
if(edit_mode == "2"){ //2:更新
//更新処理
}
else if(edit_mode == "3"){ //3:新規登録
var data_list = $$("DR0011_dailyreport_win_form2").getValues();
webix.confirm({
title:"確認",
ok:"はい",
cancel:"いいえ",
text:"日報を新規登録しますか?"
})
.then(function(result){
var formData = new FormData();
})
.fail(function(){
webix.message("操作をキャンセルしました。");
});
}
}
},
{ view:"button", id:"DR0011_dailyreport_cancel_btn",name:"DR0011_dailyreport_cancel_btn", css:"webix_primary", value: "キャンセル", align:"center", width: 100,css:"menu",
click:function(){
form_mode = $$("DR0011_dailyreport_editmode").getValue(); //1:閲覧 2:更新 3:新規登録
if(form_mode == "1")
{
DR0011_dailyreport_win.hide();
$$("DR0011_dailyreport_editmode").setValue("1"); //1:閲覧 2:更新 3:新規登録
return;
}
webix.confirm({
title:"確認",
ok:"はい",
cancel:"いいえ",
text: "操作を中断して画面を閉じますか?",
})
.then(function(result){
//「はい」の場合
DR0011_dailyreport_win.hide();
})
.fail(function(){
//「いいえ」の場合(2枚目)
webix.message({type:"debug",text:"操作を継続できます。"});
});
}
}
]
}
]}
});
DR0011_create_data_win_show();
このソースの前後に実際に動くようにコードやPHPのソースを追加します。
この画面は、一覧表から新規登録ボタンをクリックしたときに、以下の関数をコールするようにして画面を開く動作となります。
DR0011_create_data_win_show(my_permission,my_local_session.userid);
引数に権限情報や登録ユーザIDを渡します。(今回は、権限によって、一部の情報だけ編集できるような仕様にはしないので、実際には、権限情報は、関数内では使わないです)
作業日報の一覧画面に、新規登録ボタンを追加します。
{ view:"button",id:"DR0010_new_dailyreport_btn", name:"DR0010_new_dailyreport_btn", value: "新規登録", align:"center", width: 110, css:"webix_primary",
click:function(){
DR0011_create_data_win_show(my_permission,my_local_session.userid);
}
},
画面デザインが完成したら、フォーム内のロジックを追加してゆきます。
今回のフォームでは、作業開始時刻、終了時刻、その間の時間をどのようにエントリするかです。作業が完了した時点で作業日報を記載するとすれば、終了時刻は現在時刻相当とし、標準作業時間を2.0Hとしておけば、自動的に開始時刻も計算できます。このあたりは、1つの作業をどのくらいで定義するかなどの業務仕様を決めて、ロジックを埋め込むことになります。
時刻を入力するコンポーネントは、datepickerを使いますが、時刻指定ができるデザインにするため、view:"datepicker",type:"time"のように宣言すると、以下のような画面で表示できます。
粒度は5分にしていますが、変更も可能です。
また、実際の時刻は、15分単位で丸めるようにするには、
以下のようなロジックで実現できます。
$$("DR0011_report_date").setValue(moment().format("YYYY/MM/DD"));
var now_time_h = moment().format("HH");
var now_time_m = moment().format("mm");
var now_time_m2 = Math.round(now_time_m/ 15) * 15;
var duration_hour = "2.0";
$$("DR0011_duration_hour").setValue(duration_hour);
$$("DR0011_start_time").setValue(moment(now_time_h+":"+now_time_m2,"HH:mm").subtract(Number(duration_hour),'h').format("HH:mm"));
$$("DR0011_end_time").setValue(now_time_h+":"+now_time_m2);
各ボタンを操作したときに、開始時刻、終了時刻、経過時間を自動計算するために、イベントハンドラを登録します。
今回は、以下のようにしました。
$$("DR0011_start_time").attachEvent("onChange", function(newValue, oldValue, config){
var new_start_time = newValue;
var duration_hour = $$("DR0011_duration_hour").getValue();
var new_end_time = moment(new_start_time).add(duration_hour,'h').format("HH:mm");
$$("DR0011_end_time").setValue(moment(new_start_time).add(duration_hour,'h').format("HH:mm"));
});
$$("DR0011_duration_hour").attachEvent("onChange", function(newValue, oldValue, config){
var start_time = $$("DR0011_start_time").getValue();
if(start_time!= ""){
var duration_hour = newValue;
var v1= moment(start_time,"HH:mm").add(duration_hour ,'h').format("HH:mm");
$$("DR0011_end_time").setValue(v1);
}
});
$$("DR0011_end_time").attachEvent("onChange", function(newValue, oldValue, config){
var start_time = $$("DR0011_start_time").getValue();
var end_time = newValue;
if(start_time!= "" && end_time != null){
var duration_hour = $$("DR0011_duration_hour").getValue();
var v1= moment(end_time,"HH:mm").subtract(duration_hour ,'h').format("HH:mm");
$$("DR0011_start_time").setValue(v1);
}
});
詳細画面は、新規登録時と更新操作時で共有できるソースにします。
さらに、登録した作業日報を削除する機能も実装します。
一覧表から、対象行をクリックして、更新画面(詳細表示画面)を開き、更新操作または、削除操作を選択します。
新規登録は、一覧から専用のボタンで操作します。
尚、新規登録、更新操作、削除操作後は、対象詳細画面は閉じて、一覧は、最新化(再検索)して表示します。
以下が、一覧画面です。
2行目をクリックして詳細画面を開くと一覧画面の上に、詳細画面(編集画面)を開きます。
画面上で、必要な項目を編集して更新ボタン押下すれば、更新されます。
今回の仕様は、ログインしたユーザ自身の作業日報を作成したり、更新する仕様としています。別のユーザが作成した作業日報の表示や更新操作はできない仕様です。(管理者は、全ユーザの操作ができる機能にすることも可能です)
作業場所や作業内容は、候補から選択する仕様としましたが、必要時に、項目追加する仕様で実装することも可能です。
緯度、経度の情報は、スマホ画面を作るときに、説明します。(画像取り込みも同様です)
今回、作成したソースは、画面関連で2つ
REST_API(サーバ関連)で、4つです。
\view\DR0010\DR0010_dailyreport_lists.php 一覧画面
\view\DR0010\DR0011_dailyreport_winform.php 詳細画面(追加・更新)
\rest_api\DR0010\DR0012_dailyreport_selectlists.php 一覧検索
\rest_api\DR0010\DR0013_dailyreport_select.php 個別詳細検索
\rest_api\DR0010\DR0014_entry_dailyreport.php 新規追加
\rest_api\DR0010\DR0015_update_dailyreport.php 更新
\rest_api\DR0010\DR0016_delete_dailyreport.php 削除
\view\DR0010\DR0010_dailyreport_lists.php 一覧画面
<?php
//======================================================================
//File Name : DR0010_dailyreport_lists.php
//Encoding : UTF-8
//Creation Date : 2024-06-18
//
//Copyright © 2024 sunsunfarm. All rights reserved.
//
//This source code or any portion thereof must not be
//reproduced or used in any manner whatsoever.
//======================================================================
$TITLE_INFO ="作業日報一覧";
$VER_INFO ="V01L01";
$JOB_INFO = "DR0010";
$myfilename = basename(__FILE__); //自分自身のファイル名取得
define('SUB_FOLDER','/webix02'); //サブフォルダを指定したURL
define('ROOT_PATH','/home/sunsun/www/webix02'); //ソースを保存しているパス(動作環境に応じて記述する必要あり)
$userid = '';
$logheader = 'userid='.$userid.', '.$myfilename.':';//ログ出力時のヘッダー情報(自ファイル名,ログインIDを付与)
if($_SERVER["REQUEST_METHOD"] != "GET"){
error_log($logheader.' REQUEST_METHOD no GET');
header("HTTP/1.0 404 Not Found");
return;
}
$error_flag = -1;
$accesskey = 0;
$userclient ="pc";
$mypermission = 0;
if(isset($_GET['accesskey'])){
if(is_numeric($_GET['accesskey'])){
$accesskey =$_GET['accesskey'];
$error_flag = 1;
}
}
else{
$error_flag = -1;
error_log($logheader.' accesskey not found');
header("HTTP/1.0 404 Not Found");
exit;
}
if(isset($_GET['userid'])){
$userid = $_GET['userid'];
$error_flag = 1;
}
else{
$error_flag = -1;
error_log($logheader.' userid not found');
header("HTTP/1.0 404 Not Found");
exit;
}
if(isset($_GET['userclient'])){
$userclient = $_GET['userclient'];
}
if(isset($_GET['permission'])){
if(is_numeric($_GET['permission'])){
$mypermission = intval($_GET['permission']);
}
}
$logheader = 'userid='.$userid.', '.$myfilename.':';//ログ出力時のヘッダー情報(自ファイル名,ログインIDを付与)
include('../../commonlib/svr_common_lib_v2.php'); //
$config_obj = get_config_obj();
if(Chk_AccessKey($accesskey)){
}
else{
error_log($logheader.' accesskey check error');
header("HTTP/1.0 404 Not Found");
exit;
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title><?php echo $TITLE_INFO.' DR0010 ('.$VER_INFO.')' ?></title>
<script src="/webix_GPL_1020/webix.js" type="text/javascript" charset="utf-8"></script>
<link href="/webix_GPL_1020/skins/compact.css?<?php echo date('Ymd-H'); ?>" rel="stylesheet" type="text/css">
<link href="<?php echo SUB_FOLDER; ?>/commonlib/webix_custom_css.css?<?php echo date('Ymd-H'); ?>" rel="stylesheet" type="text/css">
<link rel="icon" href="<?php echo SUB_FOLDER; ?>/image/webix_64.ico">
<script src="<?php echo SUB_FOLDER; ?>/commonlib/object-assign.js"></script>
<script src="<?php echo SUB_FOLDER; ?>/commonlib/moment-with-locales.js"></script>
<script src="<?php echo SUB_FOLDER; ?>/commonlib/webix_common_lib.js"></script>
<link rel="stylesheet" href="/webix_GPL_1020/css/materialdesignicons.min.css" type="text/css" charset="utf-8">
<style>
.blue .webix_el_box{
color: #0000ff;
}
.blue .webix_control.webix_el_text{
color: #0000ff;
}
.red .webix_el_box{
color: #ff0000;
}
.red .webix_control.webix_el_text{
color: #ff0000;
}
.invalid_mess{font-size:8px}
.red .webix_control.webix_el_text{
color: #ff0000;
}
.orange_bgcolor button.webix_button{
background: #FF8856;
color:#FFFFFF;
border:1px solid #FF8856;
}
.gray_bgcolor {
background: #efefef;
}
.highlight{
background-color:#FFAAAA;
}
.teal_bgcolor .webix_button {
background-color: #008080;
color: #FFFFFF;
}
.green input{
background-color:#B1FF91;
border-color:green;
}
.pink input{
background-color:#FFB6FE;
border-color:red ;
}
</style>
</head>
<body>
<script type="text/javascript" charset="utf-8">
webix.i18n.setLocale("ja-JP");
var my_local_session = webix.storage.local.get('login');
<?php
include_once('../../commonlib/CM0010_goto_menu_action.php');
include_once('../../commonlib/CM0030_sendprm_set_request.php');
include_once('../../commonlib/CM0060_common_validate_check.php');
include_once('../../commonlib/CM0070_prompt_parameter_setting.php');
include_once('../../commonlib/CM0080_screen_control.php');
if(isset($_GET['open_mode'])){
$open_mode = $_GET['open_mode'];
if($open_mode == '_blank'){
echo ' var menu_btn_name = "閉じる";'."\n";
}
else{
echo ' var menu_btn_name = "メニュー";'."\n";
}
}
else{
echo ' var menu_btn_name = "メニュー";'."\n";
}
echo ' var my_permission ='.$mypermission.";\n";
?>
<?php
if($userclient != "pc"){
?>
webix.ui.fullScreen();
<?php
}
?>
var fl_start_report_date = moment().startOf('month').format("YYYY/MM/DD");
var fl_end_report_date = moment().format("YYYY/MM/DD");
webix.i18n.setLocale("ja-JP");
function DR0010_select_dailyreport_lists(fl_user_id){
$$("DR0010_table").clearAll(); //リストを一度クリア
CM0080_datatable_filter_clear("DR0010_table");
var start_date = moment($$("fl_start_report_date").getValue()).format("YYYY/MM/DD");
var end_date = moment($$("fl_end_report_date").getValue()).format("YYYY/MM/DD");
var access_key = Get_AccessKey();
var send_prm = Prepare_send_prm(my_local_session, access_key);
send_prm.fl_user_id = fl_user_id;
send_prm.fl_start_report_date = start_date;
send_prm.fl_end_report_date = end_date;
var xhr =webix.ajax().sync().get("<?php echo SUB_FOLDER; ?>/rest_api/DR0010/DR0012_dailyreport_selectlists.php",send_prm);
var resp = JSON.parse(xhr.responseText);
if(resp.resp =="ok"){
$$("DR0010_table").parse(resp.var_lists);
var v_count =$$("DR0010_table").count();
$$("select_count").setValue(String(v_count));
if(v_count == 0 ){
$$("comment").setValue("検索結果は、0件です。");
webix.message({type:"debug", text:"検索結果は、0件です。"});
}
else{
$$("comment").setValue("");
}
}
else{
webix.message({type:"error", text:"検索でエラーが発生しました。code="+resp.error_code});
}
}
//検索条件フォーム構成リスト
var form_collection = [
{ margin:5,
cols:[
{ view:"label", height:50, template:"<span style='font-weight:bold; font-size:180%;'>作業日報一覧</span>",width:890},
]
},
{ margin:5,
cols:[
{view:"datepicker",id:"fl_start_report_date",name:"fl_start_report_date",label:'開始日',labelAlign:"right",value:fl_start_report_date,width:"200",type: "date",format:webix.Date.dateToStr("%Y/%m/%d")
,on:{
onChange:function(newv,oldv){
var end_date = moment($$("fl_end_report_date").getValue()).format("YYYYMMDD");
var start_date = moment(newv).format("YYYYMMDD");
var today = moment().format("YYYYMMDD");
if(start_date > today ){
$$("DR0010_search_btn").disable();
webix.message({type:"error",text:"日付の範囲が<br>正しくありません。"});
}
else if(end_date < start_date){
$$("DR0010_search_btn").disable();
webix.message({type:"error",text:"日付の範囲が<br>正しくありません。"});
}
else{
$$("DR0010_search_btn").enable();
}
},
onEnter(ev){
$$("DR0010_search_btn").focus();
}
}
},
{view:"datepicker",id:"fl_end_report_date",name:"fl_end_report_date",label:'終了日',labelAlign:"right",value:fl_end_report_date,width:"200",type: "date",format:webix.Date.dateToStr("%Y/%m/%d"),
on:{
onChange:function(newv,oldv){
var start_date = moment($$("fl_start_report_date").getValue()).format("YYYYMMDD");
var end_date = moment(newv).format("YYYYMMDD");
var today = moment().format("YYYYMMDD");
if(end_date > today ){
$$("DR0010_search_btn").disable();
webix.message({type:"error",text:"日付の範囲が<br>正しくありません。"});
}
else if(end_date < start_date){
$$("DR0010_search_btn").disable();
webix.message({type:"error",text:"日付の範囲が<br>正しくありません。"});
}
else{
$$("DR0010_search_btn").enable();
}
},
onEnter(ev){
$$("DR0010_search_btn").focus();
}
}},
{ view:"button", value: "検索", align:"center", width: 110,id:"DR0010_search_btn",name:"DR0010_search_btn",
click:function(){
var fl_user_id = my_local_session.userid;
DR0010_select_dailyreport_lists(fl_user_id);
}
},
{ view:"button",id:"DR0010_new_dailyreport_btn", name:"DR0010_new_dailyreport_btn", value: "新規登録", align:"center", width: 110, css:"webix_primary",
click:function(){
DR0011_create_data_win_show(my_permission,my_local_session.userid);
}
},
// メニューに戻るボタン実装
{ view:"button", value: menu_btn_name, align:"center", width: 110, css:"menu",
click:function(){
Goto_Menu(my_local_session["userclient"]); //メニュー画面へ遷移
}
}
]
},
];
function time_format(value){
var str1 = String(value).replace(/\./g,"");
if(str1 == "" || str1 == 0) return "";
else{
return str1.substring(0,5);
}
}
var grid1 = {
id: "DR0010_table",
name: "DR0010_table",
type:"clean",
view:"datatable",
width:800,
resizeColumn:true,
resizeRow: { headerOnly:true },
columns:[
{ id:"id",header:["id",{content:"textFilter"}],width:60,sort:"int", css:{"text-align":"right"}},
{ id:"report_id",header:["report_id"],width:100,sort:"int",hidden:true},
{ id:"user_id",header:["user_id"],width:100,sort:"int",hidden:true},
{ id:"report_date",header:["日付",{content:"textFilter"}],width:100,sort:"int", css:{"text-align":"right"},format:webix.Date.dateToStr("%Y/%m/%d")},
{ id:"work_place",header:["作業場所'",{content:"selectFilter"}],width:200,sort:"string"},
{ id:"work_details",header:["作業内容'",{content:"selectFilter"}],width:200,sort:"string"},
{ id:"start_time",header:["作業開始時刻'",{content:"selectFilter"}],width:100,sort:"int",format:time_format, css:{"text-align":"right"}},
{ id:"duration_hour",header:["経過時間(h)",{content:"selectFilter"}],width:100,sort:"int", css:{"text-align":"right"}},
{ id:"workers",header:["作業人数'",{content:"selectFilter"}],width:100,sort:"int", css:{"text-align":"right"}},
],
// 選択
on:{
onItemClick:function(id){
var item = this.getItem(id);
DR0011_disp_win_show(my_permission,my_local_session,item.report_id,item.id);
}
},
resizeColumn:true, resizeRow:true,
leftSplit:2,
scroll:"xy",
select:"row",
datatype:"json",
data:[]
};
//画面描画
webix.ui({
padding: 10,
rows:[ { view:"form", id: "form1", elements : form_collection, margin:3, select:true },
{ margin:5,cols: [
{ view:"text", label:"検索結果(件)", labelWidth:100,labelAlign:"right",name:"select_count",id:"select_count",value:0,width:160, inputAlign:"right",readonly:true },
{ view:"label",label:"", width:300, name:"comment", id:"comment" }
]},
grid1,
]
});
<?php
include_once('DR0011_dailyreport_winform.php'); //作業日報明細表示
?>
var fl_user_id = my_local_session.userid;
DR0010_select_dailyreport_lists(fl_user_id);
</script>
</body>
</html>
\view\DR0010\DR0011_dailyreport_winform.php 詳細画面(追加・更新)
//======================================================================
//File Name : DR0011_dailyreport_winform.php
//Encoding : UTF-8
//Creation Date : 2024-06-16
//
//Copyright © 2024 sunsunfarm. All rights reserved.
//
//This source code or any portion thereof must not be
//reproduced or used in any manner whatsoever.
//======================================================================
webix.i18n.setLocale("ja-JP");
var DR0011_win_job_info = "DR0011";
var DR0011_win_resize_height=540;
var DR0011_win_resize_width=500;
var DR0011_win_resize_top=5;
var DR0011_win_resize_left=5;
var DR0011_form_minwidth = 500;
function DR0011_create_data_win_show(permission_info,userid){
$$("DR0011_dailyreport_win").config.modal = true;
DR0011_dailyreport_win.show();
DR0011_dailyreport_form_clear();
$$("DR0011_user_id").setValue(userid);
$$("DR0011_dailyreport_udate_btn").enable();
$$("DR0011_dailyreport_udate_btn").define("label","登録");
$$("DR0011_dailyreport_udate_btn").refresh();
$$("DR0011_dailyreport_cancel_btn").define("label","キャンセル");
$$("DR0011_dailyreport_cancel_btn").refresh();
$$("DR0011_dailyreport_delete_btn").hide();
$$("DR0011_dailyreport_editmode").setValue("3"); //1:閲覧 2:編集 3:新規登録
return true;
}
function DR0011_dailyreport_form_clear(){
$$("DR0011_id").setValue("");
$$("DR0011_report_id").setValue("");
$$("DR0011_report_date").setValue(moment().format("YYYY/MM/DD"));
var now_time_h = moment().format("HH");
var now_time_m = moment().format("mm");
var now_time_m2 = Math.round(now_time_m/ 15) * 15;
var duration_hour = "2.0";
$$("DR0011_duration_hour").setValue(duration_hour);
$$("DR0011_start_time").setValue(moment(now_time_h+":"+now_time_m2,"HH:mm").subtract(Number(duration_hour),'h').format("HH:mm"));
$$("DR0011_end_time").setValue(now_time_h+":"+now_time_m2);
}
//行から読み出して、report_idをキーにDBを検索してフォームにセットする
function DR0011_disp_win_show(permission_info,session_info,report_id,id){
DR0011_dailyreport_form_clear();
$$("DR0011_mess").setValue("");
var access_key = Get_AccessKey();
var send_prm = Prepare_send_prm(session_info,access_key);
send_prm.report_id = report_id;
send_prm.id = id;
var xhr =webix.ajax().sync().get("<?php echo SUB_FOLDER; ?>/rest_api/DR0010/DR0013_dailyreport_select.php",send_prm);
var resp = JSON.parse(xhr.responseText);
if(resp.resp =="ok"){
$$("DR0011_dailyreport_win_form1").setValues(resp.form_datas);
$$("DR0011_dailyreport_udate_btn").enable();
$$("DR0011_dailyreport_udate_btn").define("label","更新");
$$("DR0011_dailyreport_udate_btn").refresh();
$$("DR0011_dailyreport_cancel_btn").define("label","キャンセル");
$$("DR0011_dailyreport_cancel_btn").refresh();
$$("DR0011_dailyreport_editmode").setValue("2"); //1:閲覧 2:編集 3:新規登録
if(CM0010_permission_check(permission_info,CM0080_PERMISSION_B5)){ //削除可能者
$$("DR0011_dailyreport_delete_btn").enable();
$$("DR0011_dailyreport_delete_btn").show();
}
else{
$$("DR0011_dailyreport_delete_btn").disable();
$$("DR0011_dailyreport_delete_btn").hide();
}
DR0011_dailyreport_win.show();
}
else{
webix.message({type:"error", text:"検索でエラーが発生しました。code="+resp.error_code});
}
}
var DR0011_dailyreport_form1 = [
{ margin:20,cols:[
{view:"text",id:"DR0011_id" ,name:"DR0011_id" ,label:"id" ,width: 30,labelWidth:100,labelAlign:"right",inputAlign:"right",readonly:true,hidden:true},
{view:"text",id:"DR0011_report_id" ,name:"DR0011_report_id" ,label:"作業日報id",width: 200,labelWidth:100,labelAlign:"right",inputAlign:"right",readonly:true},
{view:"text",id:"DR0011_user_id" ,name:"DR0011_user_id" ,label:"user_id",width: 200,labelWidth:100,labelAlign:"right",inputAlign:"right",hidden:true},
]},
{ margin:20,cols:[
{view: "datepicker",id:"DR0011_report_date",name:"DR0011_report_date", label:"作業日", format:webix.Date.dateToStr("%Y/%m/%d"),width: 220,invalidMessage:"未指定です",labelWidth:100,labelAlign:"right"},
]},
{ margin:20,cols:[
{view:"datepicker",type:"time",stringResult:true ,label:"作業開始時刻",width: 220,labelWidth:100,labelAlign:"right",id:"DR0011_start_time",name:"DR0011_start_time" },
{view:"select", label:"経過時間", value:"1.0",width: 160,labelWidth:100,labelAlign:"right", inputAlign:"right",id:"DR0011_duration_hour",name:"DR0011_duration_hour" ,
options:["1.0","1.5","2.0","2.5","3.0","3.5","4.0","4.5","5.0","5.5","6.0" ],
}
]},
{ margin:20,cols:[
{view:"datepicker",type:"time",stringResult:true ,label:"作業終了時刻",width: 220,labelWidth:100,labelAlign:"right",id:"DR0011_end_time",name:"DR0011_end_time" },
{view:"select", label:"作業人数", value:"2",width: 160,labelWidth:100,labelAlign:"right", inputAlign:"right",id:"DR0011_workers",name:"DR0011_workers",
options:["1","2"]
}
]},
{ margin:10,cols:[
{view:"select", label:"作業場所", value:"畑",width: 200,labelWidth:100,labelAlign:"right", inputAlign:"right",id:"DR0011_work_place",name:"DR0011_work_place",
options:["自宅","畑","倉庫畑","柑橘畑","田んぼ畑","その他"]
},
{ view:"button", id:"DR0011_gps_get_btn",name:"DR0011_gps_get_btn", css:"webix_primary", value: "GPS取得", align:"center", width: 80,
click:function(){
}
},
{view:"text",id:"latitude",name:"latitude",label:"緯度",width: 150,labelWidth:40,labelAlign:"right",inputAlign:"right",value:"",id:"DR0011_latitude",name:"DR0011_latitude"},
]},
{ margin:10,cols:[
{view:"select", label:"作業内容", value:"畑",width: 200,labelWidth:100,labelAlign:"right", inputAlign:"right",id:"DR0011_work_details",name:"DR0011_work_details",
options:["収穫","水やり","肥料","監視","耕作","水やり","出荷","その他"]
},
{width:80},
{view:"text",id:"longitude",name:"longitude",label:"経度",width: 150,labelWidth:40,labelAlign:"right",inputAlign:"right",value:"",id:"DR0011_longitude",name:"DR0011_longitude"},
]},
{ margin:20,cols:[
{view:"text",id:"DR0011_memo" ,name:"DR0011_memo" ,label:"メモ",width: 450,labelWidth: 100,labelAlign:"right"},
]},
{ margin:20,cols:[
{view:"label", width:450,label: "",id:"DR0011_mess",css:"red"},
{view:"text",id:"DR0011_dailyreport_editmode" ,name:"DR0011_dailyreport_editmode" ,label:"editmode",width: 200,labelWidth: 100,labelAlign:"right",hidden:true},
]},
];
function check_form_data(){
var report_date = $$("DR0011_report_date").getValue();
if(report_date == null || report_date == ""){
$$("DR0011_mess").setValue("作業日が未指定です。");
webix.alert("作業日が未指定です。");
return false;
}
var start_time = $$("DR0011_start_time").getValue();
var end_time = $$("DR0011_end_time").getValue();
var duration_hour = $$("DR0011_duration_hour").getValue();
if(start_time == null || start_time == ""){
$$("DR0011_mess").setValue("作業開始時刻が未指定です。");
webix.alert("作業開始時刻が未指定です。");
return false;
}
if(end_time == null || end_time == ""){
$$("DR0011_mess").setValue("作業終了時刻が未指定です。");
webix.alert("作業終了時刻が未指定です。");
return false;
}
if(duration_hour == ""){
$$("DR0011_mess").setValue("経過時間が未指定です。");
webix.alert("経過時間が未指定です。");
return false;
}
return true;
}
DR0011_dailyreport_win = webix.ui({
view:"window",
id: "DR0011_dailyreport_win",
move:true,
resize:true,
height : DR0011_win_resize_height,
width : DR0011_win_resize_width,
top : DR0011_win_resize_top,
left : DR0011_win_resize_left,
head:{
cols:[
{template:"作業日報情報(DR0011)", type:"header", borderless:true},
{view:"icon", icon:"wxi-close", tooltip:"画面を閉じます", click: function(){
//閲覧モードの場合は、すぐに閉じる
var form_mode = $$("DR0011_dailyreport_editmode").getValue(); //1:閲覧 2:編集 3:新規登録
if(form_mode == "1")
{
DR0011_dailyreport_win.hide();
$$("DR0011_dailyreport_editmode").setValue("1"); //1:閲覧 2:編集 3:新規登録
return;
}
webix.confirm({
title:"確認",
ok:"はい",
cancel:"いいえ",
text: "操作を中断して画面を閉じますか?",
})
.then(function(result){
//「はい」の場合
DR0011_dailyreport_win.hide();
$$("DR0011_dailyreport_editmode").setValue("1"); //1:閲覧 2:編集 3:新規登録
})
.fail(function(){
//「いいえ」の場合(2枚目)
webix.message({type:"debug",text:"操作を継続できます。"});
});
}}
]
},
body:{
rows:[
{
margin:5,
view:"form",
id: "DR0011_dailyreport_win_form1",
name: "DR0011_dailyreport_win_form1",
elements:DR0011_dailyreport_form1,
elementsConfig:{
bottomPadding:14
},
width:DR0011_win_resize_width,
margin:3
},
{height:40,
cols:[
{},
{ view:"button", css:"webix_danger", id:"DR0011_dailyreport_delete_btn",name:"DR0011_dailyreport_delete_btn",label:"削除", align:"center", width: 100,
click:function(){
$$("DR0011_mess").setValue("");
var DR0011_report_id = $$("DR0011_report_id").getValue();
webix.confirm({
title:"確認",
ok:"はい",
cancel:"いいえ",
text:"作業日報:"+DR0011_report_id+"を<br>削除しますか?"
})
.then(function(result){
$$("DR0011_dailyreport_editmode").setValue("4"); //1:閲覧 2:更新 3:新規 4:削除
var report_id = $$("DR0011_report_id").getValue();
var formData = new FormData();
var access_key = Get_AccessKey();
formData.append("accesskey",access_key);
formData.append("userid", my_local_session.userid);
formData.append("report_id",report_id );
formData.append("edit_mode",4);
var xhr =webix.ajax().sync().post("<?php echo SUB_FOLDER; ?>/rest_api/DR0010/DR0016_delete_dailyreport.php",formData);
var resp = JSON.parse(xhr.responseText);
if(resp.resp =="ok"){
DR0011_dailyreport_win.hide();
var fl_user_id = my_local_session.userid;
DR0010_select_dailyreport_lists(fl_user_id);
webix.message({type:"success",text:"作業日報を削除しました。"});
return;
}
else{
webix.alert("作業日報の削除でエラーしました。 code="+resp.error_code);
return;
}
})
.fail(function(){
webix.message("操作をキャンセルしました。");
});
}
},
{width:100},
// 更新,登録
{ view:"button", css:"webix_primary", id:"DR0011_dailyreport_udate_btn",name:"DR0011_dailyreport_udate_btn",label: "更新", align:"center", width: 100,
click:function(){
$$("DR0011_mess").setValue("");
if(check_form_data()){
}
else{
return;
}
var edit_mode = $$("DR0011_dailyreport_editmode").getValue(); ///1:閲覧 2:更新3:新規登録
if(edit_mode == "2"){ //2:更新
//更新処理
var upate_datas = $$("DR0011_dailyreport_win_form1").getValues();
webix.confirm({
title:"確認",
ok:"はい",
cancel:"いいえ",
text:"作業日報を更新しますか?"
})
.then(function(result){
start_time = moment($$("DR0011_start_time").getValue(),"HH:mm").format("HH:mm");
end_time = moment($$("DR0011_end_time").getValue(),"HH:mm").format("HH:mm");
var formData = new FormData();
var access_key = Get_AccessKey();
formData.append("accesskey",access_key);
formData.append("userid", my_local_session.userid);
formData.append("upate_datas",JSON.stringify(upate_datas));
formData.append("report_date",moment($$("DR0011_report_date").getValue()).format("YYYY-MM-DD"));
formData.append("start_time",start_time);
formData.append("end_time",end_time);
formData.append("edit_mode",edit_mode);
var xhr =webix.ajax().sync().post("<?php echo SUB_FOLDER; ?>/rest_api/DR0010/DR0015_update_dailyreport.php",formData);
var resp = JSON.parse(xhr.responseText);
if(resp.resp =="ok"){
$$("DR0011_report_id").setValue(resp.report_id);
DR0011_dailyreport_win.hide();
var fl_user_id = my_local_session.userid;
DR0010_select_dailyreport_lists(fl_user_id);
webix.message({type:"success",text:"作業日報を更新しました。"});
return;
}
else{
webix.alert("作業日報の更新でエラーしました。 code="+resp.error_code);
return;
}
})
.fail(function(){
webix.message("操作をキャンセルしました。");
});
}
else if(edit_mode == "3"){ //3:新規登録
var entry_datas = $$("DR0011_dailyreport_win_form1").getValues();
webix.confirm({
title:"確認",
ok:"はい",
cancel:"いいえ",
text:"作業日報を新規登録しますか?"
})
.then(function(result){
start_time = moment($$("DR0011_start_time").getValue(),"HH:mm").format("HH:mm");
end_time = moment($$("DR0011_end_time").getValue(),"HH:mm").format("HH:mm");
var formData = new FormData();
var access_key = Get_AccessKey();
formData.append("accesskey",access_key);
formData.append("userid", my_local_session.userid);
formData.append("entry_datas",JSON.stringify(entry_datas));
formData.append("report_date",moment($$("DR0011_report_date").getValue()).format("YYYY-MM-DD"));
formData.append("start_time",start_time);
formData.append("end_time",end_time);
formData.append("edit_mode",edit_mode);
var xhr =webix.ajax().sync().post("<?php echo SUB_FOLDER; ?>/rest_api/DR0010/DR0014_entry_dailyreport.php",formData);
var resp = JSON.parse(xhr.responseText);
if(resp.resp =="ok"){
$$("DR0011_report_id").setValue(resp.report_id);
DR0011_dailyreport_win.hide();
var fl_user_id = my_local_session.userid;
DR0010_select_dailyreport_lists(fl_user_id);
webix.message({type:"success",text:"作業日報を登録しました。"});
return;
}
else{
webix.alert("作業日報の登録でエラーしました。 code="+resp.error_code);
return;
}
})
.fail(function(){
webix.message("操作をキャンセルしました。");
});
}
}
},
{ view:"button", id:"DR0011_dailyreport_cancel_btn",name:"DR0011_dailyreport_cancel_btn", css:"webix_primary", value: "キャンセル", align:"center", width: 100,css:"menu",
click:function(){
form_mode = $$("DR0011_dailyreport_editmode").getValue(); //1:閲覧 2:更新 3:新規登録
if(form_mode == "1")
{
DR0011_dailyreport_win.hide();
$$("DR0011_dailyreport_editmode").setValue("1"); //1:閲覧 2:更新 3:新規登録
return;
}
webix.confirm({
title:"確認",
ok:"はい",
cancel:"いいえ",
text: "操作を中断して画面を閉じますか?",
})
.then(function(result){
//「はい」の場合
DR0011_dailyreport_win.hide();
})
.fail(function(){
//「いいえ」の場合(2枚目)
webix.message({type:"debug",text:"操作を継続できます。"});
});
}
}
]
}
]}
});
$$("DR0011_start_time").attachEvent("onChange", function(newValue, oldValue, config){
var new_start_time = newValue;
var duration_hour = $$("DR0011_duration_hour").getValue();
var new_end_time = moment(new_start_time).add(duration_hour,'h').format("HH:mm");
$$("DR0011_end_time").setValue(moment(new_start_time).add(duration_hour,'h').format("HH:mm"));
});
$$("DR0011_duration_hour").attachEvent("onChange", function(newValue, oldValue, config){
var start_time = $$("DR0011_start_time").getValue();
if(start_time!= ""){
var duration_hour = newValue;
var v1= moment(start_time,"HH:mm").add(duration_hour ,'h').format("HH:mm");
$$("DR0011_end_time").setValue(v1);
}
});
$$("DR0011_end_time").attachEvent("onChange", function(newValue, oldValue, config){
var start_time = $$("DR0011_start_time").getValue();
var end_time = newValue;
if(start_time!= "" && end_time != null){
var duration_hour = $$("DR0011_duration_hour").getValue();
var v1= moment(end_time,"HH:mm").subtract(duration_hour ,'h').format("HH:mm");
$$("DR0011_start_time").setValue(v1);
}
});
\rest_api\DR0010\DR0012_dailyreport_selectlists.php 一覧検索
<?php
//======================================================================
//File Name : DR0012_dailyreport_selectlists.php
//Encoding : UTF-8
//Creation Date : 2024-06-18
//
//Copyright © 2024 sunsunfarm. All rights reserved.
//
//This source code or any portion thereof must not be
//reproduced or used in any manner whatsoever.
//
// usage example /rest_api/DR0010/DR0012_dailyreport_selectlists.php?userid=admin&fl_user_id=admin&fl_start_report_date=2024-06-18&fl_end_report_date=2024-06-18
//======================================================================
//header("Content-Type: text/javascript; charset=utf-8");
$userid ='';
$myfilename = basename(__FILE__); //自分自身のファイル名取得
$logheader = 'log:'.$myfilename.' userid='.$userid.' :';//ログ出力時のヘッダー情報(自ファイル名,ログインIDを付与)
if($_SERVER["REQUEST_METHOD"] != "GET"){
//GET以外ははじく
error_log($logheader.' REQUEST_METHOD no GET');
header("HTTP/1.0 404 Not Found");
return;
}
//$accesskey =0;
//GET情報からパラメータ取得
//if(isset($_GET['accesskey'])){
// if(is_numeric($_GET['accesskey'])){
// $accesskey = intval($_GET['accesskey']);
// }
//}
//else{
// $error_flag = -1;
// error_log($logheader.' accesskey not found');
// header("HTTP/1.0 404 Not Found");
// exit;
//}
if(isset($_GET['userid'])){
$userid = $_GET['userid'];
}
else{
$error_flag = -1;
error_log($logheader.' userid not found');
header("HTTP/1.0 404 Not Found");
exit;
}
$logheader = 'log:'.$myfilename.' userid='.$userid.' :';//ログ出力時のヘッダー情報(自ファイル名,ログインIDを付与)
include('../../commonlib/svr_common_lib_v2.php'); //
//検索条件用パラメータ
$fl_user_id ='';
$fl_start_report_date='';
$fl_end_report_date='';
if(isset($_GET['fl_user_id'])){
$fl_user_id = $_GET['fl_user_id'];
}
if(isset($_GET['fl_start_report_date'])){
$fl_start_report_date = $_GET['fl_start_report_date'];
}
if(isset($_GET['fl_end_report_date'])){
$fl_end_report_date = $_GET['fl_end_report_date'];
}
error_log($logheader.' $fl_user_id ='.$fl_user_id);
error_log($logheader.' $fl_start_report_date ='.$fl_start_report_date);
error_log($logheader.' $fl_end_report_date ='.$fl_end_report_date);
$config_obj = get_config_obj();
//アクセスキーチェック
//if(Chk_AccessKey($accesskey)){
// $error_flag = 1;
//}
//else{
// error_log($logheader.' accesskey check error');
// header("HTTP/1.0 404 Not Found");
// exit;
//}
//
//メインルーチン
//
//データベース接続する(MySQLDB)
$dbh = mariadb_connect($config_obj,'app01','webix_webix'); //configファイルに従って、DB接続して応答を返す
if($dbh == false){
//エラー応答
$resp = "ng";
$count = 0;
$error_code = -1;
$var_lists = array();
$json_data = json_encode(compact("resp","error_code"),JSON_UNESCAPED_UNICODE);
echo $json_data;
exit;
}
try {
$select_sql = 'SELECT id as report_id,user_id,report_date,work_place,work_details,start_time,end_time,duration_hour,workers from dailyreports ';
$where_str_array = array();
if($fl_user_id != ""){
$where_str_array[] =" user_id = '".$fl_user_id."'";
}
if($fl_start_report_date != ""){
$where_str_array[] =" report_date >= '".$fl_start_report_date."'";
}
if($fl_end_report_date != ""){
$where_str_array[] =" report_date <= '".$fl_end_report_date."'";
}
if(count($where_str_array) > 0){
$where_str = implode(" and ",$where_str_array);
$select_sql = $select_sql." where ".$where_str;
}
$select_sql = $select_sql.' order by report_date DESC,start_time DESC,user_id ';
//作成したSQL文をログに出力
error_log($logheader.' sql='.$select_sql);
$stmt1 = $dbh->prepare($select_sql);
$stmt1->execute();
$var_lists = $stmt1->fetchAll(PDO::FETCH_ASSOC); //フィールド名だけで保存(index情報なし)
$count = count($var_lists);
error_log($logheader.' select dailyreports count ='.$count );
for($i=0;$i<$count;$i++){
$var_lists[$i]["id"] = strval($i+1);
}
$resp = "ok";
$error_code = 0;
}catch (Exception $e) {
$resp = "ng";
$count = 0;
$error_code = -1;
}
//後処理
$stmt = null;
$dbh = null; //DBクローズ
$json_data = json_encode(compact("resp","error_code","count","var_lists"),JSON_UNESCAPED_UNICODE);
echo $json_data;
?>
\rest_api\DR0010\DR0014_entry_dailyreport.php 新規追加
<?php
//DR0014_entry_dailyreport.php
//header("Content-Type: text/javascript; charset=utf-8");
$myfilename = basename(__FILE__); //自分自身のファイル名取得
$userid = '';
$logheader = 'userid='.$userid.', '.$myfilename.':';//ログ出力時のヘッダー情報(自ファイル名,ログインIDを付与)
if($_SERVER["REQUEST_METHOD"] != "POST"){
//POST以外ははじく
error_log($logheader.' not POST method');
header("HTTP/1.0 404 Not Found");
return;
}
//指定パラメータで作業日報新規追加(INSERT)する
//POST情報からパラメータ取得
$accesskey = 0;
if(isset($_POST['accesskey'])){
if(is_numeric($_POST['accesskey'])){
$accesskey = $_POST['accesskey'];
$error_flag = 1;
}
}
else{
$error_flag = -1;
error_log($logheader.' accesskey not found');
header("HTTP/1.0 404 Not Found");
exit;
}
if(isset($_POST['userid'])){
$userid = $_POST['userid'];
$error_flag = 1;
}
else{
$error_flag = -1;
error_log($logheader.' userid not found');
header("HTTP/1.0 404 Not Found");
exit;
}
$job_info = "DR0014";
if(isset($_POST['job_info'])){
$job_info = $_POST['job_info'];
}
$report_date = $_POST['report_date'];
$start_time = $_POST['start_time'];
$end_time = $_POST['end_time'];
$logheader = 'userid='.$userid.', '.$myfilename.':';//ログ出力時のヘッダー情報(自ファイル名,ログインIDを付与)
include('../../commonlib/svr_common_lib_v2.php'); //
$config_obj = get_config_obj();
//アクセスキーチェック
if(Chk_AccessKey($accesskey)){
}
else{
error_log($logheader.' accesskey check error');
header("HTTP/1.0 404 Not Found");
exit;
}
$edit_mode = "1";
if(isset($_POST['edit_mode'])){
$edit_mode = $_POST['edit_mode']; //1:閲覧 2:更新 3:新規 4:削除
}
if( $edit_mode != "3"){
error_log($logheader.'prm error userid='.$userid.' edit_mode='.$edit_mode);
$resp = "ng";
$error_code = -1;
$json_data = json_encode(compact("resp","error_code"),JSON_UNESCAPED_UNICODE);
echo $json_data;
return;
}
//Form data
if(isset($_POST['entry_datas'])){
$entry_datas_str = $_POST['entry_datas'];
$entry_datas = json_decode($entry_datas_str ,true);
}
//
//メインルーチン
//
$config_obj = get_config_obj();
//データベース接続する(MySQLDB)
$dbh = mariadb_connect($config_obj,'app01','webix_webix');
if($dbh == false){
//エラー応答
$resp = "ng";
$error_code = -2;
$json_data = json_encode(compact("resp","error_code"),JSON_UNESCAPED_UNICODE);
echo $json_data;
exit;
}
try{
$insert_sql1 = "INSERT INTO dailyreports(user_id,report_date,work_place,work_details,start_time,end_time,duration_hour,workers,memo,created_userid,updated_userid,created_on,updated_on) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?)";
$insert_stmt = $dbh->prepare($insert_sql1);
// 静的プレースホルダを指定
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
// エラー発生時に例外を投げる
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//トランザクション処理を開始
$dbh->beginTransaction();
$resp = "ok";
$error_code = 0;
//dailyreportsに追加する情報
$insert_stmt->bindValue(1,$userid);
$insert_stmt->bindValue(2,$report_date);
$insert_stmt->bindValue(3,$entry_datas["DR0011_work_place"]);
$insert_stmt->bindValue(4,$entry_datas["DR0011_work_details"]);
$insert_stmt->bindValue(5,$start_time);
$insert_stmt->bindValue(6,$end_time);
$insert_stmt->bindValue(7,$entry_datas["DR0011_duration_hour"]);
$insert_stmt->bindValue(8,$entry_datas["DR0011_workers"]);
$insert_stmt->bindValue(9,$entry_datas["DR0011_memo"]);
$insert_stmt->bindValue(10,$userid); //created_userid
$insert_stmt->bindValue(11,$userid); //updated_userid
$insert_stmt->bindValue(12,date("Y-m-d H:i:s"));
$insert_stmt->bindValue(13,date("Y-m-d H:i:s"));
$insert_stmt->execute();
error_log($logheader.' insert dailyreports report_date='.$report_date.' start_time='.$start_time.' end_time='.$end_time.' duration_hour='.$entry_datas["DR0011_duration_hour"]);
$select_stmt1 = $dbh->prepare("SELECT LAST_INSERT_ID() as report_id");
$select_stmt1->execute();
$insert_code = $select_stmt1->fetchAll(PDO::FETCH_ASSOC); //フィールド名だけで保存(index情報なし)
$report_id = $insert_code[0]["report_id"];
error_log($logheader.' insert report_id:'.$report_id);
$dbh->commit();
error_log($logheader.' commit');
} catch(PDOException $e){
error_log($logheader.' 捕捉した例外: '.$e->getMessage()); //例外発生時の処理(エラー情報をログに格納してエラー応答)
$resp = "ng";
$error_code = -1;
$report_id = "0";
}
$dbh = null;
$json_data = json_encode(compact("resp","error_code","report_id"),JSON_UNESCAPED_UNICODE);
echo $json_data;
?>
今回は、ここまでの紹介です。次回、スマホ画面を紹介します。
(補足)今回、画面を作成するうえで、データベースのテーブル定義を一部、変更しています。
CREATE TABLE `dailyreports` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id:自動連番',
`user_id` varchar(255) NOT NULL DEFAULT '' COMMENT 'ユーザID',
`report_date` date DEFAULT NULL COMMENT '日付',
`work_place` varchar(255) NOT NULL DEFAULT '' COMMENT '作業場所',
`work_details` varchar(255) NOT NULL DEFAULT '' COMMENT '作業内容',
`start_time` time DEFAULT NULL COMMENT '開始時刻',
`end_time` time DEFAULT NULL COMMENT '終了時刻',
`duration_hour` varchar(16) NOT NULL DEFAULT '0.0' COMMENT '経過時間',
`photo_name` varchar(255) NOT NULL DEFAULT '' COMMENT '写真ファイル名',
`photo_folder` varchar(255) NOT NULL DEFAULT '' COMMENT '写真フォルダ名',
`workers` int(4) NOT NULL DEFAULT 0 COMMENT '作業人数',
`memo` varchar(255) NOT NULL DEFAULT '' COMMENT 'メモ',
`latitude` varchar(255) NOT NULL DEFAULT '' COMMENT '緯度',
`longitude` varchar(255) NOT NULL DEFAULT '' COMMENT '経度',
`created_userid` varchar(16) NOT NULL DEFAULT 'admin' COMMENT '作成ユーザ',
`updated_userid` varchar(16) NOT NULL DEFAULT 'admin' COMMENT '更新ユーザ',
`created_on` datetime DEFAULT NULL COMMENT '作成日時',
`updated_on` datetime DEFAULT NULL COMMENT '更新日時',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='作業日報';