meta = ""; $this->head_js = ""; $this->foot_js = ""; $this->css = ""; $this->title = ""; $this->head_tags = ""; $this->body_class = ""; $this->body_id = ""; $this->base = ""; $this->CI =& get_instance(); //Define some constants for formatting define('NL', "\n"); define('T1', "\t"); define('T2', T1 . T1); define('T3', T2 . T1); define('T4', T2 . T2); define('T5', T3 . T2); define('T6', T3 . T3); } // -------------------------------------------------------------------------- /** * Sets server headers and doctype * * Also sets page mime type, based on if sent as * html or xhtml, and what the target browser * supports * * @param bool $xhtml * @param bool $html5 * @return Page */ private function _headers($xhtml, $html5) { $this->CI->output->set_header("Cache-Control: must-revalidate, public"); $this->CI->output->set_header("Vary: Accept"); $mime = ""; //Variable for accept keyword $accept = (!empty($_SERVER['HTTP_ACCEPT'])) ? $_SERVER['HTTP_ACCEPT'] : ""; //Predefine doctype $doctype_string = ($html5 == TRUE) ? doctype('html5') : doctype('xhtml11'); //Predefine charset $charset = "UTF-8"; //If xhtml flag is false, set html4 header if ($xhtml == TRUE) { //Check that the user agent accepts application/xhtml+xml, or if it's the W3C Validator if (stristr($accept, "application/xhtml+xml") || stristr($_SERVER["HTTP_USER_AGENT"], "W3C_Validator")) { $mime = "application/xhtml+xml"; } //Or if it supports application/xml else if (stristr($accept, "application/xml")) { $mime = "application/xml"; } //Or if it supports text/xml else if (stristr($accept, "text/xml")) { $mime = "text/xml"; } else //Otherwise, it's tag soup { $mime = "text/html"; if ($html5 == FALSE) //If it's not HTML5, it's HTML4 { $doctype_string = doctype('html4-strict'); } } } else { $mime = "text/html"; if ($html5 == FALSE) { $doctype_string = doctype('html4-strict'); } } // set the doctype according to the mime type which was determined if ($mime == "application/xhtml+xml" || $mime == "text/xml" || $mime == "application/xml") { if ($html5 == TRUE) { $doctype_string = ''; } $doctype_string = "\n" . $doctype_string . "\n"; } else { $doctype_string .= "\n"; } // finally, output the mime type and prolog type $this->CI->output->set_header("Content-Type: $mime;charset=$charset"); $this->CI->output->set_header("X-UA-Compatible: chrome=1, IE=edge"); $this->CI->output->set_output($doctype_string); return $this; } // -------------------------------------------------------------------------- /** * Set Meta * * Sets meta tags, with codeigniter native meta tag helper * * @param array $meta * @return Page */ public function set_meta($meta) { $this->meta .= T1 . meta($meta) . NL; return $this; } // -------------------------------------------------------------------------- /** * Sets minified javascript group in header * @param string $group * @param bool $debug * @return Page */ public function set_head_js_group($group, $debug = FALSE) { if ($group === FALSE) { return $this; } $file = $this->CI->config->item('group_js_path') . $group; $file .= ($debug == TRUE) ? "/debug/1" : ""; $this->head_js .= $this->script_tag($file, FALSE); return $this; } // -------------------------------------------------------------------------- /** * Set an individual js file in header * @param string $js * @param bool $domain * @return Page */ public function set_head_js($js, $domain = TRUE) { $this->head_js .= $this->script_tag($js, $domain); return $this; } // -------------------------------------------------------------------------- /** * Sets a minified css group * @param string $group * @return Page */ public function set_css_group($group) { $link = array( 'href' => $this->CI->config->item('group_style_path') . $group, 'rel' => 'stylesheet', 'type' => 'text/css' ); $this->css .= T1 . link_tag($link) . NL; return $this; } // -------------------------------------------------------------------------- /** * Sets a minified javascript group for the page footer * @param string $group * @return Page */ public function set_foot_js_group($group, $debug = FALSE) { $file = $this->CI->config->item('group_js_path') . $group; $file .= ($debug == TRUE) ? "?debug=1" : ""; $this->foot_js .= $this->script_tag($file, FALSE); return $this; } // -------------------------------------------------------------------------- /** * Sets js in footer; multiple files are combined and minified. * @param array $args * @return Page */ public function set_foot_js($js, $domain) { $this->foot_js .= $this->script_tag($js, $domain); return $this; } // -------------------------------------------------------------------------- /** * Sets html title string * @param string $title * @return Page */ public function set_title($title = "") { $title = ($title == "") ? $this->CI->config->item('default_title') : $title; $this->title = $title; return $this; } // -------------------------------------------------------------------------- /** * Sets custom body class * @param string $class * @return Page */ public function set_body_class($class = "") { $this->body_class = $class; return $this; } // -------------------------------------------------------------------------- /** * Sets custom body id * @param string $id * @return Page */ public function set_body_id($id = "") { $this->body_id = $id; return $this; } // -------------------------------------------------------------------------- /** * Sets custom base href * @param string href * @return Page */ public function set_base($href) { $this->base = $href; return $this; } // -------------------------------------------------------------------------- /** * Sets custom css tags * @param string $name * @param string $media * @return Page */ public function set_css_tag($name, $domain = TRUE, $media = "all") { $path = $this->CI->config->item('content_domain'); $css_file = $path . "/css/" . $name . ".css"; if ($domain == FALSE) $css_file = $name; $this->css_tags .= T1 . link_tag($name, "stylesheet", "text/css", "", $media) . NL; return $this; } // -------------------------------------------------------------------------- /** * Sets uncompressed js file in footer * @param string $name * @param bool $domain * @return Page */ public function set_foot_js_tag($name, $domain = TRUE) { $this->foot_js .= $this->script_tag($name, $domain); return $this; } // -------------------------------------------------------------------------- /** * Sets a custom tag in the header * @param string $tag * @return Page */ public function set_head_tag($tag) { $this->head_tags .= $tag . "\n"; return $this; } // -------------------------------------------------------------------------- /** * Sets custom page header * @param mixed $xhtml * @param bool $html5 * @param bool $fbml * @return $this */ public function build_header($xhtml = FALSE, $html5 = TRUE) { $data = array(); //Set Meta Tags $this->meta = ($html5 == TRUE) ? T1 . '' . NL . $this->meta : T1 . meta('content-type', 'text/html; charset=utf-8', 'equiv') . NL . $this->meta; $data['meta'] = $this->meta; //Set CSS if ($this->css != "") { $data['css'] = $this->css; } else { //Set default CSS group $this->set_css_group($this->CI->config->item('default_css_group')); $data['css'] = $this->css; } //Set head javascript if ($this->head_js != "") { $data['head_js'] = $this->head_js; } else { $this->set_head_js_group($this->CI->config->item('default_head_js_group')); $data['head_js'] = $this->head_js; } //Set Page Title $data['title'] = ($this->title != '') ? $this->title : $this->CI->config->item('default_title'); //Set Body Class $data['body_class'] = $this->body_class; //Set Body Id $data['body_id'] = $this->body_id; //Set Base HREF $data['base'] = $this->base; //Set individual head tags $data['head_tags'] = $this->head_tags; //Set Server Headers and Doctype $this->_headers($xhtml, $html5); //Output Header $this->CI->load->view('header', $data); flush(); return $this; } // -------------------------------------------------------------------------- /** * Builds common footer with any additional js */ public function build_footer() { $data = array(); $data['foot_js'] = ($this->foot_js != "") ? $this->foot_js : ''; $this->CI->load->view('footer', $data); } // -------------------------------------------------------------------------- /** * Script Tag * * Helper function for making script tags * * @param string $js * @param bool $domain * @return string */ private function script_tag($js, $domain = TRUE) { $path = $this->CI->config->item('content_domain'); $js_file = $path . "/js/" . $js . ".js"; if ($domain == FALSE) $js_file = $js; $tag = T1 . '' . NL; return $tag; } // -------------------------------------------------------------------------- /** * Quick Build * * A function to make building pages faster * @param mixed $view * @param mixed $data * @param bool $xhtml * @param bool $html5 */ public function quick_build($view, $data, $xhtml = TRUE, $html5 = TRUE) { //Set up header if ($title != '') { $this->set_title($title); } else { $this->set_title($this->CI->config->item('default_title')); } $this->build_header($xhtml, $html5); //Load view(s) if (is_array($view)) { foreach ($view as $v) { $this->CI->load->view($v, $data); } } else { $this->CI->load->view($view, $data); } //Create footer $this->build_footer(); } // -------------------------------------------------------------------------- /** * Num Queries * * Returns number of queries run on a page * * @return int */ public function num_queries() { return (isset($this->CI->db)) ? count($this->CI->db->queries) : 0; } // -------------------------------------------------------------------------- /** * Set Message * * Adds a message to the page * @param string $type * @param string $message * @return void */ public function set_message($type, $message) { $data['stat_class'] = $type; $data['message'] = $message; $this->CI->load->view('message', $data); } // -------------------------------------------------------------------------- /** * Redirect 303 * * Shortcut function for 303 redirect * @param string $url */ function redirect_303($url) { $this->CI->output->set_header("HTTP/1.1 303 See Other"); $this->CI->output->set_header("Location:" . $url); } }