diff --git a/about.php b/about.php
index cb39ec0..558cbbf 100644
--- a/about.php
+++ b/about.php
@@ -1,7 +1,28 @@
render('about.twig.html', []);
+
+echo $GLOBALS['twig']->render('head.twig.html',
+ ['theme' => $GLOBALS['theme'],
+ 'depth' => $depth,
+ 'title' =>$title]);
+
+echo $GLOBALS['twig']->render('index.twig.html',
+ ['animal'=> "cat"]);
+
+echo $GLOBALS['twig']->render('foot.twig.html',
+ ['theme' => $GLOBALS['theme'],
+ 'depth' => $depth]);
?>
diff --git a/admin/index.php b/admin/index.php
new file mode 100644
index 0000000..c32d03f
--- /dev/null
+++ b/admin/index.php
@@ -0,0 +1,29 @@
+render('head.twig.html',
+ ['theme' => $GLOBALS['theme'],
+ 'depth' => $depth,
+ 'title' =>$title]);
+
+
+echo $GLOBALS['twig']->render('admin_index.twig.html', []);
+
+echo $GLOBALS['twig']->render('foot.twig.html',
+ ['theme' => $GLOBALS['theme'],
+ 'depth' => $depth]);
+
+
+
+?>
diff --git a/admin/private/user_create.php b/admin/private/user_create.php
new file mode 100644
index 0000000..4a0f5f2
--- /dev/null
+++ b/admin/private/user_create.php
@@ -0,0 +1,44 @@
+Something went wrong.");
+}
+
+?>
diff --git a/composer.json b/composer.json
index 1698897..df2d1df 100644
--- a/composer.json
+++ b/composer.json
@@ -1,5 +1,6 @@
{ "require":
{
- "twig/twig": "1.*"
+ "twig/twig": "1.*",
+ "falseclock/dbd-php": "1.*"
}
}
diff --git a/config.php.sample b/config.php.sample
new file mode 100644
index 0000000..ea779f2
--- /dev/null
+++ b/config.php.sample
@@ -0,0 +1,14 @@
+
diff --git a/docs/database_spec.txt b/docs/database_spec.txt
index c862314..ccd9faa 100644
--- a/docs/database_spec.txt
+++ b/docs/database_spec.txt
@@ -2,10 +2,7 @@
DATABASE SPEC
===============================================================================
-We use `dbi4php` (/lib/ext/dbi4php/) for database access, so that we don't
-have to rely on a specific DB.
-
-Anything supported by DBI (MySQL, MS SQL, Oracles, PostgreSQL, ODBC, Interbase,
+Anything supported by DBO (MySQL, MS SQL, Oracles, PostgreSQL, ODBC, Interbase,
SQLite, IBM DB2) will work just fine.
The database name will be fetched from the "config.ini" file-- and a table
@@ -16,9 +13,11 @@ The tables used by Blagoblag are:
posts (title varchar(200), date datetime, author smallint,
text longtext)
- authors (id smallint primary key, username varchar(20),
- password_hash varchar(30), full_name varchar(50))
+ users (id smallint primary key, username varchar(20),
+ biography longtext, email varchar(50),
+ website varchar(50), password_hash varchar(80),
+ full_name varchar(50), login varchar(20))
comments (id smallint primary key, displayname varchar(20),
- text shorttext, date datetime)
+ text text, date datetime)
diff --git a/index.php b/index.php
index b464ade..84959d0 100644
--- a/index.php
+++ b/index.php
@@ -1,7 +1,33 @@
render('index.twig.html', ['animal' => 'cat girl']);
+// global variable declaration
+$users = user_ids();
+$user = array_map(user_data, $users);
+$posts = post_ids();
+$post = array_map(post_data, $posts);
+
+echo $GLOBALS['twig']->render('head.twig.html',
+ ['theme' => $GLOBALS['theme'],
+ 'depth' => $depth,
+ 'title' =>$title]);
+
+echo $GLOBALS['twig']->render('index.twig.html', []);
+
+
+echo $GLOBALS['twig']->render('foot.twig.html',
+ ['theme' => $GLOBALS['theme'],
+ 'depth' => $depth]);
?>
diff --git a/post.php b/post.php
index f7484bc..9d33964 100644
--- a/post.php
+++ b/post.php
@@ -1,7 +1,39 @@
render('post.twig.html', []);
+// -------------------------------------
+// post environment
+$post_id = $_GET['id'];
+$text = post_text($post_id);
+$author = post_author($post_id);
+$date = post_data($post_id);
+// -------------------------------------
+
+echo $GLOBALS['twig']->render('head.twig.html',
+ ['theme' => $GLOBALS['theme'],
+ 'depth' => $depth,
+ 'title' =>$title]);
+
+echo $GLOBALS['twig']->render('post.twig.html',
+ ['id'=> $post_id,
+ 'text' => $text,
+ 'author' => $author,
+ 'date' => $date]);
+
+
+echo $GLOBALS['twig']->render('foot.twig.html',
+ ['theme' => $GLOBALS['theme'],
+ 'depth' => $depth]);
?>
diff --git a/res/lib/array.php b/res/lib/array.php
new file mode 100644
index 0000000..4c1b091
--- /dev/null
+++ b/res/lib/array.php
@@ -0,0 +1,30 @@
+ STRING
+// Turn a 1D array into a comma-seperated string
+function comma_sep($array) {
+ global $stack;
+ $stack = "";
+
+ $comma_print = function($item) {
+ $GLOBALS['stack'] = $GLOBALS['stack']
+ . ", " . $item;
+ };
+
+ array_map($comma_print, $array);
+
+ $stack = preg_replace('/^, /', '', $stack);
+
+ return $stack;
+}
+
+?>
diff --git a/res/lib/db.php b/res/lib/db.php
new file mode 100644
index 0000000..5b580b7
--- /dev/null
+++ b/res/lib/db.php
@@ -0,0 +1,133 @@
+ ARRAY
+// Execute a DB command
+function db_cmd($query) {
+ $stmt = $GLOBALS['pdo']->query($query);
+ if (is_bool($stmt)) {
+ return $stmt;
+ } else {
+ return $stmt->fetch();
+ }
+}
+
+// -------------------------------------
+
+// STRING STRING --> ARRAY
+// Return all values of a specific column
+function db_get_columns($table, $column) {
+ return db_cmd("select " . $column . " from " . $table);
+}
+
+// STRING STRING VARYING --> ARRAY
+// Return all rows that have an 'identifier' column set to given value
+function db_get_rows($table, $identifier, $value) {
+ return db_cmd("select * from " . $table . " where " . $identifier .
+ " = " . $value . ";");
+}
+
+// STRING STRING VARYING STRING --> ARRAY
+// Return the value of a specific column in a given row, identified by an
+// 'identifier' column set to the given value
+function db_get_cell($table, $identifier, $value, $cell) {
+ return db_get_rows($table, $identifier, $value)[$cell];
+}
+
+// --------------------------------------
+
+// STRING STRING VARYING STRING VARYING --> NIL
+// Edit the value of a cell
+function db_set_cell($table, $identifier, $value, $cell, $new_value) {
+ if (is_string($value)) { $value = "'" . $value . "'"; }
+ if (is_string($new_value)) { $new_value = "'" . $new_value . "'"; }
+
+ return db_cmd("update " . $table
+ . " set " . $cell . " = " . $new_value
+ . " where " . $identifier . " = " . $value) . ";";
+}
+
+// -------------------------------------
+
+// STRING ARRAY ARRAY --> BOOLEAN
+// Create a table with given values to given columns.
+// First array is a list of columns (as would be provided to SQL), and the
+// second is the list of values (as would follow " values " in SQL)
+function db_insert_row($table, $variables, $values) {
+ $variables = comma_sep($variables);
+ $values = comma_sep(strings_wrap($values));
+
+
+ return db_cmd("insert into " . $table
+ . " (". $variables .")"
+ . " values ("
+ . $values . ")" . ";");
+}
+
+// -------------------------------------
+
+// STRING --> BOOLEAN
+// Return whether or not a table of given name exists
+function db_table_existant($table) {
+ if (!db_cmd("select * from information_schema.tables "
+ . " where table_name = " . string_wrap($table) . ";")) {
+ return false;
+ } else {
+ return true;
+ }
+}
+
+// STRING ARRAY --> BOOLEAN
+// Create a table of given name and columns (with array of column-strings)
+function db_create_table($table, $columns) {
+ return db_cmd("create table " . $table
+ . " (" . comma_sep($columns) . ");");
+}
+
+?>
diff --git a/res/lib/error.php b/res/lib/error.php
new file mode 100644
index 0000000..a039aff
--- /dev/null
+++ b/res/lib/error.php
@@ -0,0 +1,28 @@
+ NIL
+// Print out a general error, with $string as it's error-message.
+function general_error($string) {
+ echo $GLOBALS['twig']->render('error.twig.html',
+ ['error_message'=>$string]);
+ exit;
+}
+
+// STRING --> NIL
+// Print out an input error, with $string as it's error-message.
+function input_error($string) {
+ echo $GLOBALS['twig']->render('error.twig.html',
+ ['error_message'=>$string]);
+ exit;
+}
+
+?>
diff --git a/res/lib/load.php b/res/lib/load.php
index afdfccf..dd73af6 100644
--- a/res/lib/load.php
+++ b/res/lib/load.php
@@ -1,4 +1,13 @@
PATH
// Take a path from root and turn it into a relative path.
@@ -8,8 +17,16 @@ function root($path) {
// -------------------------------------
+include(root("config.php"));
require_once root("vendor/autoload.php");
+include(root("res/lib/string.php"));
+include(root("res/lib/array.php"));
+include(root("res/lib/user.php"));
+include(root("res/lib/post.php"));
+include(root("res/lib/comment.php"));
+include(root("res/lib/db.php"));
+
$loader= new Twig_Loader_Filesystem(root("res/themes/default/html"));
$twig = new Twig_Environment($loader, ['cache' =>
root('cache/')]);
diff --git a/res/lib/sterilize.php b/res/lib/sterilize.php
new file mode 100644
index 0000000..c22603e
--- /dev/null
+++ b/res/lib/sterilize.php
@@ -0,0 +1,16 @@
+ STRING
+// If a given variable is a string, wrap it with apostrophes.
+// Otherwise, just return it as given.
+function string_wrap($value) {
+ if (is_string($value)) {
+ return "'" . $value . "'";
+ } else {
+ return $value;
+ }
+}
+
+// ARRAY --> ARRAY
+// 'Wrap' all strings in array with apostrophes.
+function strings_wrap($array) {
+ return array_map("string_wrap", $array);
+}
+?>
diff --git a/res/lib/user.php b/res/lib/user.php
new file mode 100644
index 0000000..c8bcba4
--- /dev/null
+++ b/res/lib/user.php
@@ -0,0 +1,105 @@
+ VARYING
+// Return the value of a given user's row
+function user_get($id, $variable) {
+ return db_get_cell("lusers", "id", $id, $variable);
+}
+
+// NUMBER STRING VARYING --> NIL
+// Set the value of a given user's cell
+function user_set($id, $variable, $new_value) {
+ return db_set_cell("lusers", "id", $id, $variable, $new_value);
+}
+
+// -------------------------------------
+
+
+// NUMBER STRING STRING [STRING STRING STRING STRING STRING] --> BOOLEAN
+// Create a user of the given specification.
+function user_create($id, $name, $password, $login="Spectator",
+ $full_name=NULL, $email=NULL, $url=NULL, $bio=NULL) {
+
+ return db_insert_row("lusers",
+ array("id", "username", "password_hash", "login",
+ "full_name", "email", "website", "biography"),
+ array($id, $name, $password, $login,
+ $full_name, $email, $url, $bio));
+}
+
+
+// -------------------------------------
+
+
+// NUMBER --> STRING
+// Get a user's username from ID.
+function user_id_to_name($id) {
+ return user_get($id, "username");
+}
+
+// STRING --> NUMBER
+// Get a user's ID from username.
+function user_name_to_id($username) {
+ return db_get_cell("lusers", "username", $username, "id");
+}
+
+
+// -------------------------------------
+
+
+// NUMBER --> STRING
+// Return a username from a user-ID
+function user_name($id) {
+ return user_id_to_name($id, "username");
+}
+
+// NUMBER --> STRING
+// Return a user's login-class from ID
+function user_login($id) {
+ return user_get($id, "login");
+}
+
+// NUMBER --> STRING
+// Return a user's full name from ID
+function user_full_name($id) {
+ return user_get($id, "full_name");
+}
+
+// NUMBER --> STRING
+// Return a user's email from ID
+function user_email($id) {
+ return user_get($id, "email");
+}
+
+// NUMBER --> STRING
+// Return a user's website URL from ID
+function user_website($id) {
+ return user_get($id, "website");
+}
+
+// NUMBER --> STRING
+// Return a user's biography from ID
+function user_biography($id) {
+ return user_get($id, "biography");
+}
+
+// -------------------------------------
+
+// NUMBER --> ARRAY
+// Fetch an array of a user's posts (by ID)
+function user_posts($user_id) {
+ return db_get_cell("posts", "user", $user_id, "id");
+}
+
+?>
diff --git a/res/themes/default/html/admin_index.twig.html b/res/themes/default/html/admin_index.twig.html
new file mode 100644
index 0000000..69f1f91
--- /dev/null
+++ b/res/themes/default/html/admin_index.twig.html
@@ -0,0 +1,37 @@
+