summaryrefslogtreecommitdiffstats
path: root/code/pages.inc.php
diff options
context:
space:
mode:
Diffstat (limited to 'code/pages.inc.php')
-rw-r--r--code/pages.inc.php254
1 files changed, 174 insertions, 80 deletions
diff --git a/code/pages.inc.php b/code/pages.inc.php
index 7bdd907..c121d2f 100644
--- a/code/pages.inc.php
+++ b/code/pages.inc.php
@@ -2,142 +2,236 @@
require_once('code/db.inc.php');
require_once('code/user.inc.php');
require_once('code/templates.inc.php');
+ require_once('code/xmlparser.inc.php');
+ require_once('code/modules.inc.php');
class Pages {
- function Get($page, $type = null, $extra = null) {
+ var $pages = array();
+
+ function Pages($dirs = array('pages')) {
+ $dir = opendir(join('/', $dirs));
+
+ while($file = readdir($dir)) {
+ if($file[0] == '.') continue;
+
+ if(is_dir(join('/', $dirs) . '/' . $file))
+ $this->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($type) $res = $GLOBALS['db']->Execute('SELECT id, name, type, template, data FROM pages WHERE name = ? AND type = ?', array($page, $type));
- else $res = $GLOBALS['db']->Execute('SELECT id, name, type, template, data FROM pages WHERE id = ?', $page);
-
if(!$this->HasAccess($page, $type))
- return array('title' => $res->fields[1],
- 'content' => ErrorMessage('Forbidden', array('page' => $res->fields[1])));
+ return array('title' => $page,
+ 'content' => ErrorMessage('Forbidden', array('page' => $page)));
- $data = null;
- parse_str($res->fields[4], $data);
- $data = array_map('Unquote', $data);
+ $pagedata = $this->GetPageData($page, $type);
+
+ $data = $pagedata['data'];
if($extra) $data = array_merge($data, $extra);
- $data['_id'] = $res->fields[0];
- $data['_page'] = $res->fields[1];
- $data['_type'] = $res->fields[2];
+ $data['_page'] = $page;
+ $data['_type'] = $type;
- return $GLOBALS['templates'][$res->fields[3]]->Get($data);
+ return $GLOBALS['templates'][$pagedata['template']]->Get($data);
}
- function GetEditor($page, $type = null) {
+ function GetEditor($page, $type) {
if(!$this->Exists($page, $type))
return array('title' => $page,
'content' => ErrorMessage('PageNotFound', array('page' => $page)));
- if($type) $res = $GLOBALS['db']->Execute('SELECT id, name, type, template, data FROM pages WHERE name = ? AND type = ?', array($page, $type));
- else $res = $GLOBALS['db']->Execute('SELECT id, name, type, template, data FROM pages WHERE id = ?', $page);
-
if(!$GLOBALS['user']->IsAdmin())
- return array('title' => $res->fields[1],
- 'content' => ErrorMessage('Forbidden', array('page' => $res->fields[1])));
+ return array('title' => $page,
+ 'content' => ErrorMessage('Forbidden', array('page' => $page)));
- parse_str($res->fields[4], $data = null);
- $data = array_map('Unquote', $data);
- $data['_id'] = $res->fields[0];
- $data['_page'] = $res->fields[1];
- $data['_type'] = $res->fields[2];
+ $pagedata = $this->GetPageData($page, $type);
- return $this->Get($res->fields[3], 'e', array('_data' => $data));
- }
-
- function GetName($id) {
- $res = $GLOBALS['db']->Execute('SELECT name FROM pages WHERE id = ?', $id);
+ $data = $pagedata['data'];
+ $data['_page'] = $page;
+ $data['_type'] = $type;
- return $res->fields[0];
+ return $this->Get($pagedata['template'], 'e', array('_data' => $data));
}
- function GetType($id) {
- $res = $GLOBALS['db']->Execute('SELECT type FROM pages WHERE id = ?', $id);
+ function Exists($page, $type) {
+ if(array_key_exists($page . '.' . $type, $this->pages))
+ return true;
- return $res->fields[0];
- }
-
- function Exists($page, $type = null) {
- if($type) $res = $GLOBALS['db']->Execute('SELECT id FROM pages WHERE name = ? AND type = ?', array($page, $type));
- else $res = $GLOBALS['db']->Execute('SELECT id FROM pages WHERE id = ?', $page);
+ 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 = null) {
+ function HasAccess($page, $type) {
+ if($GLOBALS['user']->IsAdmin()) return $this->Exists($page, $type);
+
$gid = $GLOBALS['user']->gid;
- if($type) $res = $GLOBALS['db']->Execute('SELECT access FROM pages WHERE name = ? AND type = ?', array($page, $type));
- else $res = $GLOBALS['db']->Execute('SELECT access FROM pages WHERE id = ?', $page);
- if(!$res->RecordCount()) return false;
- return ($GLOBALS['user']->IsAdmin() || (ord($res->fields[0][$gid/8]) & (1 << ($gid%8))) != 0);
+ $pagedata = $this->GetPageData($page, $type);
+
+ if(!$pagedata)
+ return false;
+
+ return ((hexdec(substr($pagedata['access'], ($gid/8)*2, 2)) & (1 << ($gid%8))) != 0);
}
- function Add($name, $template, $type) {
- if($this->Exists($name, $type)) return 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);
+ }
+ }
- $GLOBALS['db']->Execute('INSERT INTO pages (name, template, access, data, type) VALUES (?, ?, 0, "", ?)',
- array($name, $templates, $type));
+ 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']->Insert_ID();
+ return ($GLOBALS['db']->Affected_Rows() > 0);
}
- function Edit($page, $data, $type = null) {
+ function Edit($page, $type, $data) {
$string = '';
foreach($data as $key => $val)
$string .= urlencode($key) . '=' . urlencode($val) . '&';
- if($type) $GLOBALS['db']->Execute('UPDATE pages SET data = ? WHERE name = ? AND type = ?',
- array(substr($string, 0, -1), $page, $type));
- else $GLOBALS['db']->Execute('UPDATE pages SET data = ? WHERE id = ?',
- array(substr($string, 0, -1), $page));
+ $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, $new_name, $type = null) {
- if($type) {
- if($this->Exists($new_name, $type)) return;
+ 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));
- }
- else {
- if($this->Exists($new_name, $this->GetType($type))) return;
-
- $GLOBALS['db']->Execute('UPDATE pages SET name = ? WHERE id = ?', array($new_name, $page));
- }
+ $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, $new_name, $type = null) {
- if($type) {
- if($this->Exists($new_name, $type)) return 0;
-
- $res = $GLOBALS['db']->Execute('SELECT * FROM pages WHERE name = ? AND type = ?', array($page, $type));
- }
- else {
- if($this->Exists($new_name, $this->GetType($type))) return 0;
-
- $res = $GLOBALS['db']->Execute('SELECT template, data, type FROM pages WHERE id = ?', $page);
- }
+ function Copy($page, $type, $new_name) {
+ if($this->Exists($new_name, $type)) return false;
+ if(!$this->Exists($page, $type)) return false;
- $GLOBALS['db']->Execute('INSERT INTO pages (name, template, access, data, type) VALUES (?, ?, 0, ?, ?)',
- array($new_name, $res->fields[0], $res->fields[1], $res->fields[2]));
+ $pagedata = $this->GetPageData($page, $type);
- return $GLOBALS['db']->Insert_ID();
+ $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 = null) {
- if($type) $GLOBALS['db']->Execute('DELETE FROM pages WHERE name = ? AND type = ?', array($page, $type));
- else $GLOBALS['db']->Execute('DELETE FROM pages WHERE id = ?', $page);
+ 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;