diff --git a/assets/common/styles.css b/assets/common/styles.css index a9f9c43..8151a71 100755 --- a/assets/common/styles.css +++ b/assets/common/styles.css @@ -256,3 +256,31 @@ code { .blog-metadata .blog-publish-date { float: right; } + +.comment .comment { + margin-left: 0.5em; +} + +.comment .comment-own-wrapper{ + background-image: url("http://assets.zdenekborovec-dev.cz/common/planks_dark_tile.png"); + background-repeat: repeat; + background-color: black; + color: white; + border: 1px solid black; +} + +.comment .comment-child-wrapper{ + border-left: 1px solid black; +} + +.comment .comment .comment-own-wrapper { + border-top: 0px; +} + +.comment .comment-metadata, .comment .comment-content { + padding: 0.5em; +} + +.comment-metadata .comment-date { + float: right; +} diff --git a/docs/www/blog/article.php b/docs/www/blog/article.php index 5f59fa0..f08ea05 100644 --- a/docs/www/blog/article.php +++ b/docs/www/blog/article.php @@ -7,11 +7,98 @@ include_once($COMMONS."/utils.php"); class BlogpostComment { public $comment_id; - public $parent_id; public $blogpost_id; public $poster_id; + public $poster_name; public $timestamp; public $content; + public $children; + + /** + * Display the comment, and recursively it's children + */ + public function display_comment() { + printf(" +
+
+
+ + By: %s + + + On: %s + +
+
+
+ %s +
+
+
+ ", $this->poster_name, date("Y-m-d", strtotime($this->timestamp)), + $this->content); + + if($this->children != null) { + for($i = 0; $i < count($this->children); $i++) + { + $child = $this->children[$i]; + $child->display_comment(); + } + } + printf("
"); + } + + /** + * Load the child comments to this comment, and recursively their children. + */ + public function load_children($conn) { + // Prepare new statement for selecting all the child comments. + $stmt = $conn->prepare("SELECT comment_id, poster_id, timestamp, + content, username FROM (blogpost_comments INNER JOIN users ON + poster_id = user_id) WHERE blogpost_id = :blogpost_id + AND parent_id = :comment_id;"); + + // Bind and execute the comment select + $stmt->bindParam(":blogpost_id", $this->blogpost_id); + $stmt->bindParam(":comment_id", $this->comment_id); + $stmt->execute(); + + // Fetch the comments + $results_arr = $stmt->fetchall(PDO::FETCH_ASSOC); + $comments_arr = []; + + // Recursively fetch all the child comments + for($i = 0; $i < count($results_arr); $i++) { + $com = $results_arr[$i]; + $commentObj = new BlogpostComment($com["comment_id"], + $com["poster_id"], $com["username"], $this->blogpost_id, + $com["timestamp"], $com["content"]); + $comments_arr[] = $commentObj; + $commentObj->load_children($conn); + } + + $this->children = $comments_arr; + } + + /** + * Constructor for the BlogpostComment object. + * $comment_id GUID of the comment. + * $poster_id GUID of the comment author. + * $poster_name Name of the comment author. + * $blogpost_id GUID of the blogpost this comment is under. + * $timestamp Timestamp at comment creation. + * $content Content of the comment. + */ + public function __construct($comment_id, $poster_id, $poster_name, + $blogpost_id, $timestamp, $content) { + $this->comment_id = $comment_id; + $this->blogpost_id = $blogpost_id; + $this->poster_id = $poster_id; + $this->poster_name = $poster_name; + $this->timestamp = $timestamp; + $this->content = $content; + //printf("New comment %s
%s
%s
%s
%s
%s

", $comment_id, $poster_id, $poster_name, $blogpost_id, $timestamp, $content); + } } @@ -22,11 +109,12 @@ class Blogpost public $content; public $date_posted; public $tags; + public $comments; /** * Display the article, or a warning message. */ - function display_article(){ + public function display_article(){ // If a blog with given ID was not found display warning message. if(!$this->title){ printf(" @@ -67,6 +155,17 @@ class Blogpost printf("
%s
", $this->content); } + /** + * Display the comments for this post and their children. + */ + public function display_comments(){ + printf("

Comments:

"); + for($i = 0; $i < count($this->comments); $i++){ + $this->comments[$i]->display_comment(); + } + printf("
"); + } + /** * Constructor for the blogpost. * $blogpost_id GUID of the blogpost in the database. @@ -74,34 +173,56 @@ class Blogpost * $content Content of the blogpost article. * $date_posted Timestamp at publishing of article. * $tags Array of the tags this article has. + * $comments Array of Blogpostcomment objects, + * the comments of this article. */ public function __construct($blogpost_id, $title, $content, - $date_posted, $tags){ + $date_posted, $tags, $comments){ $this->blogpost_id = $blogpost_id; - $this->title = $title; - $this->content = $content; + $this->title = $title; + $this->content = $content; $this->date_posted = $date_posted; - $this->tags = $tags; + $this->tags = $tags; + $this->comments = $comments; } } /** - * Try to load info about the blog with guid in GET and set global - * variables accordingly. + * Load comments under a given blog. + * Returns array of BlogpostComment objects. */ -function get_blog_info($conn, $blogId){ - // Check DB connection - if($conn == null){ - printf(" -
-

Failed DB connection, cannot proceed!

- If you see this error in production, - please shoot me an email with helpful details. -
"); - include_once($COMMONS."/footer.php"); - die(); +function load_comments($conn, $blogId) { + // Prepare new statement for selecting all the "root" comments on the post. + $stmt = $conn->prepare("SELECT comment_id, poster_id, timestamp, content, + username FROM (blogpost_comments INNER JOIN users ON + poster_id = user_id) WHERE blogpost_id = :blogpost_id AND + parent_id IS NULL;"); + + // Bind and execute the comment select + $stmt->bindParam(":blogpost_id", $blogId); + $stmt->execute(); + + // Fetch the comments + $results_arr = $stmt->fetchall(PDO::FETCH_ASSOC); + $comments_arr = []; + + // Recursively fetch all the child comments + for($i = 0; $i < count($results_arr); $i++) { + $com = $results_arr[$i]; + $commentObj = new BlogpostComment($com["comment_id"], $com["poster_id"], + $com["username"], $blogId, $com["timestamp"], $com["content"]); + $commentObj->load_children($conn); + $comments_arr[] = $commentObj; } + return $comments_arr; +} + +/** + * Load info about the blog with a given guid and return corresponding + * Blogpost object. NULL if blog couldn't be loaded. + */ +function load_blog($conn, $blogId){ // Prepare and bind statement for gathering blogpost info $stmt = $conn->prepare("SELECT title, content, date_posted FROM blogposts WHERE blogpost_id = :blogpost_id;"); @@ -137,46 +258,30 @@ function get_blog_info($conn, $blogId){ $blogContent = $result["content"]; $datePosted = $result["date_posted"]; $tags = $tags_arr; + $comments = load_comments($conn, $blogId); - return new Blogpost($blogId, $blogTitle, $blogContent, $datePosted, $tags); + return new Blogpost($blogId, $blogTitle, $blogContent, + $datePosted, $tags, $comments); } -/** - * Display all the comments responding to a given article. - */ -function display_comments($conn, $blogId){ - // Check DB connection - if($conn == null){ - printf(" -
-

- Failed to load comments due to database connection error! -

- If you see this error in production, - please shoot me an email with helpful details. -
"); - return; - } - - // Prepare statement for selecting all coments replying to a given article. - $stmt = $conn->prepare("SELECT;"); - - // Bind and execute the tag select - $stmt->bindParam(":blogpost_id", $blogId); - $stmt->execute(); - - // Fetch the tags - $tags_arr = $stmt->fetchall(PDO::FETCH_ASSOC); - +// Check DB connection +if($conn == null){ + printf(" +
+

Failed DB connection, cannot proceed!

+ If you see this error in production, + please shoot me an email with helpful details. +
"); + include_once($COMMONS."/footer.php"); + die(); } // Get the blog id. $blogId = sanitize_input($_GET["guid"]); -$blogPost = null; // Try to get info about blog if($blogId) { - $blogPost = get_blog_info($conn, $blogId); + $blogPost = load_blog($conn, $blogId); } // Display the header with title being the blog name, or not found message. @@ -184,6 +289,7 @@ display_header($blogPost ? $blogPost->title : "Article not found"); // Display the blog $blogPost->display_article(); +$blogPost->display_comments(); include_once($COMMONS."/footer.php"); ?>