Pages(array_merge($dirs, array($file))); elseif(is_file(join('/', $dirs) . '/' . $file)) { switch(substr($file, -6)) { case '.c.xml': case '.e.xml': case '.n.xml': if(count($dirs) > 1) $this->pages[join(array_merge(array_slice($dirs, 1), array(substr($file, 0, -4))), ':')] = array(); else $this->pages[substr($file, 0, -4)] = array(); } } } closedir($dir); } function Get($page, $type, $extra = null) { if(!$this->Exists($page, $type)) return array('title' => $page, 'content' => ErrorMessage('PageNotFound', array('page' => $page))); if(!$this->HasAccess($page, $type)) return array('title' => $page, 'content' => ErrorMessage('Forbidden', array('page' => $page))); $pagedata = $this->GetPageData($page, $type); $data = $pagedata['data']; if($extra) $data = array_merge($data, $extra); $data['_page'] = $page; $data['_type'] = $type; return $GLOBALS['templates'][$pagedata['template']]->Get($data); } function GetEditor($page, $type) { if(!$this->Exists($page, $type)) return array('title' => $page, 'content' => ErrorMessage('PageNotFound', array('page' => $page))); if(!$GLOBALS['user']->IsAdmin()) return array('title' => $page, 'content' => ErrorMessage('Forbidden', array('page' => $page))); $pagedata = $this->GetPageData($page, $type); $data = $pagedata['data']; $data['_page'] = $page; $data['_type'] = $type; return $this->Get($pagedata['template'], 'e', array('_data' => $data)); } function Exists($page, $type) { if(array_key_exists($page . '.' . $type, $this->pages)) return true; if(array_key_exists($page . '.' . $type, $GLOBALS['modules']->pages)) return true; $res = $GLOBALS['db']->Execute('SELECT id FROM pages WHERE name = ? AND type = ?', array($page, $type)); return ($res->RecordCount() > 0); } function HasAccess($page, $type) { if($GLOBALS['user']->IsAdmin()) return $this->Exists($page, $type); $gid = $GLOBALS['user']->gid; $pagedata = $this->GetPageData($page, $type); if(!$pagedata) return false; return ((hexdec(substr($pagedata['access'], ($gid/8)*2, 2)) & (1 << ($gid%8))) != 0); } function GetPageData($page, $type) { if(!$this->Exists($page, $type)) return null; if(!count($this->pages[$page . '.' . $type])) { $res = $GLOBALS['db']->Execute('SELECT template, HEX(access), data FROM pages WHERE name = ? AND type = ?', array($page, $type)); if($res->RecordCount()) { parse_str($res->fields[2], $data); $data = array_map('Unquote', $data); $this->pages[$page . '.' . $type] = array('name' => $page, 'type' => $type, 'template' => $res->fields[0], 'access' => $res->fields[1], 'data' => $data); } else { $filename = $GLOBALS['modules']->pages[$page . '.' . $type]; if(!$filename) $filename = 'pages/' . strtr($page, array(':' => '/')) . '.' . $type . '.xml'; $xmldata = $GLOBALS['xmlparser']->ParseFile($filename); 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 = $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 . '.' . $type] = array('name' => $page, 'type' => $type, 'template' => $template, 'access' => $access, 'data' => $data); } } return $this->pages[$page . '.' . $type]; } function Add($name, $type, $template) { if($this->Exists($name, $type)) return false; $GLOBALS['db']->Execute('INSERT INTO pages (name, template, access, data, type) VALUES (?, ?, "", "", ?)', array($name, $template, $type)); return ($GLOBALS['db']->Affected_Rows() > 0); } function Edit($page, $type, $data) { $string = ''; foreach($data as $key => $val) $string .= urlencode($key) . '=' . urlencode($val) . '&'; $GLOBALS['db']->Execute('UPDATE pages SET data = ? WHERE name = ? AND type = ?', array(substr($string, 0, -1), $page, $type)); if($GLOBALS['db']->Affected_Rows()) return true; $pagedata = $this->GetPageData($page, $type); $string = ''; foreach($pagedata['data'] as $key => $val) $string .= urlencode($key) . '=' . urlencode($val) . '&'; $access = ''; for($i = 0; $i < strlen($pagedata['access']); $i+=2) $access .= chr(hexdec(substr($pagedata['access'], $i, 2))); $GLOBALS['db']->Execute('INSERT INTO pages (name, template, access, data, type) VALUES (?, ?, ?, ?, ?)', array($page, $pagedata['template'], $access, $string, $type)); return ($GLOBALS['db']->Affected_Rows() > 0); } function Rename($page, $type, $new_name) { if($this->Exists($new_name, $type)) return false; $GLOBALS['db']->Execute('UPDATE pages SET name = ? WHERE name = ? AND type = ?', array($new_name, $page, $type)); return ($GLOBALS['db']->Affected_Rows() > 0); } function Copy($page, $type, $new_name) { if($this->Exists($new_name, $type)) return false; if(!$this->Exists($page, $type)) return false; $pagedata = $this->GetPageData($page, $type); $string = ''; foreach($pagedata['data'] as $key => $val) $string .= urlencode($key) . '=' . urlencode($val) . '&'; $GLOBALS['db']->Execute('INSERT INTO pages (name, template, access, data, type) VALUES (?, ?, "", ?, ?)', array($new_name, $pagedata['template'], $string, $type)); return ($GLOBALS['db']->Affected_Rows() > 0); } function Delete($page, $type) { $GLOBALS['db']->Execute('DELETE FROM pages WHERE name = ? AND type = ?', array($page, $type)); return ($GLOBALS['db']->Affected_Rows() > 0); } function GetList() { $res = $GLOBALS['db']->Execute('SELECT name, type FROM pages'); $pages = array(); while($row = $res->FetchRow()) $pages[$row[0] . '.' . $row[1]] = null; $pages = array_keys(array_merge($pages, $this->pages, $GLOBALS['modules']->pages)); sort($pages); return $pages; } } $GLOBALS['pages'] = new Pages; ?>