Technology

Menambahkan Fitur Layouting pada CodeIgniter

 

Pada CodeIgniter, kita mungkin seringkali melakukan layouting, baik dengan metode controller maupun melalui view file. Namun seringkali terjadi redudance / pengulangan. Nah kali ini, saya ingin share mengenai menambahkan fitur layouting pada CodeIgniter tanpa menggunakan library / modifikasi core engine dari CI. Namun kali ini kita akan memanfaatkan subclass yang telah disediakan oleh CodeIgniter.

Modifikasi file MY_Controller.php dan MY_Loader.php

Langkah awal adalah memodifikasi file MY_Controller.php dan MY_Loader.php di mana nanti sedikit diubah behavior-nya dari $this->load->view() menjadi $this->render(), $this->beginContent() dan $this->endContent(). Berikut kode untuk file MY_Controller.php.

<?php
class MY_Controller extends CI_Controller
{
	public $savedContent=array();
	public function render()
	{
		$args = func_get_args();
		return call_user_func_array(array($this->load, 'view'), $args);
	}
	public function beginContent()
	{
		ob_start();
		$level = ob_get_level();
		$this->savedContent[$level] = func_get_args();
		return null;
	}
	public function endContent()
	{
		$level = ob_get_level();
		$content = ob_get_clean();
		$config = $this->savedContent[$level];
		$data['content'] = $content;
		return call_user_func_array(array($this, 'render'),$config);
	}
}

Pada kode di atas ada fungsi render, beginContent, dan endContent. Fungsi render sama dengan fungsi $this->load->view. Hanya saja fungsi ini bisa dikatakan lebih handy dan lebih simple. Sedangkan beginContent dan endContent adalah dua fungsi yang saling bergantung. Untuk file MY_Loader.php kodenya sebagai berikut:

<?php
class MY_Loader extends CI_Loader 
{
	public function beginContent()
	{
		$ci = get_instance();
		$args = func_get_args();
		return call_user_func_array(array($ci, 'beginContent'), $args);
	}
	public function endContent()
	{
		$ci = get_instance();
		$args = func_get_args();
		return call_user_func_array(array($ci, 'endContent'), $args);
	}
	public function render()
	{
		$ci = get_instance();
		$args = func_get_args();
		return call_user_func_array(array($ci, 'render'), $args);
	}
}

Kode di atas diperlukan bila anda menggunakan fungsi render, beginContent, dan endContent pada file view CodeIgniter anda. Fungsi di atas hanya berlaku sebagai trigger untuk file MY_Controller.php. Berikut contoh pengaplikasiannya:

Pertama create controller. Misalnya controller Test di mana controller tersebut extends pada MY_Controller

<?php
class Test extends MY_Controller
{
	public function index()
	{
		$this->render('test/index');
	}
	public function layout()
	{
		$this->render('test/layout');
	}
}

Kemudian create 3 file sebagai berikut: (index.php, layout.php, dan testLayout.php yang disimpan pada direktori: application/views/test/)

1. application/views/test/index.php

<div class="no-layout">Ini dipanggil dengan metode $this->render();</div>

2. application/views/test/layout.php

<?php
$this->beginContent('test/testLayout');
?>
File ini menggunakan metode layouting.
<?php
$this->endContent();

3. application/views/test/testLayout.php

<div class="useLayout">
	<?php print $content?>
</div>

Kemudian akses controller di atas. Semoga berhasil! ;-)

Dapatkan Segera! Video Marketplace Domination: Cara Sukses Jualan di Tokopedia dan Bukalapak. Download Now!


Artikel Terkait

2 komentar

  • Dida
    16 October 2012 - pukul 14:38

    mirip yii, keren :)

    • 17 October 2012 - pukul 16:43

      Betul, fitur tersebut memang diadaptasi dari Yii Framework, sehingga penggunaan CodeIgniter lebih mudah dan efisien untuk layouting. :)

Berikan Komentar

Your email address will not be published. Required fields are marked *