jQuery UI Datepickerで動的に選択不可日を設定したい。
前提・実現したいこと
Laravel5.5を使って、システム開発を行っています。
日付を入力する箇所が2ヶ所あり(出発日時、到着日時)、それぞれに関して入力補助として jQuery UI Datepicker を使用してカレンダーを出すようにしています。
その際に、選択不可となる日付をサーバーから取得し、カレンダーに反映しています。
初期表示時にPHPで取得した配列($arr_list['unavailable_days'])の内容は
array:1 [
0 => "2018-06-19",
1 => "2018-06-24"
]
です。
こちらの値を用いて初期表示を行うと、2018/06/19 と 2018/06/24 がカレンダー上で選択不可状態で表示されます。
これが「正常にカレンダーに反映できた」という状態です。
初期表示させた後、出発空港または到着空港を変更した場合、初期表示の場合と同じくサーバーから選択不可となる日付を取得し、カレンダーに反映させたいと考えています。
初期表示は正常にカレンダーに反映できたのですが、変更時のカレンダー反映ができない状況にあります。
下記、表示を行っているHTMLと、処理を行っているJS部分となります。
HTML
1<tr class="required"> 2 <th colspan="2">出発空港</th> 3 <td class="form-group"> 4 <span class="lookup w30"> 5 <input class="form-control airport-dialog" name="departure_airport" type="text" value=""> 6 <input class="form-control" name="departure_airport_id" type="hidden" value=""> 7 </span> 8 </td> 9</tr> 10 11<tr class="required"> 12 <th colspan="2">到着空港</th> 13 <td class="form-group"> 14 <span class="lookup w30"> 15 <input class="form-control airport-dialog" name="arrival_airport" type="text" value=""> 16 <input class="form-control" name="arrival_airport_id" type="hidden" value=""> 17 </span> 18 </td> 19</tr> 20 21<tr class="required"> 22 <th colspan="2">出発日時</th> 23 <td class="form-group"> 24 <input id="departure_date" type="tel" name="departure_date" value="" class="form-control w30 rm10" style="width:250px;display:inline;" placeholder="yyyy/mm/dd" autocomplete="off" > 25 </td> 26</tr> 27 28<tr class="required"> 29 <th colspan="2">到着日時</th> 30 <td class="form-group"> 31 <input id="arrival_date" type="tel" name="arrival_date" value="" class="form-control w30 rm10" style="width:250px;display:inline;" placeholder="yyyy/mm/dd" autocomplete="off" > 32 </td> 33</tr>
JavaScript
1<script> 2//出発日時カレンダー初期表示 3$(function () { 4 var dateFormat = 'yyyy/mm/dd'; 5 var disableDates = [ 6 @foreach($arr_list['unavailable_days'] as $num => $days) 7 <?php 8 $days_ = str_replace('-','/',$days); 9 ?> 10 '{{$days_}}', 11 @endforeach 12 ]; 13 14 //出発日カレンダー指定 15 $('#departure_date').datepicker({ 16 format: dateFormat, 17 startDate: '+1d', 18 endDate: '+30d', 19 beforeShowDay : function(days) { 20 var formatedDate = $.datepicker.formatDate('yy/mm/dd', days); 21 return ( disableDates.indexOf(formatedDate) == -1 ); 22 } 23 }); 24}); 25 26//到着日時カレンダー初期表示 27$(function () { 28 var dateFormat = 'yyyy/mm/dd'; 29 var disableDates = [ 30 @foreach($arr_list['unavailable_days'] as $num => $days) 31 <?php 32 $days_ = str_replace('-','/',$days); 33 ?> 34 '{{$days_}}', 35 @endforeach 36 ]; 37 38 //到着日カレンダー指定 39 $('#arrival_date').datepicker({ 40 format: dateFormat, 41 startDate: '+1d', 42 endDate: '+30d', 43 beforeShowDay : function(days) { 44 var formatedDate = $.datepicker.formatDate('yy/mm/dd', days); 45 return ( disableDates.indexOf(formatedDate) == -1 ); 46 } 47 }); 48}); 49 50 51//変更時の処理 52$(function() { 53 //出発空港の変更検知 54 $(document).on('blur', 'input[name=departure_airport]', function() { 55 datetime(); 56 }); 57 58 //到着空港の変更検知 59 $(document).on('blur', 'input[name=arrival_airport]', function() { 60 datetime(); 61 }); 62 63 function datetime(){ 64 var departure_airport_id = document.form_main.departure_airport_id.value; 65 var arrival_airport_id = document.form_main.arrival_airport_id.value; 66 var token = '{{csrf_token()}}' 67 68 //空港変更時 69 if(departure_airport_id!="" && arrival_airport_id!=""){ 70 var dateFormat = 'yy/mm/dd'; 71 var send_url = '{{url('flight/unavail_days')}}'; 72 73 var formData = new FormData(); 74 formData.append('_token', token); 75 formData.append('departure_airport_id', departure_airport_id); 76 formData.append('arrival_airport_id', arrival_airport_id); 77 78 $.ajax({ 79 type: 'POST', 80 contentType: false, 81 processData: false, 82 url: send_url, 83 data: formData, 84 success: function(rdata) { 85 var disableDates = JSON.parse(rdata); 86 87 //カレンダー制御 88 $('#departure_date').datepicker('option','beforeShowDay',function(days){ 89 var formatedDate = $.datepicker.formatDate(dateFormat, days); 90 return ( disableDates.indexOf(formatedDate) == -1 ); 91 }); 92 93 //カレンダー制御 94 $('#arrival_date').datepicker('option','beforeShowDay',function(days){ 95 var formatedDate = $.datepicker.formatDate(dateFormat, days); 96 return ( disableDates.indexOf(formatedDate) == -1 ); 97 }); 98 }, 99 error: function(data) { 100 //alert('エラーが発生しました。'); 101 }, 102 }); 103 } 104 } 105}); 106</script>
となっています。
試したこと
Ajax直後での取得データと、カレンダー制御部分でコンソールへのログ出力を行いました。
JavaScript
1 success: function(rdata) { 2 var disableDates = JSON.parse(rdata); 3console.log('データ取得'); 4console.log(disableDates); 5 //カレンダー制御 6 $('#departure_date').datepicker('option','beforeShowDay',function(days){ 7console.log('選択不可'); 8console.log(days); 9 var formatedDate = $.datepicker.formatDate(dateFormat, days); 10 return ( disableDates.indexOf(formatedDate) == -1 ); 11 });
Ajaxでのデータは
データ取得
edit:1535 (2) ["2018/06/19", "2018/06/24"]
という様に取得できているのですが、カレンダーへの反映部分がうまく動作していない様です。
⇒console.log('選択不可'); と console.log(days); が出力されない。
おそらく呼び出し方に問題があると思われますが、この状態からどの様に対応すれば良いかといった部分で詰まっています。
補足情報(FW/ツールのバージョンなど)
◆動作環境
・Windows10 Pro 64bit
・Apache2.4
・PHP7.1
・Laravel5.5
・MySQL5.7
・jQuery UI Datepicker
⇒http://js.studio-kingdom.com/jqueryui/widgets/datepicker
