「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');
