質問編集履歴

1

質問文を要約しました

2019/10/26 15:10

投稿

sumAA
sumAA

スコア14

test CHANGED
@@ -1 +1 @@
1
- 【Laravel 5.8】jQueryでinputフォームの年月日時分秒の「時分」だけセレクトボックス化したい
1
+ 【Laravel 5.8】view上<input type="datetime">の年月日時分秒の表記をセレクトボックス表記に変させる
test CHANGED
@@ -1,493 +1,83 @@
1
- ### 前提
1
+ ### 実現したいこと
2
2
 
3
3
 
4
4
 
5
- PHP(Laravel 5.8)で勤怠記録保存できシステムを作っています。
5
+ **PHP(Laravel 5.8)のViewファイル上にてDB内の日時(punchIn:画像参照)取得し表示す。その際、日時部分だけプルダウンに**
6
6
 
7
- ユーザーがView画面から記録できるのは、
7
+ ※DB→MySQL
8
8
 
9
+ ※日時のデータ型→Datetime
10
+
9
- 「出勤時間、退勤時間、休憩入り時間、休憩戻り時間、メモ」の5点。
11
+ ![](2ff3b6eefd978ab6c061dd2f0ff28e0e.png)
12
+
13
+ ※データベース内のとあるレコード
10
14
 
11
15
 
12
16
 
13
- 記録は、
17
+ ### 背景
14
-
15
- 1、ユーザー登録、ログイン→Topページへ移行
16
-
17
- 2、Topページから打刻記録ページへ移行
18
-
19
- 3、View上の「ボタン」をクリックによって、その瞬間の出退勤時間がそれぞれ
20
-
21
-  データベース(MySQL)にDatetime型(yyyy-mm-dd h:i:s)で記録される
22
-
23
- 4、記録した出退勤時間、休憩時間、メモの編集をしたければ、
24
-
25
-  Editページで一度記録された時間を変更することができる
26
18
 
27
19
 
28
20
 
29
- 以上が大まかな流れとなります。
21
+ □打刻システムを作成している
30
22
 
31
- ※問題なってるコードは後ほど記載いたします。
23
+ □打刻時間(punchIn)をあで編集した
24
+
25
+ □編集をよりやりやすくしたい
32
26
 
33
27
 
34
28
 
29
+ ### 状況
35
30
 
31
+ ![イメージ説明](a449d39badd6a8b73717e1e95cc61034.png)
36
32
 
37
- **環境:**
33
+ DBのpunchInカラムの日時(datetime型)を画像の1、2のように表記するのに複雑なことはない。
38
34
 
39
- **フレームワーク:Laravel 5.8**
35
+ ```Controller
40
36
 
41
- **View:Bootstrap4**
37
+ public function edit(Request $request, $id)
42
38
 
43
- **データベース:MySQL**
39
+ {
44
40
 
45
- **エディタ:Atom**
41
+ $task = Task::findOrFail($id);
46
42
 
47
- **ブラウザ:Chrom**
43
+ return view('records.edit', compact('task'));
48
44
 
45
+ }
49
46
 
50
-
51
-
52
-
53
- ### 実現したいこと
54
-
55
- **inputフォームの見た目だけ変更させて日時を表示し、データとしてはyyyy-mm-dd h:i:sの形でデータベースに保存したい!**
56
-
57
-
58
-
59
-
60
-
61
- 詳細を申し上げますと、
62
-
63
- Editページでは一度記録した該当月日の
64
-
65
- ・出勤時間
47
+ ```
66
-
67
- ・退勤時間
68
-
69
- ・休憩入り時間
70
-
71
- ・休憩戻り時間
72
-
73
-
74
-
75
- をMySQLから呼び出し、Controllerを介してViewにて表示をしています。
76
-
77
-
78
-
79
-
80
-
81
- 各時間の表示の際、<input type="datetime" value="$hoge->fuga">
82
-
83
- このような記述で記録された時間を初期値としてinputフォームに設定し、
84
-
85
- yyyy-mm-dd h:i:s(例:2019-08-10 10:45:10)が表示されており、
86
-
87
- 必要があれば日時を変更し再度データベースに保存することが可能です。
88
-
89
-
90
-
91
- ここで不満が1つありまして、
92
-
93
- View-Controller-Model-DB間のデータのやりとりには何ら問題はないのですが、
94
-
95
- inputフォームに表示された日時を変更しようとすると非常に面倒くさいのです。
96
-
97
- (例:2019-08-10 10:45:10を、9:45:10に変更するのに手打ちする必要あり)
98
-
99
-
100
-
101
- ユーザーに全然優しくないので、
102
-
103
- yyyy-mm-dd h:i:sのh:iの部分だけでもセレクトボックスにして、
104
-
105
- 編集した日時を再度データベースに保存したいと考えています。
106
-
107
-
108
-
109
-
110
-
111
- ### 発生している問題
112
-
113
- **編集した時間(yyyy-mm-dd h:i:s)を再度データベースに保存する手段を見つけることができない**
114
-
115
-
116
-
117
- 実現のための手段としてjQueryの利用を試みました。
118
-
119
- 1、inputのvalueの初期値に設定した出勤時間のtypeをhiddenに変更(view: edit.blade.controller)
120
48
 
