*/ class Post { /** * The ID of the post. * * @var int */ public $id = 0; /** * The id of the thread this post is a part of. * * @var int */ public $thread = 0; /** * The id of the forum this post is a part of. * * @var int */ public $forum = 0; /** * The User object of the poster. * * @var User */ public $poster = null; /** * The IP address from which this post was created. * * @var string */ public $ip = ""; /** * The UNIX timestamp from when this post was created. * * @var int */ public $time = 0; /** * The subject of this post. * * @var string */ public $subject = ""; /** * The raw contents of this post. * * @var string */ public $text = ""; /** * The parsed contents of this post. * * @var string */ public $parsed = ""; /** * The UNIX timestamp of the last time this post was edited. * * @var int */ public $editTime = 0; /** * The reason why this post was edited. * * @var string */ public $editReason = ""; /** * The User object of the user that last edited this post. * * @var User */ public $editUser = null; /** * Constructor. * * @param int $postId ID of the post that should be constructed. */ public function __construct($postId) { // Attempt to get the database row $postRow = DB::prepare('SELECT * FROM `{prefix}posts` WHERE `post_id` = :id'); $postRow->execute([ 'id' => $postId, ]); $postRow = $postRow->fetch(); // Assign data if a row was returned if ($postRow) { $this->id = $postRow->post_id; $this->thread = $postRow->topic_id; $this->forum = $postRow->forum_id; $this->poster = User::construct($postRow->poster_id); $this->ip = $postRow->poster_ip; $this->time = $postRow->post_time; $this->subject = $postRow->post_subject; $this->text = $postRow->post_text; $this->editTime = $postRow->post_edit_time; $this->editReason = $postRow->post_edit_reason; $this->editUser = User::construct($postRow->post_edit_user); } // Parse the markup $this->parsed = BBcode::toHTML(htmlentities($this->text)); } /** * Creating a new post. * * @param string $subject The subject of the thread. * @param string $text The raw contents of the post. * @param User $poster The User object of the poster. * @param int $thread The ID of the thread this post is a reply to. * @param mixed $forum The forum this post is a reply in. * * @return null|self Either null, indicating a failure, or the Post object. */ public static function create($subject, $text, User $poster, $thread = 0, $forum = 0) { // Check if the data meets the requirements if (strlen($subject) < Config::get('forum_title_min') || strlen($subject) > Config::get('forum_title_max') || strlen($text) < Config::get('forum_text_min') || strlen($text) > Config::get('forum_text_max')) { return null; } // If no thread is specified create a new one if ($thread) { $thread = new Thread($thread); } else { $thread = Thread::create($forum, $subject); } // Stop if the thread ID is 0 if ($thread->id == 0) { return null; } // Insert the post DB::prepare('INSERT INTO `{prefix}posts` (`topic_id`, `forum_id`, `poster_id`, `poster_ip`, `post_time`, `post_subject`, `post_text`) VALUES (:thread, :forum, :user, :ip, :time, :subject, :text)') ->execute([ 'thread' => $thread->id, 'forum' => $thread->forum, 'user' => $poster->id, 'ip' => Net::IP(), 'time' => time(), 'subject' => $subject, 'text' => $text, ]); // Get post id $id = (int) DB::lastID(); // Update the last post date $thread->lastUpdate(); // Return the object return new Post($id); } /** * Commit the changes to the Database. * * @return null|Post Either null, indicating a failure, or the Post object. */ public function update() { // Check if the data meets the requirements if (strlen($this->subject) < Config::get('forum_title_min') || strlen($this->subject) > Config::get('forum_title_max') || strlen($this->text) < Config::get('forum_text_min') || strlen($this->text) > Config::get('forum_text_max')) { return null; } // Create a thread object $thread = new Thread($this->thread); // Update the post DB::prepare('UPDATE `{prefix}posts` SET `topic_id` = :thread, `forum_id` = :forum, `poster_id` = :user, `poster_ip` = :ip, `post_time` = :time, `post_subject` = :subject, `post_text` = :text, `post_edit_time` = :edit_time, `post_edit_reason` = :edit_reason, `post_edit_user` = :edit_user WHERE `post_id` = :post') ->execute([ 'post' => $this->id, 'thread' => $thread->id, 'forum' => $thread->forum, 'user' => $this->poster->id, 'ip' => Net::pton(Net::IP()), 'time' => $this->time, 'subject' => $this->subject, 'text' => $this->text, 'edit_time' => $this->editTime, 'edit_reason' => $this->editReason, 'edit_user' => $this->editUser->id, ]); // Return a new post object return new Post($this->id); } }