Codeigniter4 View Layout

Ini adalah lanjutan dari tutorial sebelumnya. Jika kamu belum membacanya, saya sarankan untuk membacanya terlebih dahulu.

Pada tutorial sebelumnya, kita sudah membuat View. Namun, kita membuatnya dengan kode yang sama dan berulang-ulang.

Ini tentunya kurang efektif jika kita punya banyak view.

Mengapa?

Karena jika ada sedikit perubahan鈥攎isalnya mengubah warna navbar鈥攎aka kita harus mengubahnya di semua view.

Bayangkan jika kita punya banyak view..

Pasti akan capek mengedit semuanya.

Karena itu, gunakanlah View Layout biar view yang kita buat lebih efektif.

Apa itu View Layout?

View Layout adalah fitur terbaru di Codeigniter 4 yang akan membantu kita dalam membuat layout untuk halaman atau view.

Layout kita butuhkan agar tidak mengulang-ulang kode yang sama di dalam View. Cukup buat satu kode layout dan nanti kita pakai di beberapa view.

Coba perhatikan gambar berikut:

layout

Pada gambar tersebut, kita punya dua layout.. yakni Page Layout dan Post Layout.

Page Layout menggunakan satu kolom, sedangkan Post Layout menggunakan dua kolom.

Jika kamu pernah membuat template blog, pasti tidak akan asing dengan layout ini.

Nah nantinya kedua Layout ini akan dipakai oleh beberapa view.

Page Layout akan dipakai pada view About Page, Contact Page, FAQs Page, dll.

..dan untuk Post Layout akan dipakai untuk view News Page dan juga Blog post.

Jika kamu punya halaman produk, bisa juga dibuatkan layout tersendiri. Namun, karena kita menggunakan studi kasus web portal berita, kita cukup buat dua Layout saja.

Oke, sekarang mari kita coba membuatnya.

Membuat Layout untuk Page

Buatlah folder baru di dalam app/Views dengan nama layout.

Folder ini akan kita pakai untuk menyimpan kode layout.

Selanjutnya..

Buatlah file PHP baru di dalam folder 馃搧 layout dengan nama page_layout.php dan isilah dengan kode berikut.

<!DOCTYPE html>
<html lang="en">

<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Protal Berita Codeigniter</title>

	<!-- Bootstrap CSS -->
	<link rel="stylesheet" href="<?= base_url('css/bootstrap.min.css') ?>" />
</head>

<body>

	<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
		<div class="container">
			<a class="navbar-brand" href="<?= base_url() ?>">Home</a>
			<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
				<span class="navbar-toggler-icon"></span>
			</button>
			<div class="collapse navbar-collapse" id="navbarNav">
				<ul class="navbar-nav">
					<li class="nav-item">
						<a class="nav-link" href="<?= base_url('about') ?>">About</a>
					</li>
					<li class="nav-item">
						<a class="nav-link" href="<?= base_url('contact') ?>">Contact</a>
					</li>
					<li class="nav-item">
						<a class="nav-link" href="<?= base_url('faqs') ?>">Faqs</a>
					</li>
				</ul>
			</div>
		</div>
	</nav>


	<header class="jumbotron jumbotron-fluid">
		<div class="container">
			<div class="row">
				<div class="col-md-12">
					<h1 class="h1">Portal Berita Codeigniter</h1>
				</div>
			</div>
		</div>
    </header>
    
    <?= $this->renderSection('content') ?>

	<footer class="jumbotron jumbotron-fluid mt-5 mb-0">
		<div class="container text-center">Copyright &copy <?= Date('Y') ?> CI News</div>
	</footer>

	<!-- Jquery dan Bootsrap JS -->
	<script src="<?= base_url('js/jquery.min.js') ?>"></script>
	<script src="<?= base_url('js/bootstrap.min.js') ?>"></script>

</body>

</html>

Coba perhatikan kode di bawah </header>.

<?= $this->renderSection('content') ?>

Kode ini berfungsi untuk me-render bagian konten dari halaman. Artinya nanti di bagian ini akan berisi konten yang berbeda-beda.

Selanjutnya, ubah kode view untuk halaman Home, About, Contact, dan FAQs.

Ubah kode app/Views/welcome_message.php menjadi seperti ini:

<?= $this->extend('layout/page_layout') ?>