121
49
 
122
50
 
123
51
  ```View
124
52
 
125
- <div class="form-group row">
53
+ 1を出力するには、<p>{{ $task->punchIn }}</p>
126
54
 
127
- <label class="col-md-3">出勤時間</label>
128
-
129
- <input type="datetime" id="punchIn" name="punchIn"
55
+ 2を出力するには、<input type="datetime" value={{ $task->punchIn }}>
130
-
131
- value=" old('punchIn', $task->punchIn) ">
132
-
133
- </div>
134
56
 
135
57
  ```
136
58
 
137
- ↓変更
59
+ 2の表記だと表示した「2019-10-25 00:53:34」の日時を編集することが可能。
138
60
 
139
- ```View
61
+ 別途追記すれば編集後の日時を再度DBへ保存することができる!!
140
62
 
141
- <div class="form-group row">
142
-
143
- <label class="col-md-3">出勤時間</label>
144
-
145
-    <input type="hidden" id="punchIn" name="punchIn"
146
-
147
-     value="{{ old('punchIn', $task->punchIn) }}">
148
-
149
- <p id="punchInYmd" class="pl-3 pr-2"></p>
150
-
151
- <p id="punchInH"></p>
152
-
153
- <p id="punchInMi"></p>
154
-
155
- <select id="my-pIn-hours">
156
-
157
- </select>:
63
+ (※しかし、日時編集はタイピングになるので超面倒・・)
158
-
159
- <select id="my-pIn-minutes">
160
-
161
- </select>
162
-
163
- </div>
164
-
165
- ```
166
64
 
167
65
 
168
66
 
67
+ ### 理想
169
68
 
170
-
171
- 2、jQueryでvalueの初期値(出勤時間)を取得。new Date化した上で値を年月時分秒それぞれ分解→時分の部分だけセレクトボックス化→セレクトボックスで選択した時分を取得(jQuery.js)
69
+ ![イメージ説明](a449d39badd6a8b73717e1e95cc61034.png)
172
70
 
173
71
 
174
72
 
175
- 3、年月日時分秒に分解された出勤時間を連結(jQuery.js)
73
+ **理想は画像の「出勤時間」のようにしたい**
176
74
 
