array(), self::JS_PRIORITY_NORMAL => array(), self::JS_PRIORITY_LOW => array(), ); private $external_javascript = array(); private $external_stylesheet = array(); protected $page_header = false; // Have we printed a page header? // Startup activity public function __construct() { } // Shutdown activity public function __destruct() { // If we printed a header, automatically print a footer if ($this->page_header) { $this->pageFooter(); } } // Make a list of external Javascript, so we can render them in the footer public function addExternalJavascript($script_name) { $this->external_javascript[$script_name]=true; return $this; } // Make a list of external stylesheets, so we can render them in the header public function addExternalStylesheet($stylesheet, $attributes=array()) { $this->external_stylesheet[$stylesheet]=$attributes; return $this; } // Make a list of inline Javascript, so we can render them in the footer // NOTE: there is no need to use "jQuery(document).ready(function(){...})", etc. // as this Javascript won’t be inserted until the very end of the page. public function addInlineJavascript($script, $priority=self::JS_PRIORITY_NORMAL) { if (WT_DEBUG) { /* Show where the JS was added */ $backtrace=debug_backtrace(); $script='/* '.$backtrace[0]['file'].':'.$backtrace[0]['line'].' */'.PHP_EOL.$script; } $tmp=&$this->inline_javascript[$priority]; $tmp[]=$script; return $this; } // We've collected up Javascript fragments while rendering the page. // Now display them. public function getJavascript() { // Modernizr.load() doesn't seem to work well with AJAX responses. // Temporarily disable this while we investigate $TMP_HTML=''; $TMP_JS=''; $html=''; // Insert the high priority scripts before external resources if ($this->inline_javascript[self::JS_PRIORITY_HIGH]) { $html.=PHP_EOL.''; $this->inline_javascript[self::JS_PRIORITY_HIGH] = array(); } // Load external libraries asynchronously $load_js=array(); foreach (array_keys($this->external_javascript) as $script_name) { $load_js[]='"'.$script_name.'"'; $TMP_HTML.=''; } $load_js='[' . implode(',', $load_js) . ']'; // Process the scripts, in priority order, after the libraries have loaded $complete_js=''; if ($this->inline_javascript) { foreach ($this->inline_javascript as $scripts) { foreach ($scripts as $script) { $complete_js.=$script; } } } // We could, in theory, inject JS at any point in the page (not just the bottom) - prepare for next time $this->inline_javascript=array( self::JS_PRIORITY_HIGH =>array(), self::JS_PRIORITY_NORMAL=>array(), self::JS_PRIORITY_LOW =>array(), ); $this->external_javascript=array(); return '' . $TMP_HTML . ''; return $html . ''; } // Print the page header, using the theme public function pageHeader() { // Once we've displayed the header, we should no longer write session data. Zend_Session::writeClose(); // We've displayed the header - display the footer automatically $this->page_header=true; return $this; } // Print the page footer, using the theme protected function pageFooter() { if (WT_DEBUG_SQL) { echo WT_DB::getQueryLog(); } echo $this->getJavascript(); } }