Umarım işinizi görür
<?php
if (!defined('BASEPATH'))
	exit('No direct script access allowed');

class Template
{
	/**
	 * ci super global
	 * @since 1.0
	 * @var object
	 */
	private $ci;
	
	/**
	 * Tüm view değişkenleri bu dizi değişkende tutulur.
	 * 
	 * @since 1.0
	 * @var array
	 */
	public $template_data = array();
	
	/**
	 * örneğin frontend ya da backend
	 * 
	 * @since 1.0
	 * @var string
	 */
	private $side = null;
	
	/**
	 * Layout dosyalarının bulunduğu klasörün adı
	 * 
	 * @since 1.0
	 * @var string
	 */
	private $layout_path = 'layout';
	
	/**
	 * layout dosyasının adı.
	 * default: default
	 * 
	 * @since 1.0
	 * @var string 
	 */
	private $layout = 'default';
	
	/**
	 * Kurucu metod
	 * 
	 * @since 1.0
	 * @param null | array $config 
	 */
	public function __construct($config = null)
	{
		$this->ci =& get_instance();
		
		$this->init();
	}
	
	/**
	 * Yapılandırma
	 * 
	 * @since 1.0
	 */
	private function init()
	{
		empty($this->side) OR $this->side = trim($this->side, '/') . '/';
		
		$this->layout_path = trim($this->layout_path, '/') . '/';
		
		// VARSAYILAN TEMPLATE DATA
		$data = array(
			'site_title' => 'Test',
			
			// Diğer
			'metadata' => ''
		);
		
		$this->template_data = $data;
	}
	
	/**
	 * View dosyaları içerisinde kullanılmak üzere herhangi bir değişkene değer set eder.
	 * 
	 * @since 1.0
	 * @param string $name değişkenin adı
	 * @param string $value değişkenin değeri
	 * @return object
	 */
	public function set($name = '', $value = '')
	{
		if (is_array($name)) {
			$this->template_data = array_merge($name, $this->template_data);
			return null;
		}
		
		$this->template_data[$name] = $value;
		
		return $this;
	}
	
	/**
	 * Metadata değişkenini set eder.
	 * Bu fonksiyon aracilığı ile meta etiketi eklenir.
	 * 
	 * @since 1.0
	 * @example $this->template->set_metadata('<script type="text/javascript" charset="utf-8" src="assets/js/jquery.js" />');
	 * @staticvar strıng $_metadata
	 * @param string $metadata 
	 * @return object
	 */
	public function set_metadata($metadata = '')
	{
		static $_metadata = '';
		
		$metadata = trim($metadata);
		
		$_metadata .= $metadata . PHP_EOL;
		
		$this->set('metadata', $_metadata);
		
		return $this;
	}
	
	/**
	 * Bir view parçası yükler
	 * 
	 * @since 1.0
	 * @param string $view view dosyası
	 * @param array $view_data yüklenecek olan view dosyası içerisinde kullanılmak üzere varsa data
	 * @param bool $return view dosyasının çıktı şekli TRUE direk ekrana basılmaz FALSE direk ekrana basar
	 */
	public function load_partial($view = '', $view_data = array(), $return = FALSE)
	{
		if ($return)
			return $this->ci->load->view($this->side . $view, $view_data, $return);
		else
			$this->ci->load->view($this->side . $view, $view_data, $return);
	}
	
	/**
	 * Bir layout ile birlikte herhangi bir view dosyasını yükler
	 *
	 * @since 1.0
	 * @param string $view layout dosyası içeriğine yüklenecek view dosyası
	 * @param array $view_data yüklenecek olan view dosyası içerisinde kullanılmak üzere varsa data
	 * @param bool $return view dosyasının çıktı şekli TRUE direk ekrana basılmaz FALSE direk ekrana basar
	 * @return string
	 */
	public function load($view = '', $view_data = array(), $return = FALSE)
	{
		$template = $this->side . $this->layout_path . $this->layout;
		$view     = $this->side . $view;
		
		$this->set('content', $this->ci->load->view($view, $view_data, TRUE));
		
		$this->ci->load->view($template, $this->template_data, $return);
	}
	
	/**
	 * Tarafı set eder.
	 * 
	 * @since 1.0
	 * @param string $side taraf
	 * @return object
	 */
	public function set_side($side = '')
	{
		$this->side = $this->side = trim($side, '/') . '/';
		;
		return $this;
	}
	
	// tarafı döndürür
	public function get_side()
	{
		return $this->side;
	}
	
	/**
	 * Layout dosyasını set eder.
	 * 
	 * @since 1.0
	 * @param string $layout 
	 * @return object
	 */
	public function set_layout($layout = '')
	{
		$this->layout = $layout;
		return $this;
	}
}
MY_Controller'da kullanım örneği:
<?php
if (!defined('BASEPATH'))
	exit('No direct script access allowed');
class MY_Controller extends CI_Controller
{
	public function __construct()
	{
		parent::__construct();
		$this->load->library('template');
		$this->template->set_side('frontend');
	}
	
}

class Admin_Controller extends CI_Controller
{
	public function __construct()
	{
		parent::__construct();
		
		// izin kontrolü burada yapılabilir
		$this->load->library('template');
		$this->template->set_side('backend');
	}
	
}
Controller örneği:
<?php
if (!defined('BASEPATH'))
	exit('No direct script access allowed');

class Main extends MY_Controller
{
	public function __construct()
	{
		parent::__construct();
	}
	
	public function index()
	{
		$videos = $this->video_model->get_all(10);
		
		$data = array(
			'videos' => $videos
		);
		
		$this->template->set('og_video', 'http://a.com/b.swf');
		$this->template->set_metadata('<script type="text/javascript">console.log("meta");</script>');
		$this->template->load('main', $data);
		
	}
	public function ajax_sifrem()
	{
		$data = array();
		$this->template->load_partial('user/forgot_password', $data);
	}
}
Metadata kullanacaksanız view'da gereken yere <?php echo $metadata; ?> yazınız.
Template'de herhangi bir view dosyasında aşağıdaki şekilde de kullanım olabilmektedir:
<?php $this->template->load_partial('video/comment', array('video_id' => $video_id)); ?>