You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
2.2 KiB
75 lines
2.2 KiB
<?php |
|
|
|
namespace App\Controllers; |
|
|
|
use App\Model\BlogModel; |
|
|
|
class BlogController extends PageController { |
|
|
|
public function indexAction(): void |
|
{ |
|
$archived = $this->router->request()->param('archived', 0); |
|
$search = $this->router->request()->param('search', ''); |
|
$posts = $this->search($search, $archived); |
|
|
|
$this->defineHelpers(); |
|
|
|
// AJAX search request will only render the posts partial |
|
if ($_SERVER['REQUEST_METHOD'] == 'POST') { |
|
$this->router->service()->partial($this->views . '/partials/blog-posts.php', ['posts' => $posts]); |
|
return; |
|
} |
|
|
|
$this->router->service()->posts = $posts; |
|
$this->router->service()->search = $search; |
|
$this->router->service()->injectView = $this->views . '/partials/blog-posts.php'; |
|
parent::view('blog', 'Hello'); |
|
} |
|
|
|
//-------------------------------------// |
|
|
|
private function search(string $query = '', int $archived = 0): ?array |
|
{ |
|
return BlogModel::selectAll( |
|
'blog_post.*, media.filename, media.extension, page.page, section.section, log.created_at', ' |
|
LEFT JOIN media ON blog_post.media_id = media.id |
|
LEFT JOIN page ON blog_post.page_id = page.id |
|
LEFT JOIN section ON page.section_id = section.id |
|
LEFT JOIN log ON blog_post.log_id = log.id |
|
WHERE blog_post.archived = :archived AND |
|
(blog_post.content LIKE :query OR |
|
blog_post.title LIKE :query OR |
|
blog_post.tag LIKE :query) |
|
', [ |
|
[':archived', "$archived", \PDO::PARAM_INT], |
|
[':query', "%$query%", \PDO::PARAM_STR] |
|
]); |
|
} |
|
|
|
private function defineHelpers(): void |
|
{ |
|
$this->router->service()->prettyTimestamp = function (string $timestamp): string { |
|
$date = date_create($timestamp); |
|
$date = date_format($date, 'd M Y'); |
|
return "<u class=\"text-decoration-none text-reset\" title=\"{$timestamp}\">{$date}</u>"; |
|
}; |
|
|
|
$this->router->service()->tags = function (string $tags): string { |
|
$result = ""; |
|
|
|
// Remove empty elements via array_filter() |
|
$splitTags = array_filter(explode(':', $tags), function ($tag) { |
|
return !empty(trim($tag)); |
|
}); |
|
|
|
foreach ($splitTags as $key => $tag) { |
|
$result .= $tag; |
|
$result .= (($key === array_key_last($splitTags)) ? '' : ', '); |
|
} |
|
|
|
return $result; |
|
}; |
|
} |
|
|
|
|
|
}
|
|
|