Exists($page)) return $page; $pagedata = $this->GetPageData($page); $data = $pagedata['data']; $data['_page'] = $page; return $GLOBALS['templates'][$pagedata['template']]->GetTitle($data); } function GetPage($page) { if(!$this->Exists($page)) return array('title' => $page, 'content' => '{{The page \'' . $page . '\' does not exist.}}'); if(!$this->HasReadAccess($page)) return array('title' => $page, 'content' => '{{The page \'' . $page . '\' is protected.}}'); $pagedata = $this->GetPageData($page); $data = $pagedata['data']; $data['_page'] = $page; $ret = $GLOBALS['templates'][$pagedata['template']]->GetPage($data); return array('title' => $ret['title'], 'content' => $ret['content']); } function GetEditor($page, $backlink) { if(!$this->Exists($page)) return array('title' => $page, 'content' => '{{The page \'' . $page . '\' does not exist.}}'); if(!$this->HasWriteAccess($page)) return array('title' => $page, 'content' => '{{The page \'' . $page . '\' is protected.}}'); $pagedata = $this->GetPageData($page); $data = $pagedata['data']; $data['_page'] = $page; $data['_backlink'] = $backlink; $ret = $GLOBALS['templates'][$pagedata['template']]->GetEditor($data); return array('title' => $ret['title'], 'content' => $ret['content']); } function Exists($page) { if(array_key_exists($page, $GLOBALS['modules']->pages)) return true; $res = $GLOBALS['db']->Execute('SELECT id FROM pages WHERE name = ?', $page); return ($res->RecordCount() > 0); } function HasReadAccess($page) { if(!$this->Exists($page)) return false; if($GLOBALS['user']->IsAdmin()) return true; $gid = $GLOBALS['user']->gid; $access = $this->GetAccess($page); return ((hexdec($access[0][$gid/4]) & (1 << ($gid%4))) != 0); } function HasWriteAccess($page) { if(!$this->Exists($page)) return false; if($GLOBALS['user']->IsAdmin()) return true; $gid = $GLOBALS['user']->gid; $access = $this->GetAccess($page); return ((hexdec($access[1][$gid/4]) & (1 << ($gid%4))) != 0); } function GetPageData($page) { if(!$this->Exists($page)) return null; if(!array_key_exists($page, $this->pages)) { $res = $GLOBALS['db']->Execute('SELECT template, data FROM pages WHERE name = ?', $page); if($res->RecordCount()) { parse_str($res->fields[1], $data); $data = array_map('Unquote', $data); $this->pages[$page] = array('name' => $page, 'template' => $res->fields[0], 'access' => '', 'data' => $data); } else { $xmldata = $GLOBALS['xmlparser']->ParseFile($GLOBALS['modules']->GetPagePath($page)); if(!$xmldata) return null; $info = $GLOBALS['xmlparser']->FindTag($xmldata, 'info'); if(!$info) return null; $template = $GLOBALS['xmlparser']->FindTag($info, 'template'); if(!$template) return null; if(count($template['children']) != 1) return; if(!is_string($template['children'][0])) return; $template = $template['children'][0]; $access = $GLOBALS['xmlparser']->FindTag($info, 'access'); if(!$access) return null; if(count($access['children']) != 1) return; if(!is_string($access['children'][0])) return; $access = explode(':', $access['children'][0]); $rawdata = $GLOBALS['xmlparser']->FindTag($xmldata, 'data'); $data = array(); foreach($rawdata['children'] as $field) { if(!is_array($field)) continue; if(count($field['children']) != 1) continue; $data[$field['tag']] = $field['children'][0]; } $this->pages[$page] = array('name' => $page, 'template' => $template, 'access' => $access, 'data' => $data); } $res = $GLOBALS['db']->Execute('SELECT readaccess, writeaccess FROM privs WHERE name = ?', $page); if($res->RecordCount()) $this->pages[$page]['access'] = array($res->fields[0], $res->fields[1]); } return $this->pages[$page]; } function Add($name, $template) { if($this->Exists($name)) return false; $GLOBALS['db']->Execute('INSERT INTO pages (name, template, data) VALUES (?, ?, "")', array($name, $template)); return ($GLOBALS['db']->Affected_Rows() > 0); } function Edit($page, $data) { $string = ''; foreach($data as $key => $val) $string .= urlencode($key) . '=' . urlencode($val) . '&'; $res = $GLOBALS['db']->Execute('SELECT id FROM pages WHERE name = ?', $page); if($res->RecordCount()) { $GLOBALS['db']->Execute('UPDATE pages SET data = ? WHERE name = ?', array(substr($string, 0, -1), $page)); return true; } $pagedata = $this->GetPageData($page); $GLOBALS['db']->Execute('INSERT INTO privs (name, readaccess, writeaccess) VALUES (?, ?, ?)', array($page, $pagedata['access'][0], $pagedata['access'][1])); $GLOBALS['db']->Execute('INSERT INTO pages (name, template, data) VALUES (?, ?, ?)', array($page, $pagedata['template'], $string)); return ($GLOBALS['db']->Affected_Rows() > 0); } function Rename($page, $new_name) { if($this->Exists($new_name)) return false; if(!$this->Exists($page)) return false; $GLOBALS['db']->Execute('UPDATE privs SET name = ? WHERE name = ?', array($new_name, $page)); $GLOBALS['db']->Execute('UPDATE pages SET name = ? WHERE name = ?', array($new_name, $page)); return ($GLOBALS['db']->Affected_Rows() > 0); } function Copy($page, $new_name) { if($this->Exists($new_name)) return false; if(!$this->Exists($page)) return false; $pagedata = $this->GetPageData($page); $string = ''; foreach($pagedata['data'] as $key => $val) $string .= urlencode($key) . '=' . urlencode($val) . '&'; $GLOBALS['db']->Execute('INSERT INTO pages (name, template, data) VALUES (?, ?, ?)', array($new_name, $pagedata['template'], $string)); return ($GLOBALS['db']->Affected_Rows() > 0); } function Delete($page) { $GLOBALS['db']->Execute('DELETE FROM privs WHERE name = ?', $page); $GLOBALS['db']->Execute('DELETE FROM pages WHERE name = ?', $page); return ($GLOBALS['db']->Affected_Rows() > 0); } function GetList() { $res = $GLOBALS['db']->Execute('SELECT name FROM pages'); $pages = array(); while($row = $res->FetchRow()) $pages[$row[0]] = null; $pages = array_keys(array_merge($pages, $this->pages, $GLOBALS['modules']->pages)); sort($pages); return $pages; } function GetAccess($page) { $res = $GLOBALS['db']->Execute('SELECT readaccess, writeaccess FROM privs WHERE name = ?', $page); if($res->RecordCount()) return array($res->fields[0], $res->fields[1]); $pagedata = $this->GetPageData($page); return $pagedata['access']; } function SetAccess($page, $access) { $res = $GLOBALS['db']->Execute('SELECT id FROM privs WHERE name = ?', $page); if($res->RecordCount()) { $GLOBALS['db']->Execute('UPDATE privs SET readaccess = ?, writeaccess = ? WHERE name = ?', array($access[0], $access[1], $page)); return ($GLOBALS['db']->Affected_Rows() > 0); } $GLOBALS['db']->Execute('INSERT INTO privs (name, readaccess, writeaccess) VALUES (?, ?, ?)', array($page, $access[0], $access[1])); return ($GLOBALS['db']->Affected_Rows() > 0); } } $GLOBALS['pages'] = new Pages; ?>