177
- ```jQuery
75
+ ・「出勤時間」の2019-10-25部分はクリックするとカレンダー表記
178
76
 
77
+ ・「日時」はプルダウン化
78
+
179
- $(function(){
79
+ ・「秒」は邪魔なので表記不要
180
80
 
181
81
 
182
82
 
183
- var pIn = $('#punchIn').val();
184
-
185
- var pInTime = new Date( pIn );
186
-
187
- var pInY = pInTime.getFullYear();
188
-
189
- var pInM = (pInTime.getMonth() + 1);
190
-
191
- var pInD = pInTime.getDate();
192
-
193
- var pInH = pInTime.getHours();
194
-
195
- var pInMi = pInTime.getMinutes();
196
-
197
- var pInS = pInTime.getSeconds();
198
-
199
-
200
-
201
- $('#punchInH').text( pInH ).hide();
202
-
203
- $('#punchInMi').text( pInMi ).hide();
204
-
205
-
206
-
207
- var pInHour = $('#punchInH').text();
83
+ いかにjQueryなどを使用しスマートに実装できるか知恵をいただけませんでしょうか??
208
-
209
- var hours = [
210
-
211
- '00',
212
-
213
- '01',
214
-
215
- '02',
216
-
217
- '03',
218
-
219
- '04',
220
-
221
- '05',
222
-
223
- '06',
224
-
225
- '07',
226
-
227
- '08',
228
-
229
- '09',
230
-
231
- '10',
232
-
233
- '11',
234
-
235
- '12',
236
-
237
- '13',
238
-
239
- '14',
240
-
241
- '15',
242
-
243
- '16',
244
-
245
- '17',
246
-
247
- '18',
248
-
249
- '19',
250
-
251
- '20',
252
-
253
- '21',
254
-
255
- '22',
256
-
257
- '23',
258
-
259
- ],
260
-
261
- $selectHours = $('#my-pIn-hours'),
262
-
263
- $optionHours,
264
-
265
- optionsHours,
266
-
267
- isSelectedHour;
268
-
269
-
270
-
271
- optionsHours = $.map(hours, function(name, value){
272
-
273
- isSelectedHour = (name === pInHour);
274
-
275
- $optionHours = $('<option>', {value: value, text: name, selected: isSelectedHour});
276
-
277
- return $optionHours;
278
-
279
- });
280
-
281
- $selectHours.append(optionsHours);
282
-
283
-
284
-
285
-
286
-
287
- var pInMinute = $('#punchInMi').text();
288
-
289
- var minutes = {
290
-
291
- 0:'00',
292
-
293
- 1:'01',
294
-
295
- 2:'02',
296
-
297
- 3:'03',
298
-
299
- 4:'04',
300
-
301
- 5:'05',
302
-
303
- 6:'06',
304
-
305
- 7:'07',
306
-
307
- 8:'08',
308
-
309
- 9:'09',
310
-
311
- 10:'10',
312
-
313
- 11:'11',
314
-
315
- 12:'12',
316
-
317
- 13:'13',
318
-
319
- 14:'14',
320
-
321
- 15:'15',
322
-
323
- 16:'16',
324
-
325
- 17:'17',
326
-
327
- 18:'18',
328
-
329
- 19:'19',
330
-
331
- 20:'20',
332
-
333
- 20:'20',
334
-
335
- 21:'21',
336
-
337
- 22:'22',
338
-
339
- 23:'23',
340
-
341
- 24:'24',
342
-
343
- 25:'25',
344
-
345
- 26:'26',
346
-
347
- 27:'27',
348
-
349
- 28:'28',
350
-
351
- 29:'29',
352
-
353
- 30:'30',
354
-
355
- 31:'31',
356
-
357
- 32:'32',
358
-
359
- 33:'33',
360
-
361
- 34:'34',
362
-
363
- 35:'35',
364
-
365
- 36:'36',
366
-
367
- 37:'37',
368
-
369
- 38:'38',
370
-
371
- 39:'39',
372
-
373
- 40:'40',
374
-
375
- 41:'41',
376
-
377
- 42:'42',
378
-
379
- 43:'43',
380
-
381
- 44:'44',
382
-
383
- 45:'45',
384
-
385
- 46:'46',
386
-
387
- 47:'47',
388
-
389
- 48:'48',
390
-
391
- 49:'49',
392
-
393
- 50:'50',
394
-
395
- 51:'51',
396
-
397
- 52:'52',
398
-
399
- 53:'53',
400
-
401
- 54:'54',
402
-
403
- 55:'55',
404
-
405
- 56:'56',
406
-
407
- 57:'57',
408
-
409
- 58:'58',
410
-
411
- 59:'59',
412
-
413
- },
414
-
415
- $selectMinutes = $('#my-pIn-minutes'),
416
-
417
- $optionMinutes,
418
-
419
- optionsMinutes,
420
-
421
- isSelectedMinute;
422
-
423
-
424
-
425
- // コールバック関数の引数の順序が $.each と異なることに注
426
-
427
- optionsMinutes = $.map(minutes, function (name, value) {
428
-
429
- isSelectedMinute = (name === pInMinute);
430
-
431
- $optionMinutes = $('<option>', { value: value, text: name, selected: isSelectedMinute });
432
-
433
- return $optionMinutes;
434
-
435
- });
436
-
437
-
438
-
439
- $selectMinutes.append(optionsMinutes);
440
-
441
-
442
-
443
- var pInHSel = $('select[id="my-pIn-hours"] > option:selected').text();
444
-
445
- var pInMiSel = $('select[id=my-pIn-minutes] > option:selected').text();
446
-
447
-
448
-
449
- var test222 = $('#punchIn').text(pInY + '-' + pInM + '-' + pInD + ' ' + pInHSel + ':' + pInMiSel + ':' + pInS);
450
-
451
- });
452
-
453
- ```
454
-
455
- ここまできてようやくミスに気がつきました。
456
-
457
- 最後の変数 var test222で、Viewのid=punchInのinputフォームのValueに編集した日時を入れることはできます。
458
-
459
- ```
460
-
461
- <input type="datetime" value="$hoge->fuga">
462
-
463
-
464
-
465
- ```
466
-
467
- valueの値は変更せずフォームの中の値だけ変更すれば、変更内容は問題なくデータベースに反映されます。しかし、これまで試した流れだと
468
-
469
- ```
470
-
471
- <input type="datetime" value="$hoge->fuga">
472
-
473
-
474
-
475
- <input type="datetime" value="2019-08-10 10:45:10">
476
-
477
- ```
478
-
479
- と書き換わってしまうためDBへ変更した年月日時分秒の送信が困難です。
480
-
481
- フォームをinputから変更しなければデータの記録としては何の問題もありませんが、ユーザーには使いにくいままとなってしまうでしょう。Valueの値を変更しない方法、Valueの値を複数用いる方法も検討しましたが解決の糸口をつかめませんでした。
482
-
483
-
484
-
485
- 設計ミスで既に手段がないのか、
486
-
487
- それとももっと単純な何かを見落としているのか、
488
-
489
- 現状の私の力量では判断すらできません。
490
-
491
- 知恵をお借りしたく今回書き込ませていただきました。
492
-
493
- 何卒よろしくお願いいたします。