<?= $this->section('content') ?>

	<div class="container">
		<div class="row">
			<div class="col-md-12 my-2 card">
				<div class="card-body">
					<h5 class="h5">Codeigniter 4 Sudah Rilis!</h5>
					<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quibusdam perferendis commodi tenetur quos ducimus repellat nulla, nam magni. Commodi iusto ad harum voluptas exercitationem facere eos earum laboriosam excepturi quas?</p>
				</div>
			</div>
			<div class="col-md-12 my-2 card">
				<div class="card-body">
					<h5 class="h5">Pengembangan Codeiginter 4 Tertunda</h5>
					<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quibusdam perferendis commodi tenetur quos ducimus repellat nulla, nam magni. Commodi iusto ad harum voluptas exercitationem facere eos earum laboriosam excepturi quas?</p>
				</div>
			</div>
			<div class="col-md-12 my-2 card">
				<div class="card-body">
					<h5 class="h5">Wow, Ini 5 Startup yang Menggunakan Codeigniter</h5>
					<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quibusdam perferendis commodi tenetur quos ducimus repellat nulla, nam magni. Commodi iusto ad harum voluptas exercitationem facere eos earum laboriosam excepturi quas?</p>
				</div>
			</div>
			<div class="col-md-12 my-2 card">
				<div class="card-body">
					<h5 class="h5">Codeigniter Ternyata Framework Terpopuler di Inodnesia</h5>
					<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quibusdam perferendis commodi tenetur quos ducimus repellat nulla, nam magni. Commodi iusto ad harum voluptas exercitationem facere eos earum laboriosam excepturi quas?</p>
				</div>
			</div>
		</div>
	</div>

<?= $this->endSection() ?>

Ubah kode app/Views/about.php menjadi seperti ini:

<?= $this->extend('layout/page_layout') ?>

<?= $this->section('content') ?>
<div class="container">
    <div class="row">
        <div class="col-md-12">
            <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Mollitia modi unde cumque! Cum repellendus eveniet, illum id doloribus, quibusdam tenetur debitis est libero quasi assumenda voluptates aliquam tempore. Porro, asperiores.</p>
            <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Mollitia modi unde cumque! Cum repellendus eveniet, illum id doloribus, quibusdam tenetur debitis est libero quasi assumenda voluptates aliquam tempore. Porro, asperiores.</p>
            <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Mollitia modi unde cumque! Cum repellendus eveniet, illum id doloribus, quibusdam tenetur debitis est libero quasi assumenda voluptates aliquam tempore. Porro, asperiores.</p>
            <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Mollitia modi unde cumque! Cum repellendus eveniet, illum id doloribus, quibusdam tenetur debitis est libero quasi assumenda voluptates aliquam tempore. Porro, asperiores.</p>
        </div>
    </div>
</div>
<?= $this->endSection() ?>

Ubah Kode app/Views/contact.php menjadi seperti ini:

<?= $this->extend('layout/page_layout') ?>

<?= $this->section('content') ?>

<div class="container">
    <div class="row">
        <div class="col-md-6">

            <h3 class="h3">Hello <?= $name ?>!</h3>
            <p>Silahkan hubungi kami melalui form berikut</p>

            <form action="" class="form">

                <div class="form-group">
                    <label for="email">Email</label>
                    <input type="email" class="form-control">
                </div>

                <div class="form-group">
                    <label for="email">Message</label>
                    <textarea name="message" class="form-control" id="" cols="30" rows="10"></textarea>
                </div>

                <div class="form-group">
                    <input type="submit" value="Kirim" class="btn btn-primary w-100">
                </div>

            </form>

        </div>
    </div>
</div>

<?= $this->endSection() ?>

Terakhir ubah kode app/views/faqs.php menjadi seperti ini:

<?= $this->extend('layout/page_layout') ?>

<?= $this->section('content') ?>
<div class="container">
    <div class="row">
        <div class="col-md-12">
            <?php foreach ($data_faqs as $faq) : ?>
                <h2 class="h2"><?= $faq['question'] ?></h2>
                <p><?= $faq['answer'] ?></p>
            <?php endforeach; ?>
        </div>
    </div>
</div>

<?= $this->endSection() ?>

Jika kita lihat hasilnya, maka tidak akan terlihat perubahan apapun.

Namun, cobalah untuk melihat di bagian Debugger bar. Klik pada logo CI yang ada di pojok kanan bawah, lalu klik menu Views.

debug view

Berdasarkan hasil tersebut, ada dua view yang digunakan.

Oke sekarng coba perhatikan..

Setiap View yang ingin menggunakan layout harus meng-extend Layoutnya.

<?= $this->extend('layout/page_layout') ?>

Lalu setelah itu, barulah kita buat view section untuk menampilkan konten.

<?= $this->extend('layout/page_layout') ?>
    <!-- konten view di sini -->
<?= $this->endSection() ?>

Gampang kan..

View Partial untuk Layout

View Partial adalah view yang bisa digunakan kembali. View Partial bisa kita include-kan atau gunakan di dalam Layout maupun View.

view partial

Cara membuat view partial sama seperti membuat view biasa.

Mari kita coba buat..

Kita akan membuat tiga partial, yakni navbar.php, header.php, dan footer.php.

Buatlah file baru di dalam folder app/Views/layout/ dengan nama navbar.php, kemudian isi dengan kode berikut:

<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
    <div class="container">
        <a class="navbar-brand" href="<?= base_url() ?>">Home</a>
        <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
            <span class="navbar-toggler-icon"></span>
        </button>
        <div class="collapse navbar-collapse" id="navbarNav">
            <ul class="navbar-nav">
                <li class="nav-item">
                    <a class="nav-link" href="<?= base_url('about') ?>">About</a>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="<?= base_url('contact') ?>">Contact</a>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="<?= base_url('faqs') ?>">Faqs</a>
                </li>
            </ul>
        </div>
    </div>
