Assalamualaikum Warohmatulloh Wabarokatuh, melanjutkan tulisan sebelumnya yang ditulis oleh @rap92 (Rio Aditya) yang berjudul “Menampilkan Data Sebaran Covid-19 Dengan Laravel 7 Dan API Kawal Corona“; Di sini saya akan melanjutkan untuk menambahkan grafik dengan Laravel Charts agar data yang ditampilkan lebih informatif dan lebih mudah dipantau.
Dalam pembuatan projek ini saya akan menggunakan Laravel 7 & Laravel Chart, tentunya tetap memanfaatkan fitur HTTP Client dari Laravel 7. Oke saya anggap kawan kawan sudah meginstal Laravel atau sudah mengikuti tulisan sebelumnya.
Maka berikutnya kita instal dulu package Laravel Chart menggunakan composer.
composer require consoletvs/charts:6.*
Membuat Class Laravel Chart
Setelah proses instalasi Laravel Charts sudah selesai, kita bisa membuat sebuah Class Chart dengan menggunakan perintah Artisan.
php artisan make:chart {Name} {Library?}
Pada perintah di atas {Name}
bisa kita isi dengan nama Class yang akan dibuat, sedangkan {Library}
bisa diisi dengan library chart yang disediakan oleh Laravel Chart, atau kosongkan jika ingin menggunakan library default (chart.js), jadi bisa jalankan perintah ini.
php artisan make:chart CovidChart
Maka akan terbuat file baru app/Charts/CovidChart.php
, yang isinya seperti ini.
<?php
namespace App\Charts;
use ConsoleTVs\Charts\Classes\Chartjs\Chart;
class CovidChart extends Chart
{
/**
* Initializes the chart.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
}
Membuat Controller
Biarkan file tersebut seperti itu saja, sekarang kita buat sebuah controller, kalau kawan kawan sudah mengikuti tulisan sebelumnya, boleh lewati langkah ini dan gunakan controller yang sudah ada.
php artisan make:controller CovidController
Jika controller sudah terbuat kawan kawan bisa masuk ke app/Http/Controllers/CovidController.php
dan tambahkan sebuah method baru dengan nama chart()
misalnya.
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class CovidController extends Controller
{
public function chart()
{
# code...
}
}
Mengambil Data dari API Kawal Corona
Kemudian tambahkan kode untuk mengambil data dari api kawalcorona dan buat menjadi sebuah collection ke dalam method chart()
, kenapa dijadikan collection? nanti kawan kawan juga tahu 😛 , dan tambahkan dd()
untuk variabel $suspects
untuk mengecek reponse dari API.
$suspects = collect(Http::get('https://api.kawalcorona.com/indonesia/provinsi')->json());
dd($suspects);
Dan jangan lupa untuk import namespace untuk Http Client
di atas deklarasi class.
use Illuminate\Support\Facades\Http;
Kemudian daftarkan sebuah URI di routes/web.php
.
Route::get('corona', 'CovidController@chart');
Setelah itu jalankan php artisan serve
dan buka browser lalu akses URL yang sudah kita daftarkan tadi, harusnya di http://localhost:8000/corona
, kurang lebih seperti ini datanya.
Mengolah Data dari Response
Jika sudah hapus kode dd($suspects);
kemudian tambahkan kode di bawah ini di bawah kode yang tadi.
$labels = $suspects->flatten(1)->pluck('Provinsi');
$data = $suspects->flatten(1)->pluck('Kasus_Posi');
Oke saya jelaskan kenapa tadi kita menjadikan datanya sebagai collection, karena kita akan menggunakan method yang ada pada collection Laravel yang bisa memudahkan proses ini, method yang kita gunakan adalah flatten()
dan pluck()
.
Mari dibahas kegunaan method dari collection yang akan kita gunakan, karena saya nggak suka kalo kawan kawan cuma jadi tukang copas 😛 tapi nggak paham maksudnya.
flatten()
sesuai artinya digunakan untuk meratakan, pada penggunaan kasus ini kita akan meratakan array agar key ‘attributes’ hilang, maka digunakanflatten(1)
karena kita akan meratakan hanya 1 level.pluck()
jika diterjemahkan artinya memetik, kurang lebih memang fungsinya untuk memetik, nah tapi bukan memetik buah ya, tapi digunakan memetik value berdasarkan key yang sudah ditentukan, contohpluck('Provinsi')
maka akan mengambil semua value dari keyProvinsi
dan membuat sebuah array / collection sebagai hasilnya.
Mungkin nanti jelasnya akan saya dalam video tentang dua method tersebut, sekarang kita lanjutkan kodenya, lanjutkan kodenya di bawahnya ya.
$chart = new CovidChart;
$chart->labels($labels);
$chart->dataset('Kasus Positif', 'pie', $data);
Serta import namespace dari CovidChart
di atas deklarasi class.
use App\Charts\CovidChart;
Penjelasannya kode di atas seperti ini :
- pertama kita membuat sebuah object dalam variabel
$chart
dari classCovidChart
. - Kemudian kita buat label dengan method
labels()
dengan data yang berasal dari variabel$labels
. - Terakhir kita buat dataset dengan method
dataset()
- Parameter pertama adalah sebagai judul,
- Parameter keudua adalah pilihan tipe dari chart yang akan ditampilkan beberapa tipe yang bisa digunakan antara lain :
line
,pie
,doughnut
. - Parameter ketiga adalah data yang kita tampilkan didapatkan dari data kasus positif corona di variabel
$data
.
Setelah itu kita buat return
untuk menampilkan view.
return view('corona', [
'chart' => $chart,
]);
Membuat File View
Karena kita belum memiliki file view maka kita buat terlebih dulu di folder resources/views
dengan nama corona.blade.php
dan isi dengan kode di bawah ini.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Corona</title>
</head>
<body>
<h1>Peta Sebaran Covid-19 di Indonesia</h1>
{!! $chart->container() !!}
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.1/Chart.min.js" charset="utf-8"></script>
{!! $chart->script() !!}
</body>
</html>
Untuk bagian CDN kawan kawan sesuaikan dengan library chart yang digunakan ya, karena di sini saya gunakan default maka saya gunakan CDN Chart.js
. Kemudian kita coba akses kembali http://localhost:8000/corona
, dan akan tampil seperti gambar di bawah ini.
Seperti yang terlihat di atas, grafik yang kita buat tidak memiliki warna, untungnya package Laravel Charts menyediakan method yang mudah untuk memberikan warna pada grafiknya. Dengan menggunakan method backgroundColor($colors)
dimana untuk variabel $colors
merupakan sebuah array sesuai banyaknya data. Dan di sini saya kembali menggunakan method pada collection di Laravel yaitu map()
untuk membuat warnanya, dan secara acak, jadi ketika halaman di refresh maka warna akan berubah.
$colors = $labels->map(function($item) {
return $rand_color = '#' . substr(md5(mt_rand()), 0, 6);
});
Kemudian pada dataset
yang kita miliki tambahkan method backgroundColor()
.
$chart->dataset('Kasus Positif', 'pie', $data)->backgroundColor($colors);
Akses lagi halaman http://localhost:8000/corona
maka akan tampil seperti ini.
File Controller & Hasil
Dan untuk yang kesulitan dengan file controllernya ini adalah kode lengkap dari file app/Http/Controllers/CovidController.php
.
<?php
namespace App\Http\Controllers;
use App\Charts\CovidChart;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
class CovidController extends Controller
{
public function chart()
{
$suspects = collect(Http::get('https://api.kawalcorona.com/indonesia/provinsi')->json());
$labels = $suspects->flatten(1)->pluck('Provinsi');
$data = $suspects->flatten(1)->pluck('Kasus_Posi');
$colors = $labels->map(function($item) {
return $rand_color = '#' . substr(md5(mt_rand()), 0, 6);
});
$chart = new CovidChart;
$chart->labels($labels);
$chart->dataset('Kasus Positif', 'pie', $data)->backgroundColor($colors);
return view('corona', [
'chart' => $chart,
]);
}
}
Dan untuk yang ingin penjelasan lebih rinci silakan simak video dibawah ini.
Wassalamualaikum Warohmatulloh Wabarokatuh.
* Ikon chart oleh Freepik dari www.flaticon.com
Gan request dong peta persebarannya sekalian saya mau belajar GIS
Hmmm, sepertinya tidak akan sampai buat peta mas, untuk peta bisa dikombinasikan dengan gmaps dengan data yang sudah didapatkan.
Mantap min ijin coba . Buat Tutorial peta persebaran juga min hehe.
Silakan dicoba, untuk peta bisa dikombinasikan saja dengan Google Maps 😀
bang posisi saya pakai laravel 5.8.
pakek script diatas menemukan error bang, seperti ini bang “Call to a member function pluck() on array, Call to a member function flatten() on array, Call to a member function map() on array
”
kemudian saya coba googling pakek cara lain udah teratasi yang pluck sama flatten, error nya kurang yang Call to a member function map() on array yg random color itu ngatasin gmn yaa?
ini code saya,
$flattened = array_flatten($datajson, 1);
$label = array_pluck($flattened, ‘provinsi’);
$positif = array_pluck($flattened, ‘kasusPosi’);
//error disini
$colors = $label->map(function($item) {
return $rand_color = ‘#’ . substr(md5(mt_rand()), 0, 6);
});
kalau pakai Laravel 5.8 berarti pakai guzzle ya mas? kalau untuk flatten() , pluck() itu udah ada kok dari Laravel 5 mas
iya bang pakai guzzle. untuk ngatasin Call to a member function map() itu gmn ya bang.
Harusnya untuk data yang sudah dalam format Collection, itu bisa gunakan map(), coba cek tipe datanya mas
Mas kenapa kalau di gabung sama bootstrap dia errro ya lopping s
errornya bagaimana?
Assalamu’alaikum mas dan selamat sahur, kalau kita bikin table di bawah chart dengan controller yang sama dengan chart bisa ngak mas??
kalau bisa kayak gimana passing data nya mas??
di jawab ya mass 😀
Waalaikumsalam, bisa saja, bisa pakai data yang sama kok.
misi gan, kok saya ikut tutor di sini & divideo kok gagal terus ya ? pas di akses “404 Not Found” begitu terus.
posisi pakai “Laravel Framework 7.15.0”
ada screenshot? route sudah?
Mas saya mau tanya ini kan untuk get data aja dari server, kalau mau crud bagaimana ya mas?
CRUD dengan API? tinggal sesuaikan saja methodnya 🙂
Mas grafik nya kok gak muncul muncul yak
mungkin ada kesalahan?
Mas caranya biar yg muncul dibatasi, misal hanya 5 provinsi atau 10 provinsi. boleh tau gak code nya bagaimna?
pakai limit aja dijadiin colelction laravel gampangnya
hallo Kawan Koding, bagaimana jika mau menampilkan kurva/chart line dari database menggunakan laravel?
langkahnya sama aja, tinggal ganti datanya dari database