cakephp3系でajaxを使い、リアルタイムでデータを取得し、グラフで表示したい
こんにちは。Cakephpを最近勉強し始めたものなのですが、
今回はajaxとcakephpとの連携で引っかかってしまったので
質問させていただきます。
今回実現させたいことは、Datasというデータベースからのデータをajaxをつかってリアルタイムで更新しながらChart.jsを使ったグラフで表示させるというものです。
データベースはresult(値は1つ),created(投票された時間)の二つです。
このresultはAとBがあり、これをパーセンテージ化して表示したいと思っています。
また、リアルタイムというのは毎秒1秒で更新したいと思っています。
一応書いたコードがこちらになります。
/js/ajax.js
$(function() {
$.ajax({
url: "result",
type: "get",
dataType: "html"
}).done(function (response) {
//dataからAとBのパーセントを割り出してa_lastに代入するコードが入ります
var chartColors = {
red: 'rgb(255, 99, 132)',
};
function onRefresh(chart) {
chart.config.data.datasets.forEach(function(dataset) {
dataset.data.push({
x: a_last,
y: Date.now()
});
});
}
var color = Chart.helpers.color;
var config = {
type: 'line',
data: {
datasets: [{
label: '結果',
backgroundColor: color(chartColors.red).alpha(0.5).rgbString(),
borderColor: chartColors.red,
fill:false
}]
},
options: {
title: {
display: true,
text: '結果'
},
scales: {
xAxes: [{
type: 'linear',
display: true,
scaleLabel: {
display: true,
labelString: '%'
}
}],
yAxes: [{
type: 'realtime',
realtime: {
duration: 10000,
refresh: 1000,
delay: 2000,
onRefresh: onRefresh
},
}]
},
tooltips: {
mode: 'nearest',
intersect: false,
callbacks: {
title: function(tooltipItems) {
return tooltipItems[0].yLabel;
},
label: function(tooltipItem, data) {
var label = data.datasets[tooltipItem.datasetIndex].label;
if (label) {
label += ': ';
}
label += tooltipItem.xLabel;
return label;
}
}
},
hover: {
mode: 'nearest',
intersect: false
}
}
};
window.onload = function() {
var ctx = document.getElementById('myChart').getContext('2d');
window.myChart = new Chart(ctx, config);
};
}).fail(function () {
alert("failed");
});
});
こちらはctpファイルです。
<script type="text/javascript">
var data = [];
var updata = function(){
<?php foreach ($datas as $data): ?>
var A = "A"
var B = "B"
var result = <?= h($data->result) ?>;
if (result!=0){
data.push(result);
}
<?php endforeach; ?>
setTimeout(updata, 10000);
}
updata();
</script>
<?php echo $this->Html->script('ajax.js');?>
<canvas id="myChart"></canvas>
こちらがcontrollerです。
public function result()
{
$datas = $this->paginate($this->Datas);
$this->set(compact('datas'));
}
こんな感じにしたいです。
今の段階としては、グラフは動きますが、50パーセントであったらずっと50パーセントのままという感じです。