| 
<?php
 class BaseController
 {
 
 protected $app;
 protected $data;
 
 public function __construct()
 {
 $this->app = Slim\Slim::getInstance();
 $this->data = array();
 
 /** default title */
 $this->data['title'] = '';
 
 /** meta tag and information */
 $this->data['meta'] = array();
 
 /** queued css files */
 $this->data['css'] = array(
 'internal'  => array(),
 'external'  => array()
 );
 
 /** queued js files */
 $this->data['js'] = array(
 'internal'  => array(),
 'external'  => array()
 );
 
 /** prepared message info */
 $this->data['message'] = array(
 'error'    => array(),
 'info'    => array(),
 'debug'    => array(),
 );
 
 /** global javascript var */
 $this->data['global'] = array();
 
 /** base dir for asset file */
 $this->data['baseUrl']  = $this->baseUrl();
 $this->data['assetUrl'] = $this->data['baseUrl'].'assets/';
 
 $this->loadBaseCss();
 $this->loadBaseJs();
 
 }
 
 /**
 * enqueue css asset to be loaded
 * @param  [string] $css     [css file to be loaded relative to base_asset_dir]
 * @param  [array]  $options [location=internal|external, position=first|last|after:file|before:file]
 */
 protected function loadCss($css, $options=array())
 {
 $location = (isset($options['location'])) ? $options['location']:'internal';
 
 //after:file, before:file, first, last
 $position = (isset($options['position'])) ? $options['position']:'last';
 
 if(!in_array($css,$this->data['css'][$location])){
 if($position=='first' || $position=='last'){
 $key = $position;
 $file='';
 }else{
 list($key,$file) =  explode(':',$position);
 }
 
 switch($key){
 case 'first':
 array_unshift($this->data['css'][$location],$css);
 break;
 
 case 'last':
 $this->data['css'][$location][]=$css;
 break;
 
 case 'before':
 case 'after':
 $varkey = array_keys($this->data['css'][$location],$file);
 if($varkey){
 $nextkey = ($key=='after') ? $varkey[0]+1 : $varkey[0];
 array_splice($this->data['css'][$location],$nextkey,0,$css);
 }else{
 $this->data['css'][$location][]=$css;
 }
 break;
 }
 }
 }
 
 
 /**
 * enqueue js asset to be loaded
 * @param  [string] $js      [js file to be loaded relative to base_asset_dir]
 * @param  [array]  $options [location=internal|external, position=first|last|after:file|before:file]
 */
 protected function loadJs($js, $options=array())
 {
 $location = (isset($options['location'])) ? $options['location']:'internal';
 
 //after:file, before:file, first, last
 $position = (isset($options['position'])) ? $options['position']:'last';
 
 if(!in_array($js,$this->data['js'][$location])){
 if($position=='first' || $position=='last'){
 $key = $position;
 $file='';
 }else{
 list($key,$file) =  explode(':',$position);
 }
 
 switch($key){
 case 'first':
 array_unshift($this->data['js'][$location],$js);
 break;
 
 case 'last':
 $this->data['js'][$location][]=$js;
 break;
 
 case 'before':
 case 'after':
 $varkey = array_keys($this->data['js'][$location],$file);
 if($varkey){
 $nextkey = ($key=='after') ? $varkey[0]+1 : $varkey[0];
 array_splice($this->data['js'][$location],$nextkey,0,$js);
 }else{
 $this->data['js'][$location][]=$js;
 }
 break;
 }
 }
 }
 
 /**
 * clear enqueued css asset
 */
 protected function resetCss()
 {
 $this->data['css']         = array(
 'internal'  => array(),
 'external'  => array()
 );
 }
 
 /**
 * clear enqueued js asset
 */
 protected function resetJs()
 {
 $this->data['js']         = array(
 'internal'  => array(),
 'external'  => array()
 );
 }
 
 /**
 * remove individual css file from queue list
 * @param  [string] $css [css file to be removed]
 */
 protected function removeCss($css)
 {
 $key=array_keys($this->data['css']['internal'],$css);
 if($key){
 array_splice($this->data['css']['internal'],$key[0],1);
 }
 
 $key=array_keys($this->data['css']['external'],$css);
 if($key){
 array_splice($this->data['css']['external'],$key[0],1);
 }
 }
 
 /**
 * remove individual js file from queue list
 * @param  [string] $js [js file to be removed]
 */
 protected function removeJs($js)
 {
 $key=array_keys($this->data['js']['internal'],$js);
 if($key){
 array_splice($this->data['js']['internal'],$key[0],1);
 }
 
 $key=array_keys($this->data['js']['external'],$js);
 if($key){
 array_splice($this->data['js']['external'],$key[0],1);
 }
 }
 
 /**
 * addMessage to be viewd in the view file
 */
 protected function message($message, $type='info')
 {
 $this->data['message'][$type] = $message;
 }
 
 /**
 * register global variable to be accessed via javascript
 */
 protected function publish($key,$val)
 {
 $this->data['global'][$key] =  $val;
 }
 
 /**
 * remove published variable from registry
 */
 protected function unpublish($key)
 {
 unset($this->data['global'][$key]);
 }
 
 /**
 * add custom meta tags to the page
 */
 protected function meta($name, $content)
 {
 $this->data['meta'][$name] = $content;
 }
 
 /**
 * load base css for the template
 */
 protected function loadBaseCss()
 {
 $this->loadCss("bootstrap.min.css");
 $this->loadCss("font-awesome.min.css");
 $this->loadCss("sb-admin.css");
 $this->loadCss("custom.css");
 }
 
 /**
 * load base js for the template
 */
 protected function loadBaseJs()
 {
 $this->loadJs("jquery-1.10.2.js");
 $this->loadJs("bootstrap.min.js");
 $this->loadJs("plugins/metisMenu/jquery.metisMenu.js");
 $this->loadJs("sb-admin.js");
 }
 
 /**
 * generate base URL
 */
 protected function baseUrl()
 {
 $path       = dirname($_SERVER['SCRIPT_NAME']);
 $path       = trim($path, '/');
 $baseUrl    = Request::getUrl();
 $baseUrl    = trim($baseUrl, '/');
 return $baseUrl.'/'.$path.( $path ? '/' : '' );
 }
 
 /**
 * generate siteUrl
 */
 protected function siteUrl($path, $includeIndex = false)
 {
 $path = trim($path, '/');
 return $this->data['baseUrl'].$path;
 }
 }
 
 |