DiogenesPage(); // break down PATH_INFO into site and location components $mypathinfo = $override_pathinfo ? $override_pathinfo : $_SERVER['PATH_INFO']; $this->pathinfo = $this->parsePathInfo($mypathinfo); if (!$this->pathinfo) $this->kill404("Invalid location specified!"); // Retrieve site-wide info from database $this->barrel = new Diogenes_Barrel($this->pathinfo['alias']); if (!$this->barrel->alias) $this->kill404("Unknown barrel requested : {$this->pathinfo['alias']}"); // Legacy $this->alias = $this->barrel->alias; $this->table_menu = $this->barrel->table_menu; // Build page head $this->makeHead(); // Check the requested page exists $tdir = $this->pathinfo['dir']; if ($tdir != 'admin') { if (!$this->pathinfo['PID'] = $this->barrel->getPID($tdir)) { $this->kill404("Unknown location specified '$tdir'!"); } } } /** Check the user has the right permissions. * Read the user's permissions for the current site from database. * * @param level the required permissions level */ function checkPerms($level) { global $globals; if ($level != "public") $_SESSION['session']->doAuth($this); $_SESSION['session']->setBarrelPerms($this->alias); if (!$_SESSION['session']->hasPerms($level)) $this->kill(__("You are not authorized to view this page!"), 403); } /** Read the contents for the current location. */ function doContent() { global $globals; // Retrieve information specific to the current page // enable directory index $file = $this->pathinfo['file'] ? $this->pathinfo['file'] : $globals->htmlfile; // read from Db if (!$bpage = Diogenes_Barrel_Page::fromDb($this->barrel, $this->pathinfo['PID'])) { $this->kill404("Directory not found : '{$this->pathinfo['dir']}' ({$this->pathinfo['PID']}) !"); } $this->curpage =& $bpage; // check the permissions for the current location if (!$this->pathinfo['file'] || $bpage->props['perms'] != 'public' || isset($_REQUEST['rev'])) { $this->startSession(); // handle login/logout requests if (isset($_REQUEST['dologout'])) $this->doLogout(); if (isset($_REQUEST['doauth'])) $this->checkPerms('auth'); $this->checkPerms($bpage->props['perms']); // can we edit this page? $this->canedit = $_SESSION['session']->hasPerms($bpage->props['wperms']); } // now we can display the page // check the location is valid if (!$this->barrel->spool->checkPath($bpage->props['PID'],$file,false)) $this->kill404("Malformed location!"); // check that the page is 'live' switch ($bpage->props['status']) { case 0: break; case 1: $this->assign('page_content', "

".__("This page is currently under construction.")."

"); $this->display(''); exit; default: $this->assign('page_content', "

".__("This page is currently unavailable.")."

