. */ namespace Fisharebest\Webtrees\Controller; use Fisharebest\Webtrees\Tree; /** * Base controller for all other controllers */ class BaseController { // The controller accumulates Javascript (inline and external), and renders it in the footer const JS_PRIORITY_HIGH = 0; const JS_PRIORITY_NORMAL = 1; const JS_PRIORITY_LOW = 2; /** @var string[][] Inline JavaScript to add to the page. */ private $inline_javascript = [ self::JS_PRIORITY_HIGH => [], self::JS_PRIORITY_NORMAL => [], self::JS_PRIORITY_LOW => [], ]; /** @var string[] Exteral JavaScript files to load. */ private $external_javascript = []; /** @var Tree Create a page for which tree */ private $tree; /** * Startup activity */ public function __construct() { global $WT_TREE; $this->tree = $WT_TREE; } /** * Create a page for this tree. * * @return Tree */ public function tree() { return $this->tree; } /** * Make a list of external Javascript, so we can render them in the footer * * @param string $script_name * * @return $this */ public function addExternalJavascript($script_name) { $this->external_javascript[$script_name] = true; return $this; } /** * Make a list of inline Javascript, so we can render them in the footer * NOTE: there is no need to use "$(document).ready(function(){...})", etc. * as this Javascript won’t be inserted until the very end of the page. * * @param string $script * @param int $priority * * @return $this */ public function addInlineJavascript($script, $priority = self::JS_PRIORITY_NORMAL) { $tmp = &$this->inline_javascript[$priority]; $tmp[] = $script; return $this; } /** * We've collected up Javascript fragments while rendering the page. * Now display them in order. * * @return string */ public function getJavascript() { $javascript1 = ''; $javascript2 = ''; $javascript3 = ''; // Inline (high priority) javascript foreach ($this->inline_javascript[self::JS_PRIORITY_HIGH] as $script) { $javascript1 .= $script; } // External javascript foreach (array_keys($this->external_javascript) as $script_name) { $javascript2 .= ''; } // Inline (lower priority) javascript foreach ($this->inline_javascript as $priority => $scripts) { if ($priority !== self::JS_PRIORITY_HIGH) { foreach ($scripts as $script) { $javascript3 .= $script; } } } // We could, in theory, inject JS at any point in the page (not just the bottom) - prepare for next time $this->inline_javascript = [ self::JS_PRIORITY_HIGH => [], self::JS_PRIORITY_NORMAL => [], self::JS_PRIORITY_LOW => [], ]; $this->external_javascript = []; return '' . $javascript2 . ''; } /** * Print the page header, using the theme * * @return $this */ public function pageHeader() { // We've displayed the header - display the footer automatically register_shutdown_function([$this, 'pageFooter']); return $this; } /** * Print the page footer, using the theme */ public function pageFooter() { echo $this->getJavascript(); } }