Tutorial Codeigniter 1-.............
Tutorial Codeigniter 1-.............
Bagus.
Proyek web yang diperkirakan bisa jadi dalam satu bulan, dengan
framework..
Hebat kan.
Karena itu, kamu harus menggunakan framework agar bisa membuat web
lebih cepat dan juga hemat biaya dan tenaga.
Baiklah…
Jadi:
Saya yakin, kamu yang sedang membaca artikel ini sudah pernah membuat
web dengan PHP.
Tapi..
Kode website kita akan semakin ribet dan berantakan. Bisa jadi disbeabkan
karena kita asal-asalan menambahkan kode.
Belum lagi, kita dituntut menulis kode yang rapi agar bisa dipahami orang
lain (misalnya teman satu tim).
Maka di sini kita tidak boleh seenaknya menulis kode yang asal-asalan.
Kerangka kerja dibuat agar kita bisa bekerja lebih mudah. Biasanya,
framework menyediakan bahan-bahan yang siap pakai, sehingga kita tidak
harus membuatnya dari nol.
Contohnya seperti:
Harus menaruh kode yang memiliki fungsi yang sama dalam satu folder;
Harus mengikuti aturan penulisan kode (writing conventions) yang
disepakati;
Harus menggunakan pola desain ini, dan itu;
dan lain sebagainya.
Lalu..
Nanti kita akan bahas lebih dalam tentang MVC pada: Konsep dasar
Framework Codeigniter.
Website Codeigniter
Keunggulan Codeigniter
Ada beberapa kelebihan CodeIgniter (CI) dibandingkan dengan Framework
PHP lain,
jakartaglobe.id
jawapos.com
itb.ac.id
ipb.ac.id
indihome.co.id
cs.kaskus.co.id
sipma.ui.ac.id
epaper.republika.co.id
ibt.ristekdikti.go.id
project.co.id
pu.go.id
mechanical-rally.petra.ac.id
fo3.garena.co.id
ird.widyatama.ac.id
bkddki.jakarta.go.id
idws.id
Lalu..
Proyek Codeigniter 4 pun dimulai dengan Jim Parry sebagai project lead.
Tanggal ini diambil, sebagai penghormatan terakhir kepada Jim Parry yang
telah meninggal dunia pada tanggal 15 Januari 2020. 3
Akun Github Jim Parry
Jadi, masih akan ada update terbaru di versi 3 hingga waktu yang belum
ditentukan.
Nah, itulah beberapa perbandingan dari segi teknis. Semoga kamu bisa
menentukan versi Codeigniter yang akan dipelajari.
Selamat belajar.
1. Teks Editor
2. Web Browser
3. Web Server: PHP, MySQL, Phpmyadmin
4. File Project Codeigniter
Mari kita siapkan satu-per-satu.
1. Teks Editor
Teks editor akan kita gunakan untuk menulis kode. Kamu bebas
menggunakan teks editor apa saja untuk coding CI.
2. Web Browser
Web browser akan kita gunakan untuk melihat hasil dari aplikasi. Kamu
juga bebas menggunakan web browser apapun, asalkan masih mendukung
teknologi web modern zaman sekarang.
3. Web Server
Codeigniter merupakan framework PHP, karena itu ia pasti membutuhkan
web server. Berikut ini requirement server untuk Codeigniter 3:
Jika kamu sudah menginstal XAMPP, maka ketiga aplikasi server ini sudah
terpenuhi. Tapi jika kamu pengguna Linux, maka ini bisa diinstal satu-per-
satu.
Silahkan baca:
Silahkan ikuti:
1. Download Codeigniter;
2. Ekstrak File ZIP Codeigniter ke htdocs.
Karena kita akan membuat proyek semacam web portal sederhana yang
berisi berita tentang dunia coding. Tujuannya, agar kita paham konsep
dasar dari Codeigniter.
Ini sebenarnya opsional, kamu boleh membuatnya dan boleh tidak. Namun
agar memudahkan dalam proses development, sebaiknya dibuatkan virtual
host untuk tiap proyek.
Virtual host adalah alamat virtual yang akan digunakan untuk mengakses
website di localhost.
Pada contoh di atas, kita membuka aplikasi melalui
alamat http://localhost/beritacoding dengan virtual host kita bisa
membukanya dari beritacoding.test .
Bisa, terserah kita mau pakai domain apapun. Soalnya ini kan di localhost.
Tapi agar tidak membingungkan, baiknya pakai domain .test atau .local.
Perintah ini akan melakukan copy dari konfigurasi default host apache.
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName beritacoding.test
ServerAlias www.beritacoding.test
DocumentRoot /var/www/html/beritacoding
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
127.0.0.1 beritacoding.test
Ini akan menjadi alamat domain yang akan kita pakai. Kamu juga bisa
menggantinya dengan yang lain.
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName beritacoding.test
ServerAlias www.beritacoding.test
DocumentRoot "c:\xampp\htdocs\beritacoding"
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory "c:\xampp\htdocs\beritacoding"></Directory>
</VirtualHost>
C:\Windows\System32\drivers\etc\hosts
127.0.0.1 beritacoding.test
Pada tahapan ini, kita sudah berhasil membuat proyek baru Codeigniter.
Jadi intinya, kita hanya perlu mengekstrak file ZIP dari Codeigniter ke
folder server htdocs atau /var/www/html. Setelah itu, mengubah namanya
dengan nama proyek.
Bagus..
Jika kamu baru pertama kali belajar Codeigniter, maka wajib hukumnya
mengetahui apa saja isi direktori dan file yang ada di dalam project
codeigniter.
Silahkan buka teks Editor VS Code, lalu pilih File->Open Folder. Cari
folder beritacoding.
Selain itu terdapat juga direktori 📁 user_guide dan beberapa file lainnya.
Berikut ini penjelasannya:
📁 application berisi semua kode aplikasi. Di dalam direktori inilah kita akan
menulis semua kode aplikasi kita.
📁 system berisi kode-kode inti dari Codeigniter. Jangan mengubah apapun
di dalam direktori ini. Jika kita ingin upgrade versi, kita cukup me-replace
direktori ini dengan yang baru.
📁 tests berisi kode untuk melakukan testing. Folder ini memang belum ada
di project kita saat ini, tapi kita bisa buat nanti saat melakukan testing.
📁 user_guide berisi dokumentasi codeigniter. Kita bisa menghapus direktori
ini saat web sudah jadi.
📄 .editor_config berisi konfigurasi untuk teks editor.
📄 .gitignore berisi daftar file dan folder yang akan diabaikan oleh Git.
📄 comspoer.json adalah file yang berisi keterangan project dan keterangan
library yang digunakan. File ini dibutuhkan oleh composer.
📖 contributing.md adalah file yang berisi penjelasan cara berkontribusi di
proyek CI. Kita bisa menghapus file ini, apabila web sudah jadi.
📖 license.txt adalah file yang berisi keterangan lisensi dari CI. Kita juga
bisa menghapus file saat web sudah jadi.
📖 readme.rst sama seperti file 📄 contributing.md file ini berisi penjelasan dan
informasi tentang project CI. Kita juga bisa menghapus file ini saat web
sudah selesai.
📄 index.php adalah file utama dari CI. File yang akan dibuka pertamakali
saat aplikasi dibuka.
Yap, biar kode program lebih konsisten dan tersetruktur. Sehingga kita
akan mudah kolaborasi dengan tim.
Nah, si MVC ini adalah pola penulisan kode yang umum dipakai.. dimana
kode untuk Model di taruh dalam folder yang sama, begitu juga dengan
kode untuk View dan Controller.
Model bisa mengakses data dari Database dan juga sumber lainnya.
Intinya:
Ingat:
Fokusnya untuk membuat tampilan aplikasi, bukan yang lain. Kita tidak
boleh query data dari view, meskipun itu bisa dilakukan.
Kadang juga kita akan membuat sedikit logika di dalam view, seperti logika
untuk menampilkan dan menghilangkan elemen tertentu.
Apa yang kita lihat di aplikasi, itu adalah kode dari View.
Bagaimana bentuk MVC di Codeigniter?
Secara gambaran besar, kita akan berpikir.. kalau di Codeigniter itu cuma
ada tiga kelompok kode yakni Model, View, dan Controller.
1. Mulai;
2. User mengirim request ke web;
3. File yang pertama kali dieksekusi adalah index.php;
4. Lalu dari index.php, request akan diteruskan oleh routers.php;
5. routers.phpakan mencari cache di server, apabila
tedapat cache maka cache itu yang akan dikirim sebagai
balasan (response). Apabila tidak ada cache barulah request diteruskan
ke Controller;
6. Sebelum diteruskan ke Controller di sini ada lapisan Security untuk
keamanan;
7. Controller akan bertanggunag jawab untuk mengambil data
dari Model dan me-rendernya ke dalam View dengan
menggunakan library, plugin, dan helper yang ada.
8. Hasil render (view) dikirim ke pengguna dan disimpan dalam cache,
apabila fitur cache aktif;
9. Selesai.
Memahami Router pada Codeigniter
💬 P.S:
📄 views/about.php
<h1>About Us</h1>
<p>Ini adalah halaman about</p>
📄 views/contact.php
<h1>Contact Us</h1>
<p>Ini adalah halaman Contact</p>
Route sudah kita tambahkan.
http://localhost/beritacoding/index.php/welcome/about/
dan http://localhost/beritacoding/index.php/welcome/contact/
Atau bisa juga buka dari domain beritacoding.test yang sudah kita buat:
http://beritacoding.test/index.php/about
http://beritacoding.test/index.php/welcome/contact/
Hasilnya:
Apabila kita
membuka http://beritacoding.test/index.php/contact, maka akan
terjadi error 404 not found.
Ini karena route yang baru saja kita buat, belum didaftarkan ke
dalam routers.php.
$route['about'] = 'welcome/about';
$route['contact'] = 'welcome/contact';
Tambahkan di bawah kode route yang sudah ada.
Hasilnya:
Jawabannya:
Tidak harus, karena CI juga mampu mendeteksi otomatis route
berdasarkan nama controller dan method yang dibuat. 3
Ini formatnya:
http://example.com/[controller-class]/[controller-method]/[arguments]
<?php
Perhatikan!
Di Controller Page, kita melakukan load view home dan view ini belum kita
buat. Kita bisa memanfaatkan view welcome_message.php untuk menjadi
view home.
Terakhir..
$route['default_controller'] = 'page';
$route['404_override'] = '';
$route['translate_uri_dashes'] = FALSE;
$route['contact'] = 'page/contact';
$route['about'] = 'page/about';
Nah, sekarang kita sudah punya Controller Page yang berfungsi untuk
menampilkan beberapa halaman seperti Home, About, dan Contact.
Apa Selanjutnya?
Kita sudah belajar tentang MVC dan Route. Ini memang masih dasar.
Selanjutnya nanti kita akan banyak menggunakannya.
Berikutnya kita akan belajar tentang Controller lebih dalam lagi, seperti
bagaimana cara mengolah input dari form dan aturan penulisan Controller.
Selamat belajar.
Seperti:
example.com/index.php/blog/
Tapi ada juga yang memberi tugas Controller untuk menentukan logika
bisnis.
Saya tidak bilang ini salah, tapi di bagian memproses HTTP request.. kita
memang harus meproses sesuai dengan logika bisnis yang ditentukan.
✅ Contoh benar:
Blog.php
Product.php
❌ Contoh salah:
blog.php
product.php
Jika nama terdiri dari dua suku kata atau lebih, boleh dipisah
dengan underscore.
Contoh:
Pendaftaran_siswa.php
❌ Contoh salah:
<?php
class blog extends CI_Controller {
<?php
class Blog extends CI_Controller {
Jika nama terdiri dari dua suku kata atau lebih, bisa dipisah
dengan underscore.
Contoh:
<?php
class Account_info extends CI_Controller {
example.com/index.php/account_info/
Contoh:
<?php
class Blog extends CI_Controller {
public function index()
{
echo 'Hello World!';
}
Contoh:
📂 admin/
📜 Dashboard.php
📜 Product.php
📜 Report.php
📜 Setting.php
📂 member/
📜 Overview.php
📜 Transaction.php
📜 Profile.php
$routes['admin'] = 'admin/dashboard';
$routes['admin/product'] = 'admin/product';
Pada controller, kita bisa mengambil input dari properti $this->input dan
untuk menghasilkan output kita bisa gunakan echo, load->view, dan
properti $this->output.
Bedanya:
Mengambil input dari $this->input lebih aman, karena sudah di-filter dan
diproteksi XSS serta CSRF.
Membuat Output
Output akan menjadi HTTP Response dari request yang diterima oleh
Controller.
Kita bisa membuat output dengan fungsi echo(), print(), dan fungsi output
lainnya.
$this->load->view('nama_view');
Misalnya:
Maka kita tinggal set header untuk HTTP response dan mengirim file PDF-
nya pada body HTTP response.
Contoh kodenya:
$this->output->set_content_type('pdf')
->set_output('dokument.pdf');
$data = [
'nama' => 'petanikode',
'email' => '[email protected]'
];
$this->output->set_content_type('json')
->set_output($data);
Jika kita membuat method pada controller dengan modifier private, maka
method tersebut tidak akan bisa diakses dair publik atau URL.
Contoh:
<?php
class Blog extends CI_Controller {
public function index()
{
echo 'Hello World!';
}
example.com/index.php/blog/_utility
Method private biasanya dipakai untuk fungsi tambahan seperti utility dan
hanya bisa dipanggil pada class itu sendiri.
Method index() adalah method yang akan dijalankan secara default saat kita
mengakses nama controller.
Contoh:
<?php
class Blog extends CI_Controller {
public function index()
{
echo 'Hello World!';
}
example.com/index.php/blog/
Contoh:
<?php
class Blog extends CI_Controller {
public function __construct()
{
parent::__construct();
$this->load->model('post');
}
Selain di akses melalui URL, Controller bisa juga kita jalankan melalui CLI
(Command Line Interface).
Hah?
Contoh:
<?php
class Notification extends CI_Controller
{
public function send_remainder($message){
print("Remainder: $message");
}
}
Kita akan membuat Controller Article untuk menampilkan list artikel dan
detail artikel.
<?php
Buatlah folder baru di dalam views dengan nama articles dengan kode
masing-masing sebagai berikut:
📜 views/articles/list_article.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Llist of Article</title>
</head>
<body>
<h1>List Artikel</h1>
<ul>
<?php foreach($articles as $article): ?>
<li><?= $article['title'] ?></li>
<?php endforeach ?>
</ul>
</body>
</html>
📜 views/articles/empty_article.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Llist of Article</title>
</head>
<body>
</body>
</html>
📜 views/articles/show_article.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Read Article</title>
</head>
<body>
</body>
</html>
localhost/beritacoding/index.php/article/
Hasilnya:
localhost/beritacoding/index.php/article/show
Hasilnya:
Latihan: Memproses Form di Controller
Setelah kita belajar banyak tentang input dan output di Controller, saatnya
kita mencoba sendiri.
<?php
Pada Controller ini, kita akan coba mengambil input dari method contact().
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Hubungi kami</title>
</head>
<body>
<h1>Contact Us</h1>
<p>Hubungi kami melalui form berikut</p>
<form action="" method="post">
<div>
<label for="name">Name</label>
<input type="text" name="name" placeholder="your name"
required/>
</div>
<div>
<label for="email">Email</label>
<input type="email" name="email" placeholder="your email
address" required/>
</div>
<div>
<label for="messaage">Message</label><br>
<textarea name="message" cols="30" rows="5"
placeholder="write your message" required></textarea>
</div>
<div>
<input type="submit" value="Kirim">
<input type="reset" value="Reset">
</div>
</form>
</body>
</html>
Perhatikan!
Pada form ini kita menggunakan atribut action="" yang artinya kita akan
mengirim post ke method yang me-load view tersebut, dalam kasus
ini contact().
Apabila ingin mengirim data ke controller yang lain, kita bisa tentukan
alamant controllernya pada atribut action="".
Contohnya:
Kita juga bisa memanfaatkan URL helper, yang akan kita pelajari nati di
bagian View.
Oke lanjut..
$this->load->view('contact');
}
Sedangkan jika dibuka dengan metode GET, maka tampilkan saja form dari
view contact.
Maka hasilnya:
Sekarang coba isi formnya dan kirim!
Maka hasilnya:
Yap, hasilnya ditampilkan karena kita menggunakan fungsi print_r().
Buat kamu yang belum tau apa itu array assosiatif, silahkan baca:
Apa Selanjutnya?
Siap?
View adalah kode yang bertugas untuk membuat tampilan aplikasi. View
berisi kode campuran dari PHP, HTML, JS, dan CSS.
Ingat:
Fokusnya untuk membuat tampilan aplikasi, bukan yang lain. Kita tidak
boleh query data dari view, meskipun itu bisa dilakukan.
Kadang juga kita akan membuat sedikit logika di dalam view, seperti logika
untuk menampilkan dan menghilangkan elemen tertentu.
Apa yang kita lihat di aplikasi, itu adalah kode dari View.
Aturan Penulisan View
📜 welcome_message.php
📜 about.php
📜 overview.php
📜 WelcomeMessage.php
📜 ABOUT.php
📜 over View.php
Contoh:
Sangat tidak dianjurkan melakukan query data di sini, meskipun itu bisa
dilakukan..
<?php
$this->db->query('SELECT * from user');
?>
Kalau tidak boleh query data, lalu datanya didapat dari mana?
View bisa kita load dari controller dan juga view dengan fungsi $this->load-
>view() .
Contoh:
$this->load->view('home_page.php');
Kita juga bisa me-loadnya, tanpa harus menggunakan ekstensi .php seperti
ini:
$this->load->view('home_page');
Contoh:
Kita bisa menampilkan isi datanya di dalam view dengan kode seperti ini:
Paham?
Bagus..
Sekarang mari kita pelajari lebih lanjut tentang cara menampilkan data.
Kedua kode ini sebenarnya sama, hanya saja menggunakan <?= akan lebih
pendek dibandingkan harus menulis <?php echo.
2. Percabangan di View
Seperti yang saya bilang tadi, di View kita juga bisa membuat ligika untuk
menampikan data.
Contohnya:
Pada controller kita load view dan mengirimkan data seperti ini:
$data['user'] ='petanikode';
$this->load->view('dashboard', $data);
Lalu pada view, kita bisa buat logika if/else seperti ini:
<?php
if ($user === 'petanikode'){
echo "Welcome admin";
} else {
echo "Hello guest";
}
?>
Kadang kita juga akan menampilkan banyak kode HTML di dalam blok
if/else.
Ini boleh-boleh saja dilakukan, namun agak sulit terbaca karena harus
mengingat tutup kurung }. Kadang-kadang ini membuat kita kesulitan.
3. Perulangan di View
Sama seperti percabangan, kita juga bisa melakukan perulangan pada
View. Perulangan biasanya digunakan untuk menampilkan banyak data
dari array.
Contoh:
<?php
?>
<?php
$i = 0;
while ($i < count($names))
{
echo $names[$i];
$i++;
}
?>
<?php
Contoh:
<ul>
<?php foreach ($names as $name): ?>
<li><?= $name ?><li>
<?php endforeach ?>
</ul>
Selain foreach, kita juga bisa menggunakan for dan while tanpa kurung {}.
Contoh:
<ul>
<?php for ($i = 0, $i < count($names); $i++): ?>
<li><?= $name ?><li>
<?php endfor ?>
</ul>
<ul>
<?php $i = 0; ?>
<?php while ($i < count($names)): ?>
<li><?= $name ?><li>
<?php endwhile ?>
</ul>
Mari kita lanjutkan project beritacoding, kali ini kita akan membaat template
view agar lebih rapi.
Pada kode beritacoding, kita sudah membuat tiga view seperti ini:
📜 views/articles/list_article.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Llist of Article</title>
</head>
<body>
<h1>List Artikel</h1>
<ul>
<?php foreach($articles as $article): ?>
<li><?= $article['title'] ?></li>
<?php endforeach ?>
</ul>
</body>
</html>
📜 views/articles/empty_article.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Llist of Article</title>
</head>
<body>
</body>
</html>
📜 views/articles/show_article.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Read Article</title>
</head>
<body>
</body>
</html>
Sejauh ini tidak ada masalah, tapi akan lebih baik jika membuatkan
template supaya tidak mengulang kode yang sama terus-menerus.
Buatlah tiga file di dalam folder _partials dengan nama head.php, navbar.php,
dan footer.php.
📜 _partials/head.php
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><?= isset($meta['title']) ? $meta['title'] : 'Beritacoding.com' ?></title>
Pada partial ini, kita menggunakan data dari variabel $meta yang nanti akan
kita kirim melalui Controller. Pada contoh di atas, kita menggunakan data
meta untuk judul.
📜 _partials/navbar.php
<nav class="navbar">
<a href="<?= site_url() ?>">Home</a>
<a href="<?= site_url('article') ?>">Article</a>
<a href="<?= site_url('page/about') ?>">About</a>
<a href="<?= site_url('page/contact') ?>">Contact</a>
<a href="<?= site_url('auth/login') ?>" style="margin-
left:auto">Login</a>
</nav>
📜 _partials/footer.php
<footer class="footer">
© <?= Date('Y') ?> Beritacoding.com
</footer>
2. Menggunakan Helper URL
Perhatikan pada kode _partials/navbar.php , kita menggunakan
fungsi site_url() di sana.
Fungsi ini berasal dari Helper url, jika kamu tidak melakukan autolaod
helper url, maka fungsi tersebut tidak akan bisa digunakan.
Caranya:
$autoload['helper'] = array('url');
Ini artinya, kita akan melakukan load otomatis untuk helper url sehingga
kita bisa menggunakan fungsi site_url(), base_url(), dan fungsi-fungsi URL
lainnya.
Tapi fungsi ini tidak akan bekerja dengan baik, kalau base_url belum
diataur.
$config['base_url'] = 'http://localhost/beritacoding/';
Atau bisa juga dengan alamat domain virtual yang sudah kita buat:
$config['base_url'] = 'http://beritacoding.test';
home.php ;
about.php ;
contact.php ;
articles/list_article.php ;
articles/show_article.php ;
articles/empty_article.php ;
📜 home.php
<!DOCTYPE html>
<html lang="en">
<head>
<?php $this->load->view('_partials/head.php'); ?>
</head>
<body>
<?php $this->load->view('_partials/navbar.php'); ?>
<h1>Home Page</h1>
</html>
📜 about.php
<!DOCTYPE html>
<html lang="en">
<head>
<?php $this->load->view('_partials/head.php'); ?>
</head>
<body>
<?php $this->load->view('_partials/navbar.php'); ?>
<h1>About Page</h1>
</html>
📜 contact.php
<!DOCTYPE html>
<html lang="en">
<head>
<?php $this->load->view('_partials/head.php'); ?>
</head>
<body>
<?php $this->load->view('_partials/navbar.php'); ?>
<h1>Contact Us</h1>
<p>Hubungi kami melalui form berikut</p>
<form action="" method="post">
<div>
<label for="name">Name</label>
<input type="text" name="name" placeholder="your name"
required />
</div>
<div>
<label for="email">Email</label>
<input type="email" name="email" placeholder="your email
address" required />
</div>
<div>
<label for="messaage">Message</label><br>
<textarea name="message" cols="30" rows="5"
placeholder="write your message" required></textarea>
</div>
<div>
<input type="submit" value="Kirim">
<input type="reset" value="Reset">
</div>
</form>
</html>
📜 articles/list_article.php
<!DOCTYPE html>
<html lang="en">
<head>
<?php $this->load->view('_partials/head.php'); ?>
</head>
<body>
<?php $this->load->view('_partials/navbar.php'); ?>
<h1>List Artikel</h1>
<ul>
<?php foreach ($articles as $article) : ?>
<li><?= $article['title'] ?></li>
<?php endforeach ?>
</ul>
📜 articles/show_article.php
<!DOCTYPE html>
<html lang="en">
<head>
<?php $this->load->view('_partials/head.php'); ?>
</head>
<body>
<?php $this->load->view('_partials/navbar.php'); ?>
</html>
📜 articles/empty_article.php
<!DOCTYPE html>
<html lang="en">
<head>
<?php $this->load->view('_partials/head.php'); ?>
</head>
<body>
<?php $this->load->view('_partials/navbar.php'); ?>
</html>
$data['meta'] = [
'title' => 'About BeritaCoding',
];
Sekarang ubahlah kode controller Page menjadi seperti ini:
<?php
defined('BASEPATH') or exit('No direct script access allowed');
$this->load->view('home', $data);
}
$this->load->view('about', $data);
}
$this->load->view('contact', $data);
}
}
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><?= isset($meta['title']) ? $meta['title'] : 'Beritacoding.com' ?></title>
<style>
.navbar {
display: flex;
gap: 1em;
background-color: teal;
}
.navbar a {
font-family: sans-serif;
font-weight: 500;
color: white;
text-decoration: none;
padding: 1rem;
}
.navbar a:hover {
background-color: rgba(255, 255, 255, 0.1);
}
.footer {
font-family: sans-serif;
background-color: whitesmoke;
padding: 1em;
text-align: center;
border-top: 1px solid lightgray;
}
</style>
Setelah itu, buatlah file baru di dalam css dengan nama main.css.
Kemudian pindahkan css pada _partials/head.php ke dalam main.css.
.navbar {
display: flex;
gap: 1em;
background-color: teal;
}
.navbar a {
font-family: sans-serif;
font-weight: 500;
color: white;
text-decoration: none;
padding: 1rem;
}
.navbar a:hover {
background-color: rgba(255, 255, 255, 0.1);
}
.footer {
font-family: sans-serif;
background-color: whitesmoke;
padding: 1em;
text-align: center;
border-top: 1px solid lightgray;
}
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><?= isset($meta['title']) ? $meta['title'] : 'Beritacoding.com' ?></title>
Jika CSS-nya tidak berhasil, coba lihat link CSS-nya dari View Source.
Apa Selanjutnya?
Model adalah kode yang bertugas untuk membuat pemodelan data. Kadang
juga dipakai untuk pemodelan logika bisnis.
Model bisa mengakses data dari Database dan juga sumber lainnya. Seperti
API pihak ketiga.
ntinya:
Model dapat kita buat di dalam folder models, aturan penulisan model
hampir sama dengan controller.
📜 Arcticle_model.php
📜 Product_model.php
📜 Account_model.php
Penamaan file model dengan akhiran _model boleh dilakukan boleh juga
tidak, tujuan memberikan akhiran _model adalah untuk menghindari
bentrok dengan nama Controller.
Nama class mengukuti nama file, yakni diawali dengan huruf besar dan
boleh dipisah dengan underscore.
Contoh:
<?php
Contoh:
<?php
}
public function get_expired_product()
{
}
}
4. Apa yang ditulis di dalam Model?
Di dalam model, kita harus menulis query untuk mengambil data di
database dan mengembalikan hasil query berupa data. Nilai kembalian
boleh berupa array maupun objek.
Contoh:
<?php
Selain itu, ada juga yang menulis logika bisnis di dalam model.
Contohnya:
<?php
Pada contoh ini model menerima input dari argumen yang diberikan
melalui method seperti $deposit_count, $wd_count, dan $id.
Query Builder adalah class yang berisi method untuk membuat query
database.
Contoh:
Selain method-method ini, masih banyak lagi method lain yang disediakan
Query Builder untuk membuat query database.
Misalnya seperti:
Karena nanti akan mengakibatkan model jadi berantakan dan sulit ditest
dengan unit test.
1. Membuat Database
Silahkan buat dulu database di PHPmyadmin. Buatlah database dengan
nama beritacoding.
Setelah itu buatlah tabel dengan name article dengan struktur sebagai
berikut:
Atau biar cepat gunakan perintah SQL berikut:
2. Konfigurasi Database
Pertama, silahkan lakukan autoload library database.
Caranya:
$autoload['libraries'] = array('database');
Untuk usernem kita isi pakai root, karena default username database di
XAMPP adalah root dan passwordnya kosong.
Tapi jika kamu sudah pernah mengubah username dan password, silahkan
diisi dengan usernmae dan password tersebut.
Terakhir, kita mengisi database yang merupakan nama database yang akan
digunakan.
Yang artinya username root tidak bisa dipakai pada server yang digunakan.
Cobalah untuk mengubahnya dengan user yang valid.
<?php
Untuk saat ini, Article_model cuma kita gunakan untuk mengambil data
dengan dua method:
<?php
if (count($data['articles']) > 0) {
// kirim data artikel ke view
$this->load->view('articles/list_article.php', $data);
} else {
// kalau gak ada artikel, tampilkan view ini
$this->load->view('articles/empty_article.php');
}
}
// tampilkan artikel
$this->load->view('articles/show_article.php', $data);
}
}
📜 view/articles/list_article.php
<!DOCTYPE html>
<html lang="en">
<head>
<?php $this->load->view('_partials/head.php'); ?>
</head>
<body>
<h1>List Artikel</h1>
<ul>
<?php foreach ($articles as $article) : ?>
<li>
<a href="<?= site_url('article/'.$article->slug)
?>">
<?= $article->title ?
html_escape($article->title) : "No Title" ?>
</a>
</li>
<?php endforeach ?>
</ul>
</html>
📜 views/articles/show_article.php
<!DOCTYPE html>
<html lang="en">
<head>
<?php $this->load->view('_partials/head.php'); ?>
</head>
<body>
<article class="article">
<h1 class="post-title"><?= $article->title ?
html_escape($article->title) : "No Title" ?></h1>
<div class="post-meta">
Published at <?= $article->created_at ?>
</div>
<div class="post-body">
<?= $article->content ?>
</div>
</article>
</html>
index.php/article/show/contoh-slug-artikel
Nah, biar lebih enak dilihat.. kita tidak akan menggunakan /show/.
$route['article/(:any)'] = 'article/show/$1';
Dengan route ini, artikel akan bisa kita buka melalui URL:
index.php/arcicle/contoh-slug-artikel
7. Percobaan
Cobalah buka halaman beritacoding/index.php/article . Jika kita belum
menambahkan artikel di tabel article maka akan tampil seperti ini:
Sekarang coba tambahkan data di tabel article melalui Phpmyadmin.
Silahkan isi data artikel yang akan ditambahkan dan jangan lupa berikan
nilai false untuk kolom draft.
Atau kalau mau cepat, bisa jalankan kode SQL berikut:
Tampilan list artikel dan show artikelnya memang masih belum rapi karena
kita belum berikan CSS untuk elemen ini.
.article {
max-width: 740px;
margin: 4em auto;
padding: 0 2em;
}
.article .post-title {
font-weight: bolder;
font-family: sans;
}
.article .post-meta {
margin: 1em 0;
font-size: 0.8rem;
font-family: sans;
color: grey;
}
.article .post-body {
line-height: 1.6rem;
}
Maka hasilnya:
Terlihat lebih bagus 👍
Silahkan tambahkan juga CSS sesukamu untuk tampilan yang lain. Karena
pada tutorial ini, kita tidak fokus pada CSS, melainkan pada konsep
Codeigntier.
Oke lanjut..
Gampang!
<?php
Pada model ini kita menggunakan query insert() untuk menambahkan data
ke dalam tabel feedback.
Berikutnya silahkan lanjutkan ke:
$feedback = [
'id' => uniqid('', true), // genearate id unik
'name' => $this->input->post('name'),
'email' => $this->input->post('email'),
'message' => $this->input->post('message')
];
$feedback_saved = $this->feedback_model->insert($feedback);
if ($feedback_saved) {
return $this->load->view('contact_thanks');
}
}
$this->load->view('contact', $data);
}
Coba perhatikan, di sana kita melakukan load view contact_thanks, view ini
belum kita buat.
<!DOCTYPE html>
<html lang="en">
<head>
<?php $this->load->view('_partials/head.php'); ?>
</head>
<body>
<?php $this->load->view('_partials/navbar.php'); ?>
<div class="container">
<h1>Thank You!</h1>
<p>Your message has been sent!</p>
</div>
</html>
View ini cuma bertugas untuk menampilkan pesan feedback saat berhasil
mengirim data dari form contact.
4. Percobaan
Bukalah halaman beritacoding/index.php/page/contact/ .
Apa Selanjutnya?
Kita sudah belajar tentang model dan berhasil melakukan view dan insert
data dengan Model.
Namun, yang belum kita coba adalah update dan delete data. Ini akan kita
pelajari di tutorial berikutnya.
Yakni:
Saya tidak akan banyak berteori di tutorial ini, karena penjelasan tentang
dasar-dasar Codeigniter sudah dijelaskan di tutorial-tutorial sebelumnya.
Seperti:
📜 controllers/admin/Dashboard.php
<?php
📜 controllers/admin/Feedback.php
<?php
📜 controllers/admin/Post.php
<?php
<?php
Untuk saat ini, semua controller Admin yang kita buat hanya bertugas
untuk menampilkan view admin.
$route['admin'] = 'admin/dashboard';
Kita ingin memisah template untuk halaman admin dan halaman depan,
karena bentuk layoutnya berbeda.
Berikut ini bentuk rancangan atau desain dari halaman admin yang akan
kita buat:
Buatlah file baru di dalam 📁 admin/_partials dengan nama dan isi sebagai
berikut:
📜 head.php
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Admin - Beritacoding</title>
Pada kode partial ini, kita menggunakan admin.css sebagai CSS untuk
halaman admin. File ini akan kita buat nanti.
📜 footer.php
<footer class="footer">
© <?= Date('Y') ?> Beritacoding.com Version 1.0.0
</footer>
📜 side_nav.php
<aside class="side-nav">
<div class="brand">
<h2>Berita Coding</h2>
</div>
<nav>
<a href="<?= site_url('admin/dashboard') ?>">Overview</a>
<a href="<?= site_url('admin/post') ?>">Post</a>
<a href="<?= site_url('admin/feedback') ?>">Feedback</a>
<a href="<?= site_url('admin/setting') ?>">Setting</a>
<a href="<?= site_url('auth/logout') ?>">Logout</a>
</nav>
</aside>
.main {
display: flex;
}
.side-nav {
background: teal;
width: 25vw;
max-width: 200px;
height: 100vh;
}
.side-nav .brand {
padding: 0 1rem;
color: white;
}
.side-nav nav {
display: flex;
flex-direction: column;
}
.side-nav nav a {
font-family: sans;
text-decoration: none;
color: white;
padding: 0.8rem;
}
.content {
padding: 1rem;
padding-right: 2rem;
width: 100%;
position: static;
}
.toolbar {
display: flex;
margin: 1rem 0;
}
.table {
width: 100%;
border-collapse: collapse;
}
.table,
th,
td {
border: 1px solid grey;
border-left: none;
border-right: none;
padding: 0.5rem;
text-align: left;
}
.action {
display: flex;
justify-content: center;
gap: 0.8rem;
}
.footer {
position: absolute;
bottom: 1rem;
text-align: center;
font-family: sans-serif;
font-size: 0.7rem;
}
/* Form */
form {
box-sizing: border-box;
padding: 0rem;
}
label {
display: inline-block;
margin-bottom: 0.5rem;
}
input, textarea {
display: inline-block;
padding: 0.5rem;
margin-bottom: 1rem;
width: 100%;
}
input:focus, textarea:focus {
outline-color: dodgerblue;
}
/* Card */
.card {
border: 1px solid lightgray;
padding: 1rem;
margin: 1rem 0;
}
.card-header {
display: flex;
justify-content: space-between;
font-family: sans-serif;
}
/* Button */
.button {
background-color: #e7e7e7;
border: 2px solid transparent;
border-radius: 8px;
color: black;
padding: 8px 32px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 1rem;
font-family: sans-serif;
}
.button:hover {
opacity: 0.8;
}
.button:active {
border: 2px solid rgba(0, 0, 0, 0.5);
}
.button-success {
background-color: #4caf50;
color: white;
}
.button-primary {
background-color: #008cba;
color: white;
}
.button-danger {
background-color: #f44336;
color: white;
}
.button-small {
font-size: 0.7rem;
}
/* Text */
.text-green {
color: #4caf50;
}
.text-gray {
color: grey;
}
.text-center {
text-align: center;
}
View yang harus kita buat sebenarnya sudah ditentukan di Controller. Kita
bisa lihat, view apa saja yang dibutuhkan di sana.
dashboard.php
feedback_list.php
post_list.php
setting.php
Buatlah file baru di dalam folder views/admin/ dengan nama dan isi sebagai
berikut:
📜 dashboard.php
<!DOCTYPE html>
<html lang="en">
<head>
<?php $this->load->view('admin/_partials/head.php') ?>
</head>
<body>
<main class="main">
<?php $this->load->view('admin/_partials/side_nav.php') ?>
<div class="content">
<h1>Overview</h1>
<p><b>13</b> <span class="text-gray">Post</span></p>
<p><b>11</b> <span class="text-gray">Feedback</span></p>
</html>
📜 feedback_list.php
<!DOCTYPE html>
<html lang="en">
<head>
<?php $this->load->view('admin/_partials/head.php') ?>
</head>
<body>
<main class="main">
<?php $this->load->view('admin/_partials/side_nav.php') ?>
<div class="content">
<h1>Feedback</h1>
<div class="card">
<div class="card-header">
<div>
<b>Dian</b> <small class="text-
gray">[email protected]</small>
</div>
<div><small class="text-gray">19 Juli
2021</small></div>
</div>
<p>Lorem, ipsum dolor sit amet consectetur
adipisicing elit. Nemo atque
delectus nihil voluptatibus odit
temporibus tempora amet quasi omnis.
</p>
<a href="#" class="button button-danger button-
small" role="button">Delete</a>
</div>
<div class="card">
<div class="card-header">
<div>
<b>Dian</b> <small class="text-
gray">[email protected]</small>
</div>
<div><small class="text-gray">19 Juli
2021</small></div>
</div>
<p>Lorem, ipsum dolor sit amet consectetur
adipisicing elit. Nemo atque
delectus nihil voluptatibus odit
temporibus tempora amet quasi omnis.
</p>
<a href="#" class="button button-danger button-
small" role="button">Delete</a>
</div>
</html>
📜 post_list.php
<!DOCTYPE html>
<html lang="en">
<head>
<?php $this->load->view('admin/_partials/head.php') ?>
</head>
<body>
<main class="main">
<?php $this->load->view('admin/_partials/side_nav.php') ?>
<div class="content">
<h1>List Artikel</h1>
<div class="toolbar">
<a href="#" class="button button-primary"
role="button">+ Tulis Artikel</a>
</div>
<table class="table">
<thead>
<tr>
<th>Title</th>
<th style="width: 15%;"
class="text-center">Status</th>
<th style="width: 25%;"
class="text-center">Action</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<div>Hello World!</div>
<div class="text-
gray"><small>12 Jan 2021<small></div>
</td>
<td class="text-center text-
gray">Draft</td>
<td>
<div class="action">
<a href="#"
class="button button-small" role="button">View</a>
<a href="#"
class="button button-small" role="button">Edit</a>
<a href="#"
class="button button-small button-danger" role="button">Delete</a>
</div>
</td>
</tr>
<tr>
<td>
<div>Hello World!</div>
<div class="text-
gray"><small>12 Jan 2021<small></div>
</td>
<td class="text-center text-
green">Published</td>
<td>
<div class="action">
<a href="#"
class="button button-small" role="button">View</a>
<a href="#"
class="button button-small" role="button">Edit</a>
<a href="#"
class="button button-small button-danger" role="button">Delete</a>
</div>
</td>
</tr>
</tbody>
</table>
</html>
📜 setting.php
<!DOCTYPE html>
<html lang="en">
<head>
<?php $this->load->view('admin/_partials/head.php') ?>
</head>
<body>
<main class="main">
<?php $this->load->view('admin/_partials/side_nav.php') ?>
<div class="content">
<h1>Settings</h1>
<p>Comming Soon..</p>
</html>
Terlihat bagus 😍
Tapi..
<?php
Pada model ini kita menambahkan dua method, yakni get() dan delete().
<?php
class Feedback extends CI_Controller
{
public function index()
{
$this->load->model('feedback_model');
$data['feedbacks'] = $this->feedback_model->get();
$this->load->view('admin/feedback_list', $data);
}
$this->load->model('feedback_model');
$this->feedback_model->delete($id);
📜 views/admin/feedback_list.php
<!DOCTYPE html>
<html lang="en">
<head>
<?php $this->load->view('admin/_partials/head.php') ?>
</head>
<body>
<main class="main">
<?php $this->load->view('admin/_partials/side_nav.php') ?>
<div class="content">
<h1>Feedback</h1>
<script src="//cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script>
function deleteConfirm(event){
Swal.fire({
title: 'Delete Confirmation!',
text: 'Are you sure to delete the item?',
icon: 'warning',
showCancelButton: true,
cancelButtonText: 'No',
confirmButtonText: 'Yes Delete',
confirmButtonColor: 'red'
}).then(dialog => {
if(dialog.isConfirmed){
window.location.assign(event.dataset.deleteUrl);
}
});
}
</script>
</html>
Wuhuuu.. keren 😍
<!DOCTYPE html>
<html lang="en">
<head>
<?php $this->load->view('admin/_partials/head.php') ?>
</head>
<body>
<main class="main">
<?php $this->load->view('admin/_partials/side_nav.php') ?>
<div class="content">
<h1>Feedback is Empty</h1>
</html>
Maka hasilnya:
Yoshh!! Halaman feedback sudah beres.
Nah, sekarang saatnya kita membuatnya hidup dan berfungsi seperti yang
kita harapkan.
<?php
Berikutnya, lanjutkan:
$article = [
'id' => $id,
'title' => $this->input->post('title'),
'slug' => $slug,
'content' => $this->input->post('content'),
'draft' => $this->input->post('draft')
];
$saved = $this->article_model->insert($article);
if ($saved) {
$this->session->set_flashdata('message',
'Article was created');
return redirect('admin/post');
}
}
$this->load->view('admin/post_new_form.php');
}
if (!$data['article'] || !$id) {
show_404();
}
$this->load->view('admin/post_edit_form.php', $data);
}
$deleted = $this->article_model->delete($id);
if ($deleted) {
$this->session->set_flashdata('message', 'Article was
deleted');
redirect('admin/post');
}
}
}
📜 views/admin/post_list.php
<!DOCTYPE html>
<html lang="en">
<head>
<?php $this->load->view('admin/_partials/head.php') ?>
</head>
<body>
<main class="main">
<?php $this->load->view('admin/_partials/side_nav.php') ?>
<div class="content">
<h1>List Artikel</h1>
<div class="toolbar">
<a href="<?= site_url('admin/post/new') ?>"
class="button button-primary" role="button">+ Tulis Artikel</a>
</div>
<table class="table">
<thead>
<tr>
<th>Title</th>
<th style="width: 15%;"
class="text-center">Status</th>
<th style="width: 25%;"
class="text-center">Action</th>
</tr>
</thead>
<tbody>
<?php foreach($articles as $article): ?>
<tr>
<td>
<div><?= $article-
>title ?></div>
<div class="text-
gray"><small><?= $article->created_at ?><small></div>
</td>
<?php if($article->draft ===
'true'): ?>
<td class="text-center
text-gray">Draft</td>
<?php else: ?>
<td class="text-center
text-green">Published</td>
<?php endif ?>
<td>
<div class="action">
<a href="<?=
site_url('article/'.$article->slug) ?>" class="button button-small"
target="_blank" role="button">Preview</a>
<a href="<?=
site_url('admin/post/edit/'.$article->id) ?>" class="button button-small"
role="button">Edit</a>
<a href="#"
data-
delete-url="<?= site_url('admin/post/delete/'.$article->id) ?>"
role="button"
onclick="deleteConfirm(this)">Delete</a>
</div>
</td>
</tr>
<?php endforeach ?>
</tbody>
</table>
<script src="//cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script>
function deleteConfirm(event){
Swal.fire({
title: 'Delete Confirmation!',
text: 'Are you sure to delete the item?',
icon: 'warning',
showCancelButton: true,
cancelButtonText: 'No',
confirmButtonText: 'Yes Delete',
confirmButtonColor: 'red'
}).then(dialog => {
if(dialog.isConfirmed){
window.location.assign(event.dataset.deleteUrl);
}
});
}
</script>
Toast.fire({
icon: 'success',
title: '<?= $this->session->flashdata('message')
?>'
})
</script>
<?php endif ?>
</body>
</html>
Berikutnya kita membutuhkan view untuk form add dan form edit.
📜 views/admin/post_new_form.php
<!DOCTYPE html>
<html lang="en">
<head>
<?php $this->load->view('admin/_partials/head.php') ?>
</head>
<body>
<main class="main">
<?php $this->load->view('admin/_partials/side_nav.php') ?>
<div class="content">
<h1>Write new Article</h1>
<label for="content">Konten</label>
<textarea name="content" cols="30" rows="10"
placeholder="Tuliskan isi pikiranmu..."></textarea>
<div>
<button type="submit" name="draft"
class="button" value="true">Save to Draft</button>
<button type="submit" name="draft"
class="button button-primary" value="false">Publish</button>
</div>
</form>
</html>
📜 views/admin/post_edit_form.php
<!DOCTYPE html>
<html lang="en">
<head>
<?php $this->load->view('admin/_partials/head.php') ?>
</head>
<body>
<main class="main">
<?php $this->load->view('admin/_partials/side_nav.php') ?>
<div class="content">
<h1>Edit Article</h1>
<label for="content">Konten</label>
<textarea name="content" cols="30" rows="10"
placeholder="Tuliskan isi pikiranmu..."><?= $article->content ?></textarea>
<div>
<button type="submit" name="draft"
class="button" value="true">Save to Draft</button>
<button type="submit" name="draft"
class="button button-primary" value="false">Publish Update</button>
</div>
</form>
</html>
4. Percobaan
Percobaan membuka halaman admin list artikel:
Biar konsisten, kita ikuti cara seperti yang di halaman feedback. Yakni
membuat view baru.
📜 views/admin/post_empty.php
<!DOCTYPE html>
<html lang="en">
<head>
<?php $this->load->view('admin/_partials/head.php') ?>
</head>
<body>
<main class="main">
<?php $this->load->view('admin/_partials/side_nav.php') ?>
<div class="content">
<h1>Article is Empty</h1>
<p>No Article to show. Please create new article.</p>
<div>
<a href="<?= site_url('admin/post/new') ?>"
class="button button-primary">+ Create New Article</a>
</div>
</html>
Mantap!
Halaman overview akan kita gunakan untuk menampilkan ada berapa total
artikel yang sudah dibuat dan total feedback yang sudah didapatkan.
📜 models/Article_model.php
📜 models/Feedback_model.php
public function count(){
return $this->db->count_all($this->_table);
}
Fungsi ini akan mengembalikan nilai berupa integer sesuai dengan jumlah
data yang ada pada tabel.
<?php
$data = [
"article_count" => $this->article_model->count(),
"feedback_count" => $this->feedback_model->count()
];
$this->load->view('admin/dashboard.php', $data);
}
}
Nah, sekarang ubahlah view untuk halaman overview menjadi seperti ini:
📜 views/admin/dashboard.php
<!DOCTYPE html>
<html lang="en">
<head>
<?php $this->load->view('admin/_partials/head.php') ?>
</head>
<body>
<main class="main">
<?php $this->load->view('admin/_partials/side_nav.php') ?>
<div class="content">
<h1>Overview</h1>
</html>
Hasilnya:
Mantap!
Apa Selanjutnya?
Pada tutorial ini, kita akan belajar tentang validasi data di Codeigniter.
Agar kita bisa membuat aplikasi yang lebih aman.
Form validation adalah proses validasi data input yang diinputkan dari
form.
Intinya:
Salah satunya dengan melakukan validasi input yang dilakukan oleh user.
Ini dilakukan saat data dikirim melalui metode POST dan di sana kita
melakukan pengecekan data. Bisa dilakukan secara manual maupun
dengan library.
Cara pakainya, kita tinggal load saja library-nya pada method yang akan
menggunakan validasi data.
$this->load->library('form_validation');
Bisa juga kita load di dalam konstruktor atau atauloader jika memang kita
membutuhkan di semua method.
Tapi, kita menginginkan agar libary ini digunakan pada method tertentu
saja. Yakni method-method yang menerima input dari user.
Karena itu, lebih baik di-load di method saja dari pada di autoloader.
Contoh:
Saat menjalankan validasi, fungsi run() akan mengembalikan nilai TRUE jika
datanya valid dan FALSE jika datanya invalid atau tidak sesuai
dengan rules yang kita berikan.
$rules = [
[
'field' => 'email', //<- ini mengikuti nama input di form
'label' => 'Email Address',
'rules' => 'required|valid_email|max_length[64]']
];
Pada rule tersebut, kita menentukan input field dengan nama email :
Codeigniter menyediaakan rules yang bisa kita pakai langsung. Kita juga
bisa membuat custom rules apabila rulse tidak ada di dalam rules bawaan
Codeigniter.
Berikut ini tabel rules bawaan Codeigniter yang bisa kita pakai.
Paramete
Rule r Keterangan
Input harus unik berdasarkan nama field pada database. Rule ini
membutuhkan Query Builder agar bisa digunakan.
is_unique Ya Contoh: is_unique[table.field]
Input harus lebih besar dari angka yang ditentukan dan harus
greater_than Ya berupa angka. Contoh: greater_than[8]
Input harus lebih besar atau sama dengan nilai yang ditentukan dan
greater_than_equal_to Ya harus berupa angka. Contoh: greater_than_equal_to[8]
Input harus lebih kecil dari nilai yang ditentukan dan harus berupa
less_than Ya angka. Contoh: less_than[8]
Input harus lebih kecil atau sama dengan dari nilai yang ditentukan
less_than_equal_to Ya dan harus berupa angka, Contoh: less_than_equal_to[8]
Paramete
Rule r Keterangan
is_natural_no_zero Tidak Input harus berupa angka alami yang bukan nol.
valid_emails Tidak input list yang dipisah dengan koma harus berupa email yang benar
valid_ip Tidak Input harus berupa IP Address. Bisa dengan format ‘ipv4’ atau ‘ipv6’.
Kamu tidak harus menghapal semua rules ini. Kalau tidak ingat, bisal
dilihat di dokumentasi Form Validation.
Nah, sekarang mari kita coba menerapkan validasi data di aplikasi yang
kita buat. Yakni beritacoding.
Pertama mari kita buat validasi input untuk form Contact atau Feedback.
Namun, membuat rules di dalam model akan membuatnya bisa dipakai lagi
pada method yang membutuhkannya.
Oke sekarang..
Method ini akan mengembalikan sebuah array yang berisi rules untuk
input field yang kan kita validasi.
<?php
Perhatikan!
Kita memberikan rules untuk tiga input field, yakni name, email dan message.
Ketiga input field wajib diisi, karena itu kita berikan rule required.
Lalu untuk max_length kita bisa mengikuti panjang karakter yang sudah
ditentukan pada tabel di database.
$rules = $this->feedback_model->rules();
$this->form_validation->set_rules($rules);
if ($this->form_validation->run() == FALSE) {
return $this->load->view('contact', $data);
}
$feedback = [
'id' => uniqid('', true),
'name' => $this->input->post('name'),
'email' => $this->input->post('email'),
'message' => $this->input->post('message')
];
$feedback_saved = $this->feedback_model->insert($feedback);
if ($feedback_saved) {
return $this->load->view('contact_thanks');
}
}
$this->load->view('contact', $data);
}
$rules = $this->feedback_model->rules();
$this->form_validation->set_rules($rules);
if ($this->form_validation->run() == FALSE) {
return $this->load->view('contact', $data);
}
Jika hasil validasi data pada method run() adalah FALSE atau invalid, maka
fungsi akan mengembalikan view contact dan kode di bawahnya tidak akan
tereksekusi.
Namun, sebaliknya.. jika hasilnya valid atau TRUE maka kode dibawahnya
akan dieksekusi, yakni kode untuk menyimpan data ke database.
Oke sekarang..
📜 views/contact.php
<!DOCTYPE html>
<html lang="en">
<head>
<?php $this->load->view('_partials/head.php'); ?>
</head>
<body>
<?php $this->load->view('_partials/navbar.php'); ?>
<div class="container">
<h1>Contact Us</h1>
<p>Hubungi kami melalui form berikut</p>
<form action="" method="post" style="max-width: 600px;">
<div>
<label for="name">Name*</label>
<input type="text" name="name" class="<?=
form_error('name') ? 'invalid' : '' ?>" placeholder="your name" value="<?=
set_value('name') ?>" />
<div class="invalid-feedback"><?=
form_error('name') ?></div>
</div>
<div>
<label for="email">Email*</label>
<input type="email" name="email" class="<?=
form_error('email') ? 'invalid' : '' ?>" placeholder="your email address"
value="<?= set_value('email') ?>" />
<div class="invalid-feedback"><?=
form_error('email') ?></div>
</div>
<div>
<label for="messaage">Message*</label><br>
<textarea name="message" cols="30" class="<?=
form_error('message') ? 'invalid' : '' ?>" rows="5" placeholder="write your
message"><?= set_value('message') ?></textarea>
<div class="invalid-feedback"><?=
form_error('message') ?></div>
</div>
</html>
Jika kita perhatikan.. ada dua fungsi baru yang kita pakai di dalam view ini.
set_value() adalah fungsi untuk mengisi ulang nilai pada input field dengan
nilai sebelumnya. Fungsi ini akan mencegah input field dikosongkan saat
kita submit dan terjadi invalid.
form_error() adalah fungsi untuk menampilkan pesan feedback saat input
field invalid.
Parameter yang kita harus berikan pada kedua fungsi ini adalah nama dari
input field sesuai pada rules yang kita buat.
/* Form */
form {
box-sizing: border-box;
display:flex;
flex-direction: column;
gap: 1rem;
margin: 2em 0;
}
label {
display: inline-block;
margin-bottom: 0.5rem;
}
input, textarea {
display: inline-block;
padding: 0.5rem;
width: 100%;
}
input:focus, textarea:focus {
outline-color: dodgerblue;
}
.invalid {
border: 2px solid rgb(153, 16, 16);
}
.invalid::placeholder {
color: rgb(153, 16, 16);
}
.invalid-feedback:empty {
display: none;
}
.invalid-feedback {
font-size: smaller;
color: rgb(153, 16, 16);
}
/* Button */
.button {
background-color: #e7e7e7;
border: 2px solid transparent;
border-radius: 8px;
color: black;
padding: 8px 32px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 1rem;
font-family: sans-serif;
}
.button:hover {
opacity: 0.8;
}
.button:active {
border: 2px solid rgba(0, 0, 0, 0.5);
}
.button-success {
background-color: #4caf50;
color: white;
}
.button-primary {
background-color: #008cba;
color: white;
}
.button-danger {
background-color: #f44336;
color: white;
}
.button-small {
font-size: 0.7rem;
}
Maka hasilnya:
5. Percobaan
Cobalah untuk tidak negisi input pada halaman form, lalu klik submit.
Yap! validasi kita berhasil.
Lalu kita coba isi form Name dengan teks yang lebih dari 32 karakter.
Yap! ini juga berhasil.
Bisa juga sebenarnya kita filter dari sini, namun karena XSS berjalan di
client. Solusinya bisa diatasi di sisi client.
Ada dua input field yang perlu kita validasi di dalam artikel,
yakni title dan draft.
Sedangkan content tidak kita berikan rules, namun tetap kita tulis dalam
array rules.
📜 controllers/admin/Post.php
<?php
$article = [
'id' => $id,
'title' => $this->input->post('title'),
'slug' => $slug,
'content' => $this->input->post('content'),
'draft' => $this->input->post('draft')
];
$saved = $this->article_model->insert($article);
if ($saved) {
$this->session->set_flashdata('message',
'Article was created');
return redirect('admin/post');
}
}
$this->load->view('admin/post_new_form.php');
}
if (!$data['article'] || !$id) {
show_404();
}
$this->load->view('admin/post_edit_form.php', $data);
}
Berikutnya kita perlu mengubah view untuk form new dan edit agar bisa
mengampilkan feedback validasi.
Silahkan lanjut:
📜 views/admin/post_new_form.php
<!DOCTYPE html>
<html lang="en">
<head>
<?php $this->load->view('admin/_partials/head.php') ?>
</head>
<body>
<main class="main">
<?php $this->load->view('admin/_partials/side_nav.php') ?>
<div class="content">
<h1>Write new Article</h1>
<div>
<label for="content">Konten</label>
<textarea name="content" cols="30"
rows="10" placeholder="Tuliskan isi pikiranmu..."><?= set_value('content') ?
></textarea>
</div>
<div>
<button type="submit" name="draft"
class="button" value="true">Save to Draft</button>
<button type="submit" name="draft"
class="button button-primary" value="false">Publish</button>
<div class="invalid-feedback">
<?= form_error('draft') ?>
</div>
</div>
</form>
</html>
📜 views/admin/post_edit_form.php
<!DOCTYPE html>
<html lang="en">
<head>
<?php $this->load->view('admin/_partials/head.php') ?>
</head>
<body>
<main class="main">
<?php $this->load->view('admin/_partials/side_nav.php') ?>
<div class="content">
<h1>Edit Article</h1>
<div>
<label for="content">Konten</label>
<textarea name="content" cols="30"
rows="10" placeholder="Tuliskan isi pikiranmu..."><?= form_error('content') ?
set_value('content') : $article->content ?></textarea>
</div>
<div>
<button type="submit" name="draft"
class="button" value="true">Save to Draft</button>
<button type="submit" name="draft"
class="button button-primary" value="false">Publish Update</button>
<div class="invalid-feedback">
<?= form_error('draft') ?>
</div>
</div>
</form>
</html>
Jika kita perhatikan, pada form edit.. kita menggunakan dua nilai untuk
input field judul.
Jika form edit error, maka kita akan pakai nilai dari form validation.
Namun, sebaliknya.. kita akan pakai nilai dari database.
Nah berikutnya kita harus mengubah kode CSS untuk form agar bisa
menampilkan pesan feedback.
/* Form */
form {
box-sizing: border-box;
display: flex;
flex-direction: column;
gap: 1rem;
padding: 2rem 0;
}
label {
display: inline-block;
margin-bottom: 0.5rem;
}
input, textarea {
display: inline-block;
padding: 0.5rem;
width: 100%;
}
input:focus, textarea:focus {
outline-color: dodgerblue;
}
.invalid {
border: 2px solid rgb(153, 16, 16);
}
.invalid::placeholder {
color: rgb(153, 16, 16);
}
.invalid-feedback:empty {
display: none;
}
.invalid-feedback {
font-size: smaller;
color: rgb(153, 16, 16);
}
5. Percobaan
Cobalah untuk membuat artikel baru, lalu kosongkan judulnya. Maka akan
terjadi error seperti ini:
Coba juga untuk mengisi judul yang melebihi batas maksimal, yakni 128
karakter.
Coba juga untuk tes form edit. Pastikan hasilnya sesui seperti yang kita
harapkan.
Yakni untuk judul wajib diisi dan tidak boleh lebih dari 128 karakter.
Nilai draft sebenarnya kita dapatkan dari tombol Save to Draft (true)
dan Publish (false).
Secara otomatis nilai ini akan tersisi, tergantung dari tombol yang diklik
oleh user.
Namun kadang bisa saja ada user yang jahil, sengaja mengubah value di
dalam tombol melalui inspect element.
Nilai draft tidak lagi true dan false, melainkan nilai yang sudah diubah.
..kita melakukan valiadasi terhadap nilai draft yang hanya boleh diisi
dengan true dan false.
Lakukan juga:
Sebenarnya ini opsional, boleh dilakukan boleh juga tidak. Karena kita
sudah membuat validasi di sisi server.
Akan tetapi, ada baiknya kita buat juga validasi di sisi client. Agar aplikasi
kita inputnya divalidasi dari dua sisi.
Untuk melakukan validasi di sisi client, kita bisa gunakan atribut validasi
bawaan HTML 5 dan juga Javascript.
Biar gampang kita pakai saja atribut bawaan:
Contoh:
Mari kita ubah kembali view untuk form contact, new artikel, dan edit
artikel.
📜 views/contact.php
Tambahkan atribut required dan maxlength="32" pada input nama.
<input
type="text"
name="name"
class="<?= form_error('name') ? 'invalid' : '' ?>"
placeholder="your name"
value="<?= set_value('name') ?>"
required
maxlength="32"
/>
<input
type="email"
name="email"
class="<?= form_error('email') ? 'invalid' : '' ?>"
placeholder="your email address"
value="<?= set_value('email') ?>"
required
/>
<textarea
name="message"
cols="30"
class="<?= form_error('message') ? 'invalid' : '' ?>"
rows="5"
placeholder="write your message"
required
><?= set_value('message') ?></textarea>
📜 views/admin/post_new_form.php
Tambahkan atribut required dan maxlength="128" pada input title.
<input
type="text"
name="title"
class="<?= form_error('title') ? 'invalid' : '' ?>"
value="<?= form_error('title') ? set_value('title') : $article->title ?>"
required
maxlength="128"
/>
📜 views/admin/post_edit_form.php
Tambahkan atribut required dan maxlength="128" pada input title.
<input
type="text"
name="title"
class="<?= form_error('title') ? 'invalid' : '' ?>"
value="<?= form_error('title') ? set_value('title') : $article->title ?>"
required
maxlength="128"
/>
Percobaan:
Silahkan coba melakukan input.
Input akan otomatis dilakukan oleh browser saat kita melakukan submit.
Apa Selanjutnya?
Selamat belajar!
Pada tutorial ini, kita akan membuat fitur login untuk admin dengan
library session bawaan dari Codeigniter.
Jadi, ketika kita membuka website.. di sana bisa kita katakan sedang
memulai sebuah sesi baru.
Data session bisa kita simpan di dalam client dan juga server.
Data session yang disimpan di dalam client, akan hilang saat browser atau
tab ditutup. Sedangkan session yang disimpan di dalam server akan hilang
saat server malakukan restart atau dihapus manual.
Nah, pada tutorial ini.. kita akan membuat login dengan menyimpan
session di dalam server.
Sebenarnya PHP sendiri sudah menyediakan fitur session yang bisa diakses
dari variabel global $_SESSION.
Namun, jika kita menggunakan session bawaan PHP, kita harus memanggil
fungsi session_start() di awal eksekusi.
Kita cukup pakai library session yang sudah disediakan oleh Codeigniter.
Maka library session sudah diload otomatis dan akan bisa kita gunakan dari
aplikasi Codeigniter.
$this->session->nama_method_session();
Ada beberapa method yang akan sering kita gunakan pada library session.
// menghapus session
$this->session->unset_userdata('key');
// hapus semua session
$this->session->sess_destory();
Parameter key kita perlukan untuk membuat dan mengakses isi session.
Penjelasan lebih detail tentang library ini, bisa juga kamu baca
di dokumentasi library session.
Oke sekarang..
email: [email protected]
username: admin
password: admin
Password kita simpan dalam bentuk hash dengan fungsi password_hash() dan
algoritma PASSWORD_DEFAULT .
Buatlah model baru dengan nama Auth_model.php dengan isi sebagai berikut:
<?php
// bikin session
$this->session->set_userdata([self::SESSION_KEY => $user->id]);
$this->_update_last_login($user->id);
return $this->session->has_userdata(self::SESSION_KEY);
}
$user_id = $this->session->userdata(self::SESSION_KEY);
$query = $this->db->get_where($this->_table, ['id' => $user_id]);
return $query->row();
}
Buatlah Controller baru dengan nama Auth.php dengan isi sebagai berikut:
<?php
$rules = $this->auth_model->rules();
$this->form_validation->set_rules($rules);
if($this->form_validation->run() == FALSE){
return $this->load->view('login_form');
}
$username = $this->input->post('username');
$password = $this->input->post('password');
if($this->auth_model->login($username, $password)){
redirect('admin');
} else {
$this->session->set_flashdata('message_login_error',
'Login Gagal, pastikan username dan passwrod benar!');
}
$this->load->view('login_form');
}
Sementara itu, method index() tidak kita pakai. Maka kita bisa
panggil show_404() di sana.
Oke lanjut..
Buatlah file baru bernama login_form.php di dalam folder views dengan isi
sebagai berikut:
<!DOCTYPE html>
<html lang="en">
<head>
<?php $this->load->view('_partials/head.php'); ?>
</head>
<body>
<?php $this->load->view('_partials/navbar.php'); ?>
<div class="container">
<h1>Login</h1>
<p>Masuk ke Dashboard</p>
<div>
<input type="submit" class="button button-
primary" value="Login">
</div>
</form>
</div>
<?php $this->load->view('_partials/footer.php'); ?>
</body>
</html>
Kita ingin setiap membuat halaman admin, user harus login terlebih
dahulu.
<?php
<?php
<?php
<?php
Dengan begini, saat kita membuka controller admin, maka kita akan
diminta login terlebih dahulu.
6. Percobaan
localhost/beritacoding/index.php/auth/login
atau
beritacoding.test/index.php/auth/login
Akan tetapi, jika kita memasukan username dan password yang salah..
maka login akan gagal dan tetap akan berada di halaman login.
beritacoding.test/index.php/admin
Jika halaman admin berhasil terbuka, berarti fitur login belum bekerja
sesui yang diharapkan.
Akan tetapi, jika kita dialihkan ke halaman login. Berarti kita sudah
berhasil membuat halaman login.
Kita ingin menampilkan data user yang sedang login di bagian navbar.
Gimana cara mendapatkan data usernya?
Kita akan banyak mengubah controller admin, karena semua view admin
melakukan load view navbar.
$data = [
"current_user" => $this->auth_model->current_user(),
"article_count" => $this->article_model->count(),
"feedback_count" => $this->feedback_model->count()
];
$this->load->view('admin/dashboard.php', $data);
}
<?php
$article = [
'id' => $id,
'title' => $this->input->post('title'),
'slug' => $slug,
'content' => $this->input->post('content'),
'draft' => $this->input->post('draft')
];
$saved = $this->article_model->insert($article);
if ($saved) {
$this->session->set_flashdata('message',
'Article was created');
return redirect('admin/post');
}
}
$this->load->view('admin/post_new_form.php', $data);
}
if (!$data['article'] || !$id) {
show_404();
}
$article = [
'id' => $id,
'title' => $this->input->post('title'),
'content' => $this->input->post('content'),
'draft' => $this->input->post('draft')
];
$updated = $this->article_model->update($article);
if ($updated) {
$this->session->set_flashdata('message',
'Article was updated');
redirect('admin/post');
}
}
$this->load->view('admin/post_edit_form.php', $data);
}
<aside class="side-nav">
<div class="brand">
<h2>Berita Coding</h2>
<div style="display: flex; gap: 0.8rem; margin:1rem 0;">
<?php
$avatar = $current_user->avatar ?
base_url('upload/avatar/' . $current_user-
>avatar)
: get_gravatar($current_user->email)
?>
<img src="<?= $avatar ?>" alt="<?=
htmlentities($current_user->name, TRUE) ?>" height="32" width="32">
<div>
<b><?= htmlentities($current_user->name) ?></b>
<small><?= htmlentities($current_user->email) ?
></small>
</div>
</div>
</div>
<nav>
<a href="<?= site_url('admin/dashboard') ?>">Overview</a>
<a href="<?= site_url('admin/post') ?>">Post</a>
<a href="<?= site_url('admin/feedback') ?>">Feedback</a>
<a href="<?= site_url('admin/setting') ?>">Setting</a>
<a href="<?= site_url('auth/logout') ?>">Logout</a>
</nav>
</aside>
<?php
/**
* Get either a Gravatar URL or complete image tag for a specified email address.
*
* @param string $email The email address
* @param string $s Size in pixels, defaults to 80px [ 1 - 2048 ]
* @param string $d Default imageset to use [ 404 | mp | identicon | monsterid |
wavatar ]
* @param string $r Maximum rating (inclusive) [ g | pg | r | x ]
* @param boole $img True to return a complete IMG tag False for just the URL
* @param array $atts Optional, additional key/value attributes to include in the
IMG tag
* @return String containing either just a URL or a complete image tag
* @source https://gravatar.com/site/implement/img/php/
*/
function get_gravatar( $email, $s = 80, $d = 'mp', $r = 'g', $img = false, $atts
= array() ) {
$url = 'https://www.gravatar.com/avatar/';
$url .= md5( strtolower( trim( $email ) ) );
$url .= "?s=$s&d=$d&r=$r";
if ( $img ) {
$url = '<img src="' . $url . '"';
foreach ( $atts as $key => $val )
$url .= ' ' . $key . '="' . $val . '"';
$url .= ' />';
}
return $url;
}
4. Percobaan
Bukalah halaman admin..
Maka akan bisa melihat data user yang sedang login seperti ini:
Mantap 👍
Apa Selanjutnya?
Yap! kita belum membuat fitur untuk setting atau ubah nama dan avatar admin.