「Highchartsによるチャートの表示」でHighchartsにより環境データをチャートで表示しましたが、今回はLaravel(「Laravel5.3を用いたJosh Admin templateのインストール」を使用)上で、HighchartsやDataTableを使って環境データを表示します。ブラウザから「http://localhost/weather/」をアクセスすると次の画面が表示されます。
Laravelコードの作成
Laravelのコードは、「LaravelでRestfulなインタフェースの実装」で作成したコードを使用します。詳細な情報は、「Highcharts」、「DataTable」を参照してください。
- 15行目でHighchartsによるチャートとDataTableによるテーブルを表示するために、「weather.index」を呼び出します。
- 18行目の関数「tabledata」は、DataTableによるAjaxの呼び出しを受けて制御が移されます。関数「tabledata」では変数「$request」により渡された表示日時に従って、データベースから環境データを取得し、DataTableに渡します。
- 43行目の関数「chartdata」は、HighchartsによるAjaxの呼び出しを受けて制御が移されます。関数「chartdata」では変数「$request」により渡された表示日時に従って、データベースから環境データを取得し、Highchartsに渡します。
WeatherController.php
use Illuminate\Http\Request; use App\Senser; use Yajra\DataTables\DataTables; use Log; class WeatherController extends Controller { /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { Log::info("WeatherController index"); return view('weather.index'); // } public function tabledata(Request $request) { Log::info("WeatherController tabledata"); $value = $request->input('datedata'); Log::info("WeatherController tabledata: " . $value); $from = date('2021-03-31 00:00:00'); $to = date('2021-03-31 23:59:59'); $sensers = Senser::whereBetween('created_at', [$from, $to]) ->groupBy(\DB::raw('substr(created_at, 1, 13)')) ->get(); $timex = substr($sensers[1]["created_at"], 1, 13); // Log::info(substr($sensers[1]["created_at"], 1, 13) . "00"); for ($i = 0; $i < count($sensers); $i++) { $sensers[$i]["created_at"] = substr($sensers[$i]["created_at"], 1, 13) . "00:00"; $sensers[$i]["temperature"] = round($sensers[$i]["temperature"], 1); $sensers[$i]["humidity"] = round($sensers[$i]["humidity"], 1); $sensers[$i]["pressure"] = round($sensers[$i]["pressure"], 1); } return Datatables::of($sensers) ->make(true); } public function chartdata(Request $request) { Log::info("WeatherController chartdata"); $value = $request->input('datedata'); // Log::info("WeatherController chartdata: " . $value); // $yesterday_date = $_GET['yesterday_date']; // $yesterday_date = '2016/07/29'; $value = '2021-03-31'; $from = date($value . ' 00:00:00'); $to = date($value . ' 23:59:59'); $sensers = Senser::select(['created_at', 'temperature', 'humidity', 'pressure']) ->whereBetween('created_at', [$from, $to]) ->groupBy(\DB::raw('substr(created_at, 1, 13)')) ->get(); // Log::info($sensers); // Log::info($sensers[2]["temperature"]); $data = array(); for ($i = 0; $i < count($sensers); $i++) { $data[0][$i] = round($sensers[$i]["temperature"], 1); $data[1][$i] = round($sensers[$i]["humidity"], 1); $data[2][$i] = round($sensers[$i]["pressure"], 1); } // Log::info($data); //header('Content-type: application/json; charset=UTF-8'); return json_encode($data); }
- 13行目にHighchartsによるチャート、24行目にDataTableによるテーブルをそれぞれ表示します。
- 42-44行目にHighchartsの、47,48行目にDataTableのjQuery宣言を示します。
- 69-240行目でHighchartsによりチャートを描画するために、Ajaxにより環境データを要求します。
- 244-266行目でDataTableによりテーブルを描画するために、Ajaxにより環境データを要求します。
- 53-66行目でパラメータで与えられた日付を文字列に変換します。
index.blade.php
・・・ <div class="panel-heading border-light"> <h3 class="panel-title"> <i class="livicon" data-name="dashboard" data-size="18" data-color="white" data-hc="white" data-l="true"></i> お天気データ </h3> </div> <div class="panel-body"> <div class="table-responsive"> <div> <ul id="container"></ul> </div> </div> </div> ・・・ <div class="panel-body"> <div class="table-responsive"> <table class="table table-bordered " id="sensers"> <thead> <tr class="filters"> <th>日付</th> <th>気温(℃)</th> <th>湿度(%)</th> <th>気圧(hPa)</th> </tr> </thead> <tbody> </tbody> </table> </div> </div> ・・・ <!-- Highcharts--> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> <script type="text/javascript" src="http://code.highcharts.com/highcharts.js"></script> <script type="text/javascript" src="http://code.highcharts.com/modules/exporting.js"></script> <!-- dataTable--> <script type="text/javascript" src="{{ asset('assets/vendors/datatables/js/jquery.dataTables.js') }}" ></script> <script type="text/javascript" src="{{ asset('assets/vendors/datatables/js/dataTables.bootstrap.js') }}" ></script> ・・・ function datestring(daydata) { console.log("start datestring!"); var date = new Date(); date.setDate(date.getDate() + daydata); var year = date.getFullYear(); var month = (1 + date.getMonth()).toString(); month = month.length > 1 ? month : '0' + month; var day = date.getDate().toString(); day = day.length > 1 ? day : '0' + day; var hours = date.getHours().toString(); var convday = year + '-' + month + '-' + day; console.log("datestring! : " + convday + ' ' + hours); return convday; }; $(function () { var name = "hoge"; var options = { chart: { renderTo: 'container', type: 'spline', zoomType: 'x' }, title: { text: '気象データ in 横浜' }, subtitle: { text: '提供: TomoSoft(https://tomosoft.jp/design/)' }, credits: { enabled: false }, xAxis: [{ title: { text: '時刻', }, categories: ['00:00', '01:00', '02:00', '03:00', '04:00', '05:00', '06:00', '07:00', '08:00', '09:00', '10:00', '11:00', '12:00', '13:00', '14:00', '15:00', '16:00', '17:00', '18:00', '19:00', '20:00', '21:00', '22:00', '23:00'], crosshair: true }], yAxis: [{// Primary yAxis title: { text: '気温', style: { color: '#228B22', //ForestGreen } }, labels: { format: '{value}℃', style: { color: '#228B22', } }, ceiling: 35, floor: - 10 }, {// Secondary yAxis gridLineWidth: 0, title: { text: '湿度', style: { color: '#4169E1', //RoyalBlue } }, labels: { format: '{value} %', style: { color: '#4169E1', } }, ceiling: 90, floor: 20, opposite: true }, {// Tertiary yAxis gridLineWidth: 0, title: { text: '気圧', style: { color: '#DAA520', // GoldenRod } }, labels: { format: '{value} hPa', style: { color: '#DAA520', } }, ceiling: 1030, floor: 990, opposite: true }], tooltip: { formatter: function () { var s = this.x; s += '<br/>' + '<span style="color:#228B22;">' + this.points[2].series.name + '</span>' + ': ' + this.points[2].y + '℃'; s += '<br/>' + '<span style="color:#4169E1;">' + this.points[1].series.name + '</span>' + ': ' + this.points[1].y + '%'; s += '<br/>' + '<span style="color:#DAA520;">' + this.points[0].series.name + '</span>' + ': ' + this.points[0].y + 'hPa'; return s; }, shared: true }, exporting: { buttons: { customButton: { text: '昨日', onclick: function () { alert('昨日'); $.getJSON('{!! route('chartdata') !!}', {"datedata": datestring( - 1)}, function (data) { options.series[2].data = data[0]; options.series[1].data = data[1]; options.series[0].data = data[2]; var chart = new Highcharts.Chart(options); }); } }, anotherButton: { text: '今日', onclick: function () { alert('今日'); $.getJSON('{!! route('chartdata') !!}', {"datedata": datestring(0)}, function (data) { options.series[2].data = data[0]; options.series[1].data = data[1]; options.series[0].data = data[2]; var chart = new Highcharts.Chart(options); }); } } } }, legend: { layout: 'vertical', align: 'left', x: 80, verticalAlign: 'top', y: 35, floating: true, backgroundColor: (Highcharts.theme && Highcharts.theme.legendBackgroundColor) || '#FFFFFF' }, series: [{ name: '気圧', type: 'column', yAxis: 2, color: '#DAA520', data: [1016, 1016, 1015.9, 1015.5, 996.3, 1009.5, 1009.6, 1010.2, 1013.1, 1016.9, 1018.2, 1016.7, 1016, 1016, 1015.9, 1015.5, 1012.3, 1009.5, 995.6, 1010.2, 1013.1, 1000.9, 1018.2, 1016.7], legendIndex: 2, marker: { enabled: false }, dashStyle: 'shortdot', tooltip: { valueSuffix: ' hPa' } }, { name: '湿度', type: 'spline', yAxis: 1, color: '#4169E1', data: [45.9, 71.5, 50.4, 50.2, 55.0, 60.0, 70.6, 60.5, 70.4, 63.1, 70.6, 54.4, 49.9, 71.5, 50.4, 50.2, 45.0, 50.0, 70.6, 60.5, 62.4, 50.1, 75.6, 54.4], legendIndex: 1, tooltip: { valueSuffix: ' %' } }, { name: '気温', type: 'spline', yAxis: 0, color: '#228B22', data: [7.0, 6.9, 9.5, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6, 7.0, 6.9, 9.5, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6], legendIndex: 0, tooltip: { valueSuffix: ' ℃' } }] }; $.getJSON('{!! route('chartdata') !!}', {"datedata": datestring(0)}, function (data) { options.series[2].data = data[0]; options.series[1].data = data[1]; options.series[0].data = data[2]; var chart = new Highcharts.Chart(options); }); }); ・・・ $(function () { var table = $('#sensers').DataTable({ lengthMenu: [10], displayLength: 11, // 件数切替機能 無効 lengthChange: false, // 検索機能 無効 searching: false, // 情報表示 無効 info: false, processing: true, serverSide: true, ajax:{ "url" :"{!! route('tabledata') !!}", data: { "datedata" : datestring(0) } }, columns: [ {data: 'created_at', name: 'created_at', format: 'M/D/YYYY'}, {data: 'temperature', name: 'temperature'}, {data: 'humidity', name: 'humidity'}, {data: 'pressure', name: 'pressure'}, ] }); });
- HighchartsによりAjaxが発行されると、3行目でコントローラ「WeatherController」の関数「tabledata」に制御を移します。
- DataTableによりAjaxが発行されると、4行目でコントローラ「WeatherController」の関数「chartdata」に制御を移します。
web.php
#frontend views Route::get('tabledata', 'WeatherController@tabledata')->name('tabledata'); Route::get('chartdata', 'WeatherController@chartdata')->name('chartdata'); Route::resource('/','WeatherController');