dynamic blogs and delayed header display
This commit is contained in:
parent
3c65fe1699
commit
a1075b0d5e
8 changed files with 265 additions and 85 deletions
11
README.md
11
README.md
|
@ -31,15 +31,20 @@ Anyways, let's get to the *how*.
|
|||
- The basic skeleton for any document should be:
|
||||
```php
|
||||
<?php
|
||||
// Title for your page
|
||||
$PageTitle="Your title";
|
||||
|
||||
// This makes for less typing while including the header and the footer.
|
||||
// Absolute path to the commons folder.
|
||||
$COMMONS = $_SERVER['DOCUMENT_ROOT'] . "/../common";
|
||||
|
||||
// Include the common site-wide header.
|
||||
include_once($COMMONS."/header.php");
|
||||
|
||||
// Display the header with desired title. This is a separate function for the
|
||||
// cases where you want to set the title dynamically after doing some
|
||||
// processing (which requires sql connection from the header for example).
|
||||
// An example of this are the blogs, which first get their name from the
|
||||
// databese, and only then display the header with the title being the name
|
||||
// of the article.
|
||||
display_header(<PAGETITLE>);
|
||||
?>
|
||||
|
||||
<!--
|
||||
|
|
|
@ -7,7 +7,8 @@ include_once("config.php");
|
|||
session_start();
|
||||
|
||||
// PDO Mysql connection object
|
||||
$conn = "";
|
||||
$conn = null;
|
||||
attempt_sql_connect();
|
||||
|
||||
/** Attempt to connect to sql database
|
||||
*/
|
||||
|
@ -33,26 +34,49 @@ function attempt_sql_connect() {
|
|||
}
|
||||
}
|
||||
|
||||
attempt_sql_connect();
|
||||
|
||||
?>
|
||||
|
||||
<html lang="en">
|
||||
/**
|
||||
* Start the html document, set headers, begin body and display the default
|
||||
* navbar.
|
||||
* <html><body> nad <main> tags will be left open, to close them
|
||||
* in the default way include footer.php
|
||||
* This should be the first function to write any text outside of debugging
|
||||
* purposes.
|
||||
*/
|
||||
function display_header($pageTitle) {
|
||||
printf("
|
||||
<html lang=\"en\">
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
||||
<link rel="icon" href="http://www.zdenekborovec-dev.cz/favicon.ico">
|
||||
<link rel="stylesheet" href="http://assets.zdenekborovec-dev.cz/common/styles.css?1703173954">
|
||||
<title><?= isset($PageTitle) ? $PageTitle : "Zdenek Home Page"?></title>
|
||||
<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">
|
||||
<link rel=\"icon\" href=\"http://www.zdenekborovec-dev.cz/favicon.ico\">
|
||||
<link rel=\"stylesheet\"
|
||||
href=\"http://assets.zdenekborovec-dev.cz/common/styles.css?TIMESTAMP\">
|
||||
<title>%s</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<main>
|
||||
<div id="header">
|
||||
<div id=\"header\">
|
||||
<h1> Zdenek Borovec Home Page </h1>
|
||||
<ul>
|
||||
<li><a href="http://www.zdenekborovec-dev.cz">About</a></li>
|
||||
<li><a href="http://www.zdenekborovec-dev.cz/blog">Blog</a></li>
|
||||
<li>Gallery</li>
|
||||
<li><a href="http://www.zdenekborovec-dev.cz/random">Random Tools</a></li>
|
||||
<li>
|
||||
<a href=\"http://www.zdenekborovec-dev.cz\">
|
||||
About
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href=\"http://www.zdenekborovec-dev.cz/blog\">
|
||||
Blog
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
Gallery
|
||||
</li>
|
||||
<li>
|
||||
<a href=\"http://www.zdenekborovec-dev.cz/random\">
|
||||
Random Tools
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>", $pageTitle);
|
||||
}
|
||||
?>
|
||||
|
|
120
docs/www/blog/article.php
Normal file
120
docs/www/blog/article.php
Normal file
|
@ -0,0 +1,120 @@
|
|||
<?php
|
||||
// Declare global variables for the blog content
|
||||
$blogTitle = $blogContent = $datePosted = $tags = "";
|
||||
$blogId = $_GET["guid"];
|
||||
|
||||
$COMMONS = $_SERVER['DOCUMENT_ROOT'] . "/../common";
|
||||
|
||||
include_once($COMMONS."/header.php");
|
||||
|
||||
// Try to get info about blog
|
||||
if($blogId)
|
||||
get_blog_info();
|
||||
|
||||
// Display the header with title being the blog name, or not found message.
|
||||
display_header($blogTitle ? $blogTitle : "Article not found");
|
||||
|
||||
/**
|
||||
* Try to load info about the blog with guid in GET and set global
|
||||
* variables accordingly.
|
||||
*/
|
||||
function get_blog_info(){
|
||||
// Access global variables
|
||||
global $conn;
|
||||
global $blogTitle;
|
||||
global $blogContent;
|
||||
global $datePosted;
|
||||
global $tags;
|
||||
global $blogId;
|
||||
|
||||
// Check DB connection
|
||||
if($conn == null){
|
||||
printf("
|
||||
<article>
|
||||
<h1>Failed DB connection, cannot proceed!</h1>
|
||||
If you see this error in production,
|
||||
please shoot me an email with helpful details.
|
||||
</article>");
|
||||
include_once($COMMONS."/footer.php");
|
||||
die();
|
||||
}
|
||||
|
||||
// Prepare and bind statement for gathering blogpost info
|
||||
$stmt = $conn->prepare("SELECT title, content, date_posted
|
||||
FROM blogposts WHERE blogpost_id = :blogpost_id;");
|
||||
$stmt->bindParam(":blogpost_id", $blogId);
|
||||
|
||||
// Execute the statement
|
||||
$stmt->execute();
|
||||
|
||||
// Fetch the blogpost
|
||||
$result = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
// If no post with given guid was found,
|
||||
// there is no information to gather, return.
|
||||
if(!$result){
|
||||
return;
|
||||
}
|
||||
|
||||
// Prepare new statement for selecting the tags for a given blogpost
|
||||
$stmt = $conn->prepare("SELECT name, color FROM
|
||||
blogpost_tags INNER JOIN blogpost_has_tag ON
|
||||
blogpost_tags.tag_id = blogpost_has_tag.tag_id WHERE
|
||||
blogpost_id = :blogpost_id;");
|
||||
|
||||
// Bind and execute the tag select
|
||||
$stmt->bindParam(":blogpost_id", $blogId);
|
||||
$stmt->execute();
|
||||
|
||||
// Fetch the tags
|
||||
$tags_arr = $stmt->fetchall(PDO::FETCH_ASSOC);
|
||||
|
||||
// Set the variables
|
||||
$blogTitle = $result["title"];
|
||||
$blogContent = $result["content"];
|
||||
$datePosted = $result["date_posted"];
|
||||
$tags = $tags_arr;
|
||||
}
|
||||
|
||||
// If a blog with given ID was not found display warning message and die.
|
||||
if(!$blogTitle){
|
||||
printf("
|
||||
<article>
|
||||
<h2> Article not found </h2>
|
||||
<hr>
|
||||
<p>
|
||||
I am sorry, but I couldn't find an article with this ID.
|
||||
</p>
|
||||
</article>
|
||||
");
|
||||
include_once($COMMONS."/footer.php");
|
||||
die();
|
||||
}
|
||||
|
||||
// Begin the article
|
||||
printf("<article>");
|
||||
|
||||
// Display the blogpost name
|
||||
printf("<h2>%s</h2>", $blogTitle);
|
||||
|
||||
// Display the blog metadata
|
||||
printf("<div class=\"blog-metadata\">");
|
||||
|
||||
// Display tags
|
||||
for($i = 0; $i < count($tags); $i++) {
|
||||
$tag = $tags[$i];
|
||||
printf("
|
||||
<span class=\"blog-tag\" style=\"background-color: %s\">
|
||||
%s
|
||||
</span>", $tag["color"], $tag["name"]);
|
||||
}
|
||||
|
||||
// Display publish date and end metadata div
|
||||
printf("<span class=\"blog-publish-date\">Published on: %s</span></div>",
|
||||
date("Y-m-d", strtotime($datePosted)));
|
||||
|
||||
// Display hrule, article content and end the article
|
||||
printf("</article><hr><article>%s</article>", $blogContent);
|
||||
|
||||
include_once($COMMONS."/footer.php");
|
||||
?>
|
|
@ -1,9 +1,96 @@
|
|||
<?php
|
||||
$PageTitle="Zdenek: Blog";
|
||||
|
||||
$COMMONS = $_SERVER['DOCUMENT_ROOT'] . "/../common";
|
||||
|
||||
include_once($COMMONS."/header.php");
|
||||
display_header("Blogs");
|
||||
|
||||
/**
|
||||
* Display a blog-preview div
|
||||
*/
|
||||
function display_blog_preview($blogpost_id, $title, $abstract,
|
||||
$date_posted, $tags){
|
||||
printf("
|
||||
<div class=\"blog-preview\">
|
||||
<a href=\"http://www.zdenekborovec-dev.cz/blog/article?guid=%s\">
|
||||
<h3>
|
||||
%s
|
||||
</h3>
|
||||
</a>
|
||||
<div class=\"blog-metadata\">
|
||||
", $blogpost_id, $title);
|
||||
|
||||
for($i = 0; $i < count($tags); $i++) {
|
||||
$tag = $tags[$i];
|
||||
printf("
|
||||
<span class=\"blog-tag\" style=\"background-color: %s\">
|
||||
%s
|
||||
</span>", $tag["color"], $tag["name"]);
|
||||
}
|
||||
|
||||
printf("
|
||||
<span class=\"blog-publish-date\">
|
||||
Published on: %s
|
||||
</span>
|
||||
</div>
|
||||
<p>
|
||||
%s
|
||||
</p>
|
||||
</div>
|
||||
", date("Y-m-d", strtotime($date_posted)), $abstract);
|
||||
}
|
||||
|
||||
/**
|
||||
* Select all the blogposts from the database, their tags, then display them.
|
||||
*/
|
||||
function display_blog_previews(){
|
||||
// Access global variables
|
||||
global $conn;
|
||||
|
||||
// Check DB connection
|
||||
if($conn == null){
|
||||
printf("
|
||||
<article>
|
||||
<h1>Failed DB connection, cannot proceed!</h1>
|
||||
If you see this error in production,
|
||||
please shoot me an email with helpful details.
|
||||
</article>");
|
||||
return;
|
||||
}
|
||||
|
||||
// Prepare statement for selecting all the blogposts
|
||||
$stmt = $conn->prepare("SELECT blogpost_id, title, abstract, date_posted
|
||||
FROM blogposts ORDER BY date_posted DESC;");
|
||||
|
||||
// Execute the statement
|
||||
$stmt->execute();
|
||||
|
||||
// Fetch the blogposts
|
||||
$blogposts_arr = $stmt->fetchall(PDO::FETCH_ASSOC);
|
||||
|
||||
// Prepare new statement for selecting the tags for a given blogpost
|
||||
$stmt = $conn->prepare("SELECT name, color FROM
|
||||
blogpost_tags INNER JOIN blogpost_has_tag ON
|
||||
blogpost_tags.tag_id = blogpost_has_tag.tag_id WHERE
|
||||
blogpost_id = :blogpost_id;");
|
||||
|
||||
// Go through all the blogposts, fetch their tags and display them
|
||||
for($i = 0; $i < count($blogposts_arr); $i++) {
|
||||
// Get info for the current blog
|
||||
$blog = $blogposts_arr[$i];
|
||||
|
||||
// Bind and execute the tag select
|
||||
$stmt->bindParam(":blogpost_id", $blog["blogpost_id"]);
|
||||
$stmt->execute();
|
||||
|
||||
// Fetch the tags
|
||||
$tags_arr = $stmt->fetchall(PDO::FETCH_ASSOC);
|
||||
|
||||
// Display the blog
|
||||
display_blog_preview($blog["blogpost_id"], $blog["title"],
|
||||
$blog["abstract"], $blog["date_posted"], $tags_arr);
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
<article>
|
||||
|
@ -11,65 +98,14 @@ include_once($COMMONS."/header.php");
|
|||
My blogposts
|
||||
</h2>
|
||||
<p>
|
||||
Blogs about various topics will be written here, at some point in the future.
|
||||
</p>
|
||||
<p>
|
||||
The way in which they are made and addressed right now is temporary, so any links you save / share WILL EXPIRE eventualy. This includes media.
|
||||
</p>
|
||||
<p>
|
||||
I am just trying to get a feel for what tools I might need for writing the blogs, so everything is subject to change once I get a solid idea and implement a proper system for doing this, instead of just writing plain html.
|
||||
These can range from well thought out slow-burning blood-churning gems
|
||||
to random brain farts in textual form, you can use tags to filter.
|
||||
</p>
|
||||
</article>
|
||||
<hr>
|
||||
<ul class="blog-preview-list">
|
||||
<li><div class="blog-preview"><a href="http://www.zdenekborovec-dev.cz/blog/flatland_review">
|
||||
<h3>
|
||||
Flatland: A Review.
|
||||
</h3>
|
||||
</a>
|
||||
<div class="blog-metadata">
|
||||
<span class="blog-tag" style="background-color: AntiqueWhite">
|
||||
books
|
||||
</span>
|
||||
<span class="blog-tag" style="background-color: LightSkyBlue">
|
||||
geometry
|
||||
</span>
|
||||
<span class="blog-tag" style="background-color: LightPink">
|
||||
reviews
|
||||
</span>
|
||||
<span class="blog-publish-date">
|
||||
Published on: 2024-03-12
|
||||
</span>
|
||||
</div>
|
||||
<p>
|
||||
I had the privilege to travel Flatland together with A. Square these past few days and the experience was truly delightful.
|
||||
</p>
|
||||
</div></li>
|
||||
<li><div class="blog-preview"><a href="http://www.zdenekborovec-dev.cz/blog/godot_spell_system_prototype">
|
||||
<h3>
|
||||
Godot spell casting system prototype
|
||||
</h3>
|
||||
</a>
|
||||
<div class="blog-metadata">
|
||||
<span class="blog-tag" style="background-color: cornflowerblue">
|
||||
godot
|
||||
</span>
|
||||
<span class="blog-tag" style="background-color: khaki">
|
||||
game-dev
|
||||
</span>
|
||||
<span class="blog-tag" style="background-color: sienna">
|
||||
the-labyrinth-II
|
||||
</span>
|
||||
<span class="blog-publish-date">
|
||||
Published on: 2024-01-13
|
||||
</span>
|
||||
</div>
|
||||
<p>
|
||||
I have wanted to implement this system in my upcoming game "The Labyrith II" for a few years now, but I got distracted and left it, well, I am back now.
|
||||
</p>
|
||||
</div></li>
|
||||
</ul>
|
||||
|
||||
<?php
|
||||
display_blog_previews();
|
||||
|
||||
include_once($COMMONS."/footer.php");
|
||||
?>
|
||||
|
|
|
@ -1,9 +1,8 @@
|
|||
<?php
|
||||
$PageTitle="Zdenek: About";
|
||||
|
||||
$COMMONS = $_SERVER['DOCUMENT_ROOT'] . "/../common";
|
||||
|
||||
include_once($COMMONS."/header.php");
|
||||
display_header("About");
|
||||
?>
|
||||
|
||||
<article>
|
||||
|
|
|
@ -1,10 +1,8 @@
|
|||
|
||||
<?php
|
||||
$PageTitle="Login";
|
||||
|
||||
$COMMONS = $_SERVER['DOCUMENT_ROOT'] . "/../common";
|
||||
|
||||
include_once($COMMONS."/header.php");
|
||||
display_header("Login");
|
||||
|
||||
// Define previous attempt and error variables and set to empty values.
|
||||
$emailOld = $passwordOld = "";
|
||||
|
|
|
@ -1,9 +1,8 @@
|
|||
<?php
|
||||
$PageTitle="Unit conversions";
|
||||
|
||||
$COMMONS = $_SERVER['DOCUMENT_ROOT'] . "/../common";
|
||||
|
||||
include_once($COMMONS."/header.php");
|
||||
display_header("Unit conversions");
|
||||
?>
|
||||
|
||||
<article id="toc">
|
||||
|
|
|
@ -1,9 +1,8 @@
|
|||
<?php
|
||||
$PageTitle="Zdenek: Random tools";
|
||||
|
||||
$COMMONS = $_SERVER['DOCUMENT_ROOT'] . "/../common";
|
||||
|
||||
include_once($COMMONS."/header.php");
|
||||
display_header("Random tools");
|
||||
?>
|
||||
|
||||
<article>
|
||||
|
|
Loading…
Reference in a new issue