"); $this->display(''); exit; } // if necessary, do a checkout if (isset($_REQUEST['rev'])) { $rcs = $this->getRcs(); $path = $rcs->checkout($bpage->props['PID'],$file,$_REQUEST['rev'],System::mktemp("-d")); } else { $path = $this->barrel->spool->spoolPath($bpage->props['PID'],$file); } if (!is_file($path)) $this->kill404("File not found : $path!"); if (!$this->pathinfo['file']) { // this is a page, display it within header/footer framework $this->doPage($path, $bpage); } else { // otherwise, we send back the raw file $type = get_mime_type($path); if (is_mime_multipart($type)) { $boundary = get_mime_boundary($path); if ($boundary) $type = "$type; boundary=\"$boundary\""; } header("Content-Type:$type"); header("Content-Length:".filesize($path)); header("Last-modified:".gmdate("D, d M Y H:i:s T", filemtime($path))); readfile($path); } } /** Display a page within the header/footer framework. * * @param path the path of the file * @param bpage a Diogenes_Barrel_Page representing the current page */ function doPage($path, $bpage) { global $globals; $this->assign('page',stripslashes($bpage->props['title'])); // load plugins $this->barrel->readPlugins(); $active_plugins = $this->barrel->loadPlugins($bpage); // search for rendering pluging $render_plugin = ''; foreach ($active_plugins as $plugname => $plugobj) { if (is_object($plugobj) && ($plugobj->type == "render")) { $render_plugin = $plugobj; } } // source page or pass it to a rendering plugin if (is_object($render_plugin)) { $content = $render_plugin->render($path); } else { $content = file_get_contents($path); } // apply plugin filtering foreach ($active_plugins as $plugname => $plugobj) { if (is_object($plugobj) && ($plugobj->type == "filter")) { $content = $plugobj->filter($content); } } $this->assign('page_content', $content); parent::display('', $this->getTemplate($bpage->props['template'])); } /** Return an RCS handle. */ function getRcs() { global $globals; return new $globals->rcs($this,$this->alias,$_SESSION['session']->username); } /** Returns the master template for the current context. * * @param template */ function getTemplate($template = '') { if ($template) { // we have a page-specific template, get its full path $tpl = $this->templatePath($template); } else if ($this->barrel->options->template) { // we have default site template, get is full path $tpl = $this->templatePath($this->barrel->options->template); } else { // fall back on the system-wide default template $tpl = parent::getTemplate(); } return $tpl; } /** Returns the available master templates. */ function getTemplates() { // the system-wide templates $templates = parent::getTemplates(); $bbarrel =& $this->barrel; // lookup templates in the template directory if ($bbarrel->hasFlag('tpl') && $bbarrel->options->template_dir) { $dir = $bbarrel->spool->spoolPath($bbarrel->options->template_dir); $files = System::find($dir.' -maxdepth 1 -name *.tpl'); foreach ($files as $file) $templates["barrel:".basename($file)] = "[barrel] ".basename($file); } return $templates; } /** Is the user an administrator for the current barrel ? */ function isAdmin() { return isset($_SESSION['session']) && $_SESSION['session']->hasPerms('admin'); } /** Build the page's "head" tag. */ function makeHead() { global $globals; $bbarrel =& $this->barrel; // site name $this->assign('site', stripslashes($bbarrel->options->title)); // meta array_push($this->head, ''); array_push($this->head, ''); // stylesheets $this->sheets = array(); array_push($this->sheets, $this->url("common.css")); if ($bbarrel->options->menu_style == 1 || $bbarrel->options->menu_style == 2) array_push($this->sheets, $this->url("phplayersmenu/{$bbarrel->options->menu_theme}/style.css")); array_push($this->sheets, $this->urlSite("", $globals->cssfile)); // add stylesheets to head foreach ($this->sheets as $mysheet) { array_push($this->head, ''); } // favicon if ($bbarrel->options->favicon) array_push($this->head, 'options->favicon).'" type="image/png" />'); } /** Build the barrel's menu. */ function makeMenu() { global $globals; $bbarrel =& $this->barrel; // menu style & theme $this->assign('menustyle', $bbarrel->options->menu_style); $this->assign('menutheme', $bbarrel->options->menu_theme); $PID = $this->curpage->props['PID']; // build the Diogenes part of the menu if (!$bbarrel->options->menu_hide_diogenes) { array_push($this->menu,array(0,__("Home"),$this->urlSite(""), 1)); if ($this->isLogged()) { array_push($this->menu, array(1,__("Logout"), "?dologout=1") ); array_push($this->menu, array(1,__("Preferences"), $this->urlSite("admin", "prefs"))); } else { array_push($this->menu, array(1,__("Login"), "?doauth=1") ); } if ($this->isAdmin()) { array_push($this->menu, array(1, __("Administration"), $this->urlSite("admin"))); if ($PID) array_push($this->menu, array(1, __("Page properties"), $this->urlSite("admin", "pages?dir=$PID"))); } elseif ($this->canedit && $PID) { array_push($this->menu, array(0, __("Edit this page"), "", 1)); array_push($this->menu, array(1, __("Raw editor"), $this->urlSite("admin", "edit?dir=$PID&file={$globals->htmlfile}"))); array_push($this->menu, array(1, __("HTML editor"), $this->urlSite("admin" , "compose?dir=$PID&file={$globals->htmlfile}"))); } } // if this is an error page, we need to bail out here if (!isset($this->table_menu)) return; // all menu entries from database $mcache = $this->menuRead(); // try to figure out the current MID from the current PID // and build filiation $filiation = array(); foreach ($mcache as $mid => $mentry) { if ($mentry['pid'] == $PID) $filiation = $this->menuToRoot($mcache, $mid, $filiation); } // add the user-defined part of the menu $this->menu = array_merge($this->menu,$this->menuRecurse($mcache,0,$filiation,0)); } /** Return the filiation to get to the root element. * * @param mcache * @param MID * @param path */ function menuToRoot($mcache, $MID, $path) { /* add ourself to the path */ array_push($path,$MID); if ($MID) { /* recursion */ return $this->menuToRoot($mcache, $mcache[$MID]['parent'], $path); } else { /* termination */ return $path; } } /** Recursively add menu entries * * @param mcache * @param MIDpere * @param filiation * @param level */ function menuRecurse($mcache, $MIDpere, $filiation, $level) { // the produced output $out = array(); foreach ($mcache[$MIDpere]['children'] as $mid) { $mentry = $mcache[$mid]; // echo "pid : $pid, location : $location
"; $entry = htmlentities(stripslashes($mentry['title']), ENT_QUOTES); if ($mentry['pid']) { $link = $this->urlSite($this->barrel->getLocation($mentry['pid'])); } else { $link = $mentry['link']; } // decide whether this menu should be expanded $expanded = ($this->barrel->options->menu_min_level == 0) || ($level+1 < $this->barrel->options->menu_min_level) || in_array($mid, $filiation); array_push($out, array($level, $entry, $link, $expanded)); $out = array_merge($out, $this->menuRecurse($mcache, $mid, $filiation, $level+1)); } return $out; } /** Read this barrel's menu entries from database. */ function menuRead() { $menu = array(); $res = $this->dbh->query("select MID,MIDpere,title,link,PID from {$this->table_menu} order by ordre"); while (list($mid, $parent, $title, $link, $pid) = mysql_fetch_row($res)) { $menu[$mid]['parent'] = $parent; $menu[$mid]['title'] = $title; $menu[$mid]['link'] = $link; $menu[$mid]['title'] = $title; $menu[$mid]['pid'] = $pid; if (!is_array($menu[$mid]['children'])) $menu[$mid]['children'] = array(); // register this entry with its parent if (!is_array($menu[$parent]['children'])) $menu[$parent]['children'] = array(); array_push($menu[$parent]['children'], $mid); } mysql_free_result($res); return $menu; } /** * Break down a PATH_INFO into site, page id and file * Directories *must* be accessed with a final slash. * * @param path the path to parse */ function parsePathInfo($path) { if (empty($path) || !preg_match("/^\/([^\/]+)\/((.+)\/)?([^\/]*)$/",$path,$asplit)) return false; $split['alias'] = $asplit[1]; $split['dir'] = isset($asplit[3]) ? $asplit[3] : ""; $split['file'] = isset($asplit[4]) ? $asplit[4] : ""; return $split; } /** Return the current URI. */ function script_uri() { if ($this->barrel->vhost) return preg_replace("/^(.*)\/site(\.php)?\/{$this->alias}\/(.*)/", "/\$3",$_SERVER['REQUEST_URI']); else return $_SERVER['REQUEST_URI']; } /** Returns the path to a given template. */ function templatePath($template) { global $globals; $bits = split(":", $template); switch ($bits[0]) { case "global": $path = $globals->template_dir."/". $bits[1]; break; case "barrel": $path = $this->barrel->spool->spoolPath($this->barrel->options->template_dir, $bits[1]); break; default: $path = parent::templatePath($template); } return $path; } /** Returns the URL to one of the barrel's pages relative to * the current location. * * @param dir * @param file */ function urlSite($dir, $file = '') { global $page; $tosite = strlen($this->pathinfo['dir']) ? str_repeat("../",1+substr_count($this->pathinfo['dir'],"/")) : ''; $url = $tosite . (strlen($dir) ? "$dir/" : "") . $file; return strlen($url) ? $url : "./"; } } ?>