*/ require_once(KT_LIB_DIR . "/templating/templating.inc.php"); require_once(KT_LIB_DIR . "/session/control.inc"); class KTPage { /** resources are "filename"->1 to allow subcomponents to require items. */ var $js_resources = Array(); var $css_resources = Array(); var $js_standalone = Array(); var $css_standalone = Array(); /** context-relevant information */ var $errStack = Array(); var $infoStack = Array(); var $portlets = Array(); var $show_portlets = true; /** miscellaneous items */ var $title = ''; var $systemName = 'KnowledgeTree'; var $systemURL = 'http://ktdms.com/'; var $breadcrumbs = false; var $breadcrumbDetails = false; var $breadcrumbSection = false; var $menu = null; var $userMenu = null; /** the "component". Used to set the page header (see documentation for explanation). */ var $componentLabel = 'Browse Collections'; var $componentClass = 'browse_collections'; /** $contents is the center of the page. In KT < 3, this was CentralPayload. */ var $contents = ''; var $template = "kt3/standard_page"; /* further initialisation */ function KTPage() { /* default css files initialisation */ $aCSS = Array( "resources/css/kt-framing.css", "resources/css/kt-contenttypes.css", "resources/css/kt-headings.css" ); $this->requireCSSResources($aCSS); /* default js files initialisation */ $aJS = Array(); $this->requireJSResources($aJS); /* menu initialisation*/ // FIXME: how do we want to handle the menu? $this->initMenu(); /* portlet initialisation */ $this->show_portlets = true; /* breadcrumbs */ } // initiliase the menu. function initMenu() { // FIXME: we lost the getDefaultAction stuff - do we care? // note that key == action. this is _important_, since we crossmatch the breadcrumbs against this for "active" $this->menu = array( "dashboard" => $this->_actionHelper(array("name" => _("Dashboard"), "action" => "dashboard", "active" => 0)), "browse" => $this->_actionHelper(array("name" => _("Browse Collections"), "action" => "browse", "active" => 0)), "administration" => $this->_actionHelper(array("name" => _("DMS Administration"), "action" => "administration", "active" => 0)), ); $this->userMenu = array( "preferences" => $this->_actionHelper(array("name" => _("Preferences"), "action" => "preferences", "active" => 0)), "logout" => $this->_actionHelper(array("name" => _("Logout"), "action" => "logout", "active" => 0)), ); } function setTitle($sTitle) { $this->title = $sTitle; } /* javascript handling */ // require that the specified JS file is referenced. function requireJSResource($sResourceURL) { $this->js_resources[$sResourceURL] = 1; // use the keys to prevent multiple copies. } // require that the specified JS files are referenced. function requireJSResources($aResourceURLs) { foreach ($aResourceURLs as $sResourceURL) { $this->js_resources[$sResourceURL] = 1; } } // list the distinct js resources. function getJSResources() { return array_keys($this->js_resources); } function requireJSStandalone($sJavascript) { $this->js_standalone[$sJavascript] = 1; // use the keys to prevent multiple copies. } // list the distinct js resources. function getJSStandalone() { return array_keys($this->js_standalone); } /* css handling */ // require that the specified CSS file is referenced. function requireCSSResource($sResourceURL) { $this->css_resources[$sResourceURL] = 1; // use the keys to prevent multiple copies. } // require that the specified CSS files are referenced. function requireCSSResources($aResourceURLs) { foreach ($aResourceURLs as $sResourceURL) { $this->css_resources[$sResourceURL] = 1; } } // list the distinct CSS resources. function getCSSResources() { return array_keys($this->css_resources); } function requireCSSStandalone($sCSS) { $this->css_standalone[$sCSS] = 1; } function getCSSStandalone() { return array_keys($this->css_standalone); } function setPageContents($contents) { $this->contents = $contents; } function setShowPortlets($bShow) { $this->show_portlets = $bShow; } /* set the breadcrumbs. the first item is the area name. the rest are breadcrumbs. */ function setBreadcrumbs($aBreadcrumbs) { $breadLength = count($aBreadcrumbs); if ($breadLength != 0) { $this->breadcrumbSection = $this->_actionhelper($aBreadcrumbs[0]); // handle the menu if (($aBreadcrumbs[0]["action"]) && ($this->menu[$aBreadcrumbs[0]["action"]])) { $this->menu[$aBreadcrumbs[0]["action"]]["active"] = 1; } } if ($breadLength > 1) { $this->breadcrumbs = array_map(array(&$this, "_actionhelper"), array_slice($aBreadcrumbs, 1)); } } function setBreadcrumbDetails($sBreadcrumbDetails) { $this->breadcrumbDetails = $sBreadcrumbDetails; } function setUser($oUser) { $this->user = $oUser; } // FIXME refactor setSection to be generic, not an if-else. // assume this is admin for now. function setSection($sSection) { if ($sSection == 'administration') { $this->componentLabel = _('DMS Administration'); $this->componentClass = 'administration'; } else if ($sSection == 'dashboard') { $this->componentLabel = _('Dashboard'); $this->componentClass = 'dashboard'; } else if ($sSection == 'browse') { $this->componentLabel = _('Browse Documents'); $this->componentClass = 'browse_collections'; } else if ($sSection == 'view_details') { $this->componentLabel = _('Document Details'); $this->componentClass = 'document_details'; } else if ($sSection == 'search') { $this->componentLabel = _('Search'); $this->componentClass = 'search'; } else if ($sSection == 'preferences') { $this->componentLabel = _('Preferences'); $this->componentClass = 'preferences'; } else { $this->componentLabel = _('Dashboard'); $this->componentClass = 'dashboard'; } } function addError($sError) { array_push($this->errStack, $sError); } function addInfo($sInfo) { array_push($this->infoStack, $sInfo); } /** no-one cares what a portlet is, but it should be renderable, and have its ->title member set. */ function addPortlet($oPortlet) { array_push($this->portlets, $oPortlet); } /* LEGACY */ var $deprecationWarning = "Legacy UI API: "; function setCentralPayload($sCentral) { $this->contents = $sCentral; $this->addError($this->deprecationWarning . "called setCentralPayload"); } function setOnloadJavascript($appendix) { $this->addError($this->deprecationWarning . "called setOnloadJavascript (no-act)"); } function setDHtmlScrolling($appendix) { $this->addError($this->deprecationWarning . "called setDHTMLScrolling (no-act)"); } function setFormAction($appendix) { $this->addError($this->deprecationWarning . "called setFormAction (no-act)"); } function setSubmitMethod($appendix) { $this->addError($this->deprecationWarning . "called setSubmitMethod (no-act)"); } function setHasRequiredFields($appendix) { $this->addError($this->deprecationWarning . "called setHasRequiredFields (no-act)"); } function setAdditionalJavascript($appendix) { $this->addError($this->deprecationWarning . "called setAdditionalJavascript (no-act)"); } /* final render call. */ function render() { if (empty($this->contents)) { $this->contents = ""; } if (is_string($this->contents) && (trim($this->contents) === "")) { $this->addError(_("This page did not produce any content")); $this->contents = ""; } if (!is_string($this->contents)) { $this->contents = $this->contents->render(); } // if we have no portlets, make the ui a tad nicer. if (empty($this->portlets)) { $this->show_portlets = false; } $oTemplating = new KTTemplating; $oTemplate = $oTemplating->loadTemplate($this->template); $aTemplateData = array( "page" => $this, ); // unlike the rest of KT, we use echo here. echo $oTemplate->render($aTemplateData); } /** heler functions */ // returns an array ("url", "label") function _actionhelper($aActionTuple) { $aTuple = Array("label" => $aActionTuple["name"]); if ($aActionTuple["action"]) { $aTuple["url"] = generateControllerLink($aActionTuple["action"], $aActionTuple["query"]); } else if ($aActionTuple["url"]) { $aTuple["url"] = $aActionTuple["url"]; } else { $aTuple["url"] = false; } return $aTuple; } } /* set $main - this is used by the rest of the system. */ $GLOBALS['main'] =& new KTPage(); ?>