array(),
'_styles' => array(),
);
var $output;
var $js = array();
var $css = array();
var $parser = 'parser';
var $parser_method = 'parse';
var $parse_template = FALSE;
/**
* Constructor
*
* Loads template configuration, template regions, and validates existence of
* default template
*
* @access public
*/
function CI_Template()
{
// Copy an instance of CI so we can use the entire framework.
$this->CI =& get_instance();
// Load the template config file and setup our master template and regions
include(APPPATH.'config/template'.EXT);
if (isset($template))
{
$this->config = $template;
$this->set_template($template['active_template']);
}
}
// --------------------------------------------------------------------
/**
* Use given template settings
*
* @access public
* @param string array key to access template settings
* @return void
*/
function set_template($group)
{
if (isset($this->config[$group]))
{
$this->template = $this->config[$group];
}
else
{
show_error('The "'. $group .'" template group does not exist. Provide a valid group name or add the group first.');
}
$this->initialize($this->template);
}
// --------------------------------------------------------------------
/**
* Set master template
*
* @access public
* @param string filename of new master template file
* @return void
*/
function set_master_template($filename)
{
if (file_exists(APPPATH .'views/'. $filename) or file_exists(APPPATH .'views/'. $filename . EXT))
{
$this->master = $filename;
}
else
{
show_error('The filename provided does not exist in '. APPPATH .'views. Remember to include the extension if other than ".php"');
}
}
// --------------------------------------------------------------------
/**
* Dynamically add a template and optionally switch to it
*
* @access public
* @param string array key to access template settings
* @param array properly formed
* @return void
*/
function add_template($group, $template, $activate = FALSE)
{
if ( ! isset($this->config[$group]))
{
$this->config[$group] = $template;
if ($activate === TRUE)
{
$this->initialize($template);
}
}
else
{
show_error('The "'. $group .'" template group already exists. Use a different group name.');
}
}
// --------------------------------------------------------------------
/**
* Initialize class settings using config settings
*
* @access public
* @param array configuration array
* @return void
*/
function initialize($props)
{
// Set master template
if (isset($props['template'])
&& (file_exists(APPPATH .'views/'. $props['template']) or file_exists(APPPATH .'views/'. $props['template'] . EXT)))
{
$this->master = $props['template'];
}
else
{
// Master template must exist. Throw error.
show_error('Either you have not provided a master template or the one provided does not exist in '. APPPATH .'views. Remember to include the extension if other than ".php"');
}
// Load our regions
if (isset($props['regions']))
{
$this->set_regions($props['regions']);
}
// Set parser and parser method
if (isset($props['parser']))
{
$this->set_parser($props['parser']);
}
if (isset($props['parser_method']))
{
$this->set_parser_method($props['parser_method']);
}
// Set master template parser instructions
$this->parse_template = isset($props['parse_template']) ? $props['parse_template'] : FALSE;
}
// --------------------------------------------------------------------
/**
* Set regions for writing to
*
* @access public
* @param array properly formed regions array
* @return void
*/
function set_regions($regions)
{
if (count($regions))
{
$this->regions = array(
'_scripts' => array(),
'_styles' => array(),
);
foreach ($regions as $key => $region)
{
// Regions must be arrays, but we take the burden off the template
// developer and insure it here
if ( ! is_array($region))
{
$this->add_region($region);
}
else {
$this->add_region($key, $region);
}
}
}
}
// --------------------------------------------------------------------
/**
* Dynamically add region to the currently set template
*
* @access public
* @param string Name to identify the region
* @param array Optional array with region defaults
* @return void
*/
function add_region($name, $props = array())
{
if ( ! is_array($props))
{
$props = array();
}
if ( ! isset($this->regions[$name]))
{
$this->regions[$name] = $props;
}
else
{
show_error('The "'. $name .'" region has already been defined.');
}
}
// --------------------------------------------------------------------
/**
* Empty a region's content
*
* @access public
* @param string Name to identify the region
* @return void
*/
function empty_region($name)
{
if (isset($this->regions[$name]['content']))
{
$this->regions[$name]['content'] = array();
}
else
{
show_error('The "'. $name .'" region is undefined.');
}
}
// --------------------------------------------------------------------
/**
* Set parser
*
* @access public
* @param string name of parser class to load and use for parsing methods
* @return void
*/
function set_parser($parser, $method = NULL)
{
$this->parser = $parser;
$this->CI->load->library($parser);
if ($method)
{
$this->set_parser_method($method);
}
}
// --------------------------------------------------------------------
/**
* Set parser method
*
* @access public
* @param string name of parser class member function to call when parsing
* @return void
*/
function set_parser_method($method)
{
$this->parser_method = $method;
}
// --------------------------------------------------------------------
/**
* Write contents to a region
*
* @access public
* @param string region to write to
* @param string what to write
* @param boolean FALSE to append to region, TRUE to overwrite region
* @return void
*/
function write($region, $content, $overwrite = FALSE)
{
if (isset($this->regions[$region]))
{
if ($overwrite === TRUE) // Should we append the content or overwrite it
{
$this->regions[$region]['content'] = array($content);
} else {
$this->regions[$region]['content'][] = $content;
}
}
// Regions MUST be defined
else
{
show_error("Cannot write to the '{$region}' region. The region is undefined.");
}
}
// --------------------------------------------------------------------
/**
* Write content from a View to a region. 'Views within views'
*
* @access public
* @param string region to write to
* @param string view file to use
* @param array variables to pass into view
* @param boolean FALSE to append to region, TRUE to overwrite region
* @return void
*/
function write_view($region, $view, $data = NULL, $overwrite = FALSE)
{
$args = func_get_args();
// Get rid of non-views
unset($args[0], $args[2], $args[3]);
// Do we have more view suggestions?
if (count($args) > 1)
{
foreach ($args as $suggestion)
{
if (file_exists(APPPATH .'views/'. $suggestion . EXT) or file_exists(APPPATH .'views/'. $suggestion))
{
// Just change the $view arg so the rest of our method works as normal
$view = $suggestion;
break;
}
}
}
$content = $this->CI->load->view($view, $data, TRUE);
$this->write($region, $content, $overwrite);
}
// --------------------------------------------------------------------
/**
* Parse content from a View to a region with the Parser Class
*
* @access public
* @param string region to write to
* @param string view file to parse
* @param array variables to pass into view for parsing
* @param boolean FALSE to append to region, TRUE to overwrite region
* @return void
*/
function parse_view($region, $view, $data = NULL, $overwrite = FALSE)
{
$this->CI->load->library('parser');
$args = func_get_args();
// Get rid of non-views
unset($args[0], $args[2], $args[3]);
// Do we have more view suggestions?
if (count($args) > 1)
{
foreach ($args as $suggestion)
{
if (file_exists(APPPATH .'views/'. $suggestion . EXT) or file_exists(APPPATH .'views/'. $suggestion))
{
// Just change the $view arg so the rest of our method works as normal
$view = $suggestion;
break;
}
}
}
$content = $this->CI->{$this->parser}->{$this->parser_method}($view, $data, TRUE);
$this->write($region, $content, $overwrite);
}
// --------------------------------------------------------------------
/**
* Dynamically include javascript in the template
*
* NOTE: This function does NOT check for existence of .js file
*
* @access public
* @param string script to import or embed
* @param string 'import' to load external file or 'embed' to add as-is
* @param boolean TRUE to use 'defer' attribute, FALSE to exclude it
* @return TRUE on success, FALSE otherwise
*/
function add_js($script, $type = 'import', $defer = FALSE)
{
$success = TRUE;
$js = NULL;
$this->CI->load->helper('url');
switch ($type)
{
case 'import':
$filepath = base_url() . $script;
$js = '