Init and scaffolding
This commit is contained in:
commit
4785bb6afa
|
@ -0,0 +1,43 @@
|
||||||
|
===============================================================================
|
||||||
|
BLAGOBLAG Simple blogsphere-ish system
|
||||||
|
===============================================================================
|
||||||
|
|
||||||
|
Blagoblag is a pretty simple system that'd be perfectly at home in the
|
||||||
|
blogosphere.[1]
|
||||||
|
|
||||||
|
TL;DR, registered users can create date-stamped posts. Someone can browse
|
||||||
|
posts by date (from all users) in a format resembling a “newsletter,” or
|
||||||
|
by user.
|
||||||
|
Users can create comments on any post after filling out a simple CAPTCHA.
|
||||||
|
|
||||||
|
Y'know, stuff along those lines.
|
||||||
|
|
||||||
|
[1] https://xkcd.com/181/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
----------------------------------------
|
||||||
|
PRE-REQUISITES
|
||||||
|
----------------------------------------
|
||||||
|
* PHP 7.0
|
||||||
|
* Webserver with CGI enabled
|
||||||
|
* A paper-clip and soldering-iron
|
||||||
|
* Also a lighter
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
----------------------------------------
|
||||||
|
INSTALLATION
|
||||||
|
----------------------------------------
|
||||||
|
Drop Blagoblag in any directory on your webserver, then create an SQL
|
||||||
|
database for Blagoblag. Make sure to make a "config.ini" file (from
|
||||||
|
"config.ini.example")-- at the minimum, you need to configure the SQL
|
||||||
|
connection settings.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
----------------------------------------
|
||||||
|
BORING STUFF
|
||||||
|
----------------------------------------
|
||||||
|
License is AGPLv3, copyleft.
|
||||||
|
TL;DR, do whatever, but share the source-code. :)
|
|
@ -0,0 +1,5 @@
|
||||||
|
{ "require":
|
||||||
|
{
|
||||||
|
"twig/twig": "1.*"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
===============================================================================
|
||||||
|
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,
|
||||||
|
SQLite, IBM DB2) will work just fine.
|
||||||
|
|
||||||
|
The database name will be fetched from the "config.ini" file-- and a table
|
||||||
|
will be automatically created as necessary.
|
||||||
|
|
||||||
|
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))
|
||||||
|
|
||||||
|
comments (id smallint primary key, displayname varchar(20),
|
||||||
|
text shorttext, date datetime)
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
===============================================================================
|
||||||
|
DIRECTORY STRUCTURE
|
||||||
|
===============================================================================
|
||||||
|
|
||||||
|
The structure of this repo is like this:
|
||||||
|
|
||||||
|
/res/
|
||||||
|
Contains publicly-accessible resources (CSS, etc),
|
||||||
|
and themes.
|
||||||
|
/res/img/
|
||||||
|
Contains uploaded images.
|
||||||
|
/res/themes/
|
||||||
|
Contains all themes (collections of CSS, images, and
|
||||||
|
templates).
|
||||||
|
/res/themes/default/
|
||||||
|
The theme we're gonna develop and use.
|
||||||
|
/res/themes/default/css/
|
||||||
|
CSS for the default theme.
|
||||||
|
/res/themes/default/templates/
|
||||||
|
Templates for the default theme (our HTML).
|
||||||
|
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
/lib/
|
||||||
|
Contains PHP files that should be included into every
|
||||||
|
PHP file.
|
||||||
|
/lib/ext/
|
||||||
|
Contains external PHP libraries.
|
||||||
|
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
/public/
|
||||||
|
The webroot.
|
||||||
|
Contains small, bare PHP files that render webpages.
|
||||||
|
Any requests for "/public/res/" will be rediricted by
|
||||||
|
the webserver to "/res/".
|
||||||
|
/public/*/private/
|
||||||
|
PHP files for processing input (I.E., user submits
|
||||||
|
a blog)-- everything in */private/ should redirect
|
||||||
|
to something in a corresponding */results/ file.
|
||||||
|
/public/*/results/
|
||||||
|
PHP files for displaying results of processed input
|
||||||
|
(I.E., "wow, that's an error" or "hooray, it worked")
|
|
@ -0,0 +1,23 @@
|
||||||
|
===============================================================================
|
||||||
|
FRONT-END
|
||||||
|
===============================================================================
|
||||||
|
There are 6 different pages/views we need to work on:
|
||||||
|
|
||||||
|
* INDEX/OVERVIEW
|
||||||
|
A page for showing a general overview of the site-- newest
|
||||||
|
posts overall.
|
||||||
|
* USER
|
||||||
|
A page dedicated to a given user, with their name, biography,
|
||||||
|
(maybe a picture? <3) and some of their recent psots.
|
||||||
|
* POST
|
||||||
|
A page dedicated to displaying a single article. Should list
|
||||||
|
the author, date, and text. Y'know, jazz like that.
|
||||||
|
* ABOUT
|
||||||
|
An about page, that talks about what this thing is.
|
||||||
|
|
||||||
|
* NAVBAR
|
||||||
|
A top-bar/side-bar for navigation that will be shown on every
|
||||||
|
page in the site.
|
||||||
|
* FOOTER
|
||||||
|
A bottom-bar/footer that has whatever legal/boring/contact-us
|
||||||
|
stuff we want to put in it.
|
|
@ -0,0 +1,114 @@
|
||||||
|
===============================================================================
|
||||||
|
A PHP CHEAT-SHEET
|
||||||
|
===============================================================================
|
||||||
|
|
||||||
|
----------------------------------------
|
||||||
|
SYNTAX
|
||||||
|
----------------------------------------
|
||||||
|
All PHP code must be between "<?php" and "?>":
|
||||||
|
<?php
|
||||||
|
echo "Like this.";
|
||||||
|
?>
|
||||||
|
|
||||||
|
Every statement ends with a semicolon, all function arguments
|
||||||
|
are seperated by commas, etc.
|
||||||
|
|
||||||
|
|
||||||
|
----------------------------------------
|
||||||
|
OPERATORS
|
||||||
|
----------------------------------------
|
||||||
|
Normal stuff (like +, -, etc.), but *also*:
|
||||||
|
. concatenation (mainly for strings, like "a" . "b" ... "ab")
|
||||||
|
++ increment (add one, I.E. 1++ ... 2)
|
||||||
|
-- decrement (subtract one, I.E. 2-- ... 1)
|
||||||
|
|
||||||
|
|
||||||
|
----------------------------------------
|
||||||
|
COMPARISON OPERATORS
|
||||||
|
----------------------------------------
|
||||||
|
== equal (same data)
|
||||||
|
=== identical (same type + data)
|
||||||
|
!= not-equal (different data)
|
||||||
|
!== not-identicial (different type or data)
|
||||||
|
< less-than
|
||||||
|
> greater-than
|
||||||
|
<= less-than or equal-to
|
||||||
|
>= greater-than or equal-to
|
||||||
|
?? null coalescing (choose first variable that's non-null,
|
||||||
|
from left to right)
|
||||||
|
|
||||||
|
----------------------------------------
|
||||||
|
VARIABLES
|
||||||
|
----------------------------------------
|
||||||
|
All variables start like "$". Assignment is like this:
|
||||||
|
|
||||||
|
$variable = "value";
|
||||||
|
|
||||||
|
|
||||||
|
----------------------------------------
|
||||||
|
FUNCTIONS
|
||||||
|
----------------------------------------
|
||||||
|
Make a function like a lot of languages:
|
||||||
|
|
||||||
|
function FUNCTION_NAME($ARGUMENT, $ARGUMENT) {
|
||||||
|
BLAH BLAH BLAH;
|
||||||
|
return BLAH;
|
||||||
|
}
|
||||||
|
|
||||||
|
... replace FUNCTION_NAME with the name, $ARGUMENT with a variable name,
|
||||||
|
etc. etc.
|
||||||
|
|
||||||
|
If you want an argument to be optional, assign it a default value, like:
|
||||||
|
|
||||||
|
function FUNCTION_NAME($ARGUMENT = "default", $ARGUMENT = 2) {
|
||||||
|
|
||||||
|
|
||||||
|
----------------------------------------
|
||||||
|
ARRAYS
|
||||||
|
----------------------------------------
|
||||||
|
Make an array with
|
||||||
|
|
||||||
|
array(KEY=>VALUE, KEY=>VALUE);
|
||||||
|
|
||||||
|
VARIABLE can be a string or a number.
|
||||||
|
|
||||||
|
Get an array value like
|
||||||
|
|
||||||
|
$array[KEY]
|
||||||
|
|
||||||
|
|
||||||
|
----------------------------------------
|
||||||
|
GLOBAL VARIABLES
|
||||||
|
----------------------------------------
|
||||||
|
There are some important global variables--
|
||||||
|
|
||||||
|
$GET Hosts all GET data.
|
||||||
|
$POST All POST data
|
||||||
|
$SERVER SERVER data
|
||||||
|
$GLOBALS Contains all global vars.
|
||||||
|
|
||||||
|
They're all arrays.
|
||||||
|
Variables are local to their function-- and often, global variables from
|
||||||
|
certain functions won't be accessible in the global scope of another.
|
||||||
|
|
||||||
|
To reliably access (inter-file) globals, access them like values in an
|
||||||
|
array of $GLOBALS
|
||||||
|
|
||||||
|
$GLOBALS[KEY]
|
||||||
|
|
||||||
|
|
||||||
|
----------------------------------------
|
||||||
|
ETC.
|
||||||
|
----------------------------------------
|
||||||
|
Really, most of PHP is really similar to other languages.
|
||||||
|
You should be able to read it pretty easily-- if there's something
|
||||||
|
you don't quite get, you can use the Wikibook
|
||||||
|
|
||||||
|
https://en.wikibooks.org/wiki/PHP_Programming/
|
||||||
|
|
||||||
|
For quick reference. And for function definitions/examples, check the
|
||||||
|
PHP documentation
|
||||||
|
|
||||||
|
https://secure.php.net/docs.php
|
||||||
|
|
||||||
|
Also Google loves you <3
|
|
@ -0,0 +1,18 @@
|
||||||
|
===============================================================================
|
||||||
|
TWIG TEMPLATING SYSTEM
|
||||||
|
===============================================================================
|
||||||
|
Twig is a system for writing HTML "templates"-- HTML snippets that can have
|
||||||
|
variable names in it, which PHP will interpret and replace with the values.
|
||||||
|
|
||||||
|
We're gonna be using Twig, since it's really useful.
|
||||||
|
|
||||||
|
If you're front-end, writing HTML, look at `./twig_example.html` for a general
|
||||||
|
example of how you'll use Twig.
|
||||||
|
You can alo read `https://twig.symfony.com/doc/2.x/templates.html` if you want
|
||||||
|
more in-depth documentation, but you probably don't need it.
|
||||||
|
|
||||||
|
If you're back-end, writing PHP, look at
|
||||||
|
`https://twig.symfony.com/doc/2.x/api.html`.
|
||||||
|
|
||||||
|
|
||||||
|
Look at `variables.txt` for a list of the variables we'll be using.
|
|
@ -0,0 +1,27 @@
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Twig Example</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<!-- Variable names put between {{ ... }} will turn into the value
|
||||||
|
when interpreted by the server. -->
|
||||||
|
|
||||||
|
<!-- If the variable "name" is set in the PHP code, then this will
|
||||||
|
print out that string: -->
|
||||||
|
<p>My name is {{ name }}</p>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- List items can be read like {{ list[n] }} -->
|
||||||
|
<p>List of animals:</p>
|
||||||
|
<ul>
|
||||||
|
{{ animals[0] }}
|
||||||
|
{{ animals[1] }}
|
||||||
|
{{ animals[2] }}
|
||||||
|
{{ animals[3] }}
|
||||||
|
{{ animals[4] }}
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<!-- That should be all you need to know! -->
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,83 @@
|
||||||
|
===============================================================================
|
||||||
|
VARIABLE LIST
|
||||||
|
===============================================================================
|
||||||
|
|
||||||
|
GLOBAL
|
||||||
|
----------------------------------------
|
||||||
|
There are a few variables that will always be avaiable to use-- these are what
|
||||||
|
you can use in any page's template:
|
||||||
|
|
||||||
|
* users[number]
|
||||||
|
A numbered array of all users that can create posts
|
||||||
|
* user['name']['string']
|
||||||
|
An array indexed by a username (string), with a
|
||||||
|
sub-list containing data on a user. 'string' can be
|
||||||
|
one of the following:
|
||||||
|
* 'full_name'
|
||||||
|
* 'bio'
|
||||||
|
* 'email'
|
||||||
|
* 'posts'
|
||||||
|
'posts' is special, because it actually will be another
|
||||||
|
array that lists the post IDs of a users posts in
|
||||||
|
order of newest to oldest.
|
||||||
|
So for Andre's latest post:
|
||||||
|
user['andre']['posts'][0]
|
||||||
|
For his second-newest:
|
||||||
|
user['andre']['posts'][1]
|
||||||
|
For Andre's full name:
|
||||||
|
user['andre']['full_name']
|
||||||
|
* posts[number]
|
||||||
|
A list of post IDs, in order from newest to oldest.
|
||||||
|
So the newest post ID would be posts[0].
|
||||||
|
* post[number]['string']
|
||||||
|
All blogpost data will be stored in this array-- the
|
||||||
|
number is the ID (number assigned to a post when
|
||||||
|
created) and 'string' is one of the following:
|
||||||
|
* 'title'
|
||||||
|
* 'date'
|
||||||
|
* 'author'
|
||||||
|
* 'text'
|
||||||
|
For example, to get the title of post #345:
|
||||||
|
post[345]['title']
|
||||||
|
and it's text:
|
||||||
|
post[345]['text']
|
||||||
|
So on and so forth.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
To get the text of the newest post by Kaleb, do:
|
||||||
|
post[user['kaleb']['posts'][0]]['text']
|
||||||
|
|
||||||
|
Since userposts[] lists a user's posts in ascending order, the newest
|
||||||
|
is '0', and since user['kaleb']['posts'][0] would contain the ID of his
|
||||||
|
newest post, we just use that as the post ID, and boom.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
LOCAL
|
||||||
|
----------------------------------------
|
||||||
|
These are variables that can only be used in specific contexts, on a per-page
|
||||||
|
basis.
|
||||||
|
|
||||||
|
USER
|
||||||
|
--------------------
|
||||||
|
* username
|
||||||
|
The user's username
|
||||||
|
* full_name
|
||||||
|
The user's fullname
|
||||||
|
* bio
|
||||||
|
The user's bio
|
||||||
|
* email
|
||||||
|
The user's email
|
||||||
|
* posts
|
||||||
|
A list of the user's posts (IDs) from newest to oldest
|
||||||
|
|
||||||
|
POST
|
||||||
|
--------------------
|
||||||
|
* author
|
||||||
|
The post's author (username)
|
||||||
|
* date
|
||||||
|
The post's publishing date
|
||||||
|
* id
|
||||||
|
The post's id
|
||||||
|
* text
|
||||||
|
The post's text
|
|
@ -0,0 +1 @@
|
||||||
|
Placeholder.
|
|
@ -0,0 +1 @@
|
||||||
|
/* This is the CSS file for the about page *only* */
|
|
@ -0,0 +1 @@
|
||||||
|
/* This is the CSS file for the footer *only* */
|
|
@ -0,0 +1 @@
|
||||||
|
/* This is the CSS file for the index page *only* */
|
|
@ -0,0 +1 @@
|
||||||
|
/* This is the CSS file for the navbar *only* */
|
|
@ -0,0 +1 @@
|
||||||
|
/* This is the CSS file for the post page *only* */
|
|
@ -0,0 +1 @@
|
||||||
|
/* This is the CSS file for the index page *only* */
|
|
@ -0,0 +1,10 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<link rel="stylesheet" type="text/css" href="../css/global.css">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../css/about.css">
|
||||||
|
<title>Index</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
</body>
|
||||||
|
</html
|
|
@ -0,0 +1,10 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<link rel="stylesheet" type="text/css" href="../css/global.css">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../css/footer.css">
|
||||||
|
<title>Index</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
</body>
|
||||||
|
</html
|
|
@ -0,0 +1,10 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<link rel="stylesheet" type="text/css" href="../css/global.css">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../css/index.css">
|
||||||
|
<title>Index</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
</body>
|
||||||
|
</html
|
|
@ -0,0 +1,10 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<link rel="stylesheet" type="text/css" href="../css/global.css">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../css/navbar.css">
|
||||||
|
<title>Index</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
</body>
|
||||||
|
</html
|
|
@ -0,0 +1,10 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<link rel="stylesheet" type="text/css" href="../css/global.css">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../css/post.css">
|
||||||
|
<title>Index</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
</body>
|
||||||
|
</html
|
|
@ -0,0 +1,10 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<link rel="stylesheet" type="text/css" href="../css/global.css">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../css/user.css">
|
||||||
|
<title>Index</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
</body>
|
||||||
|
</html
|
Reference in New Issue