</nav>

Selanjutnya buat lagi file baru dengan nama header.php dengan isi sebagai berikut:

<header class="jumbotron jumbotron-fluid">
    <div class="container">
        <div class="row">
            <div class="col-md-12">
                <h1 class="h1">Portal Berita Codeigniter</h1>
            </div>
        </div>
    </div>
</header>

Terakhir, buatlah file footer.php dengan isi sebagai berikut.

<footer class="jumbotron jumbotron-fluid mt-5 mb-0">
    <div class="container text-center">Copyright &copy <?= Date('Y') ?> CI News</div>
</footer>

Sehingga sekarang kita punya tiga file partial di dalam folder Views/layout.

file partials

Berikutnya, kita akan menggunakan partial ini di dalam page_layout.php.

Ubahlah isi file page_layout.php menjadi seperti ini:

<!DOCTYPE html>
<html lang="en">

<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Protal Berita Codeigniter</title>

	<!-- Bootstrap CSS -->
	<link rel="stylesheet" href="<?= base_url('css/bootstrap.min.css') ?>" />
</head>

<body>

    <?= $this->include('layout/navbar') ?>
    <?= $this->include('layout/header') ?>
    
    <?= $this->renderSection('content') ?>
    
    <?= $this->include('layout/footer') ?>

	<!-- Jquery dan Bootsrap JS -->
	<script src="<?= base_url('js/jquery.min.js') ?>"></script>
	<script src="<?= base_url('js/bootstrap.min.js') ?>"></script>

</body>

</html>

Hasilnya:

Sekarang akan ada 5 view yang digunakan.

demo view partial

Membuat Layout untuk News

Nah, untuk latihan.. kita akan membuat satu lagi layout, yakni layout untuk halaman news.

Halaman ini menggunakan layout dua kolom dengan sidebar di samping kanan.

Buatlah file baru di dalam folder Views/layout dengan nama post_layout.php dan isilah kodenya seperti ini:

<!DOCTYPE html>
<html lang="en">

<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Protal Berita Codeigniter</title>

	<!-- Bootstrap CSS -->
	<link rel="stylesheet" href="<?= base_url('css/bootstrap.min.css') ?>" />
</head>

<body>

    <?= $this->include('layout/navbar') ?>
    <?= $this->include('layout/header') ?>
    
    <div class="container">
        <div class="row">
            <div class="col-md-8">
                <?= $this->renderSection('content') ?>
            </div>
            <div class="col-md-4">
                <?= $this->include('layout/sidebar') ?>
            </div>
        </div>
    </div>

    <?= $this->include('layout/footer') ?>

	<!-- Jquery dan Bootsrap JS -->
	<script src="<?= base_url('js/jquery.min.js') ?>"></script>
	<script src="<?= base_url('js/bootstrap.min.js') ?>"></script>

</body>

</html>

Kemudian buat satu lagi file di dalam Views/layout dengan nama sidebar.php dan isilah dengan kode berikut.

<h5 class="h5">Ini Title Sidebar</h5>
<p class="lead">Ini isi sidebar</p>

Berikutnya, buatlah file view bernama news.php di dalam folder app/Views dengan isi sebagai berikut:

<?= $this->extend('layout/post_layout') ?>

<?= $this->section('content') ?>

<h2 class="h2">Komunitas Codeigniter Indonesia Mengadakan Meetup</h2>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit.</p>
<h2 class="h2">Dukungan Keamanan untuk Codeigniter 3 akan barakhir tahun ini</h2>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit.</p>

<?= $this->endSection() ?>

Sehingga sekarang kita punya tiga file bari di dalam folder app/Views dan app/Views/layout.

file view news

Berikutnya, kita harus membuat Controller agar bisa menampilkan halaman News.

Buatlah Controller baru dengan nama News.php dengan isi sebagai berikut:

<?php namespace App\Controllers;

class News extends BaseController
{
	public function index()
	{
		echo view('news');
	}

	//----------------------------------------------------

}

Berikutnya, daftarkan Controller ini ke dalam Routes.php.

Buka file app/Config/Routes.php dan tambahkan kode berikut:

$routes->get('/news', 'News::index');

Nah, sekarang kita bisa membuka halaman News melalui alamat localhost:8080/news.

Hasilnya:

halaman news

Nantinya halaman News akan kita gunakan untuk menampilkan list berita terbaru dan berita itu sendiri.

Apa Selanjutnya?

Bagaimana?

Gampang kan pakai View Layout?

View Layout memang akan memudahkan kita dalam membuat template untuk halaman.

Namun, ada sedikit masalah..

Apa itu?

Partial tidak bisa menerima parameter data saat kita menggunakannya di dalam View.

Misalnya gini:

<?= $this->include('header', ['title' => 'About Page']) ?>

Data title tidak akan bisa dibaca di dalam partial header.

Tapi tenang saja..

Solusi dari masalah ini adalah menggunakan View Cell?

Ini akan dibahas di tutorial berikutnya.

Silahkan lanjutkan:

Untuk tutorial CI lainnya, cek di 馃摎 List Tutorial Codeigntier