ro
9c432db209
small bug where links in the archive and tag templates where being rendered as url encoded strings, so that needed to be decoded so it displays as normal text
294 lines
10 KiB
PHP
294 lines
10 KiB
PHP
<?php
|
|
|
|
namespace App\Services\Data;
|
|
|
|
use Carbon\Carbon;
|
|
|
|
use function _\find;
|
|
use function _\filter;
|
|
|
|
class SortingService
|
|
{
|
|
private $p_tags = [];
|
|
private $p_archive = [];
|
|
private $settings;
|
|
private $contents;
|
|
private $themes;
|
|
private $info = [];
|
|
|
|
public function __construct(
|
|
SettingsService $settingsService,
|
|
ContentService $contentService,
|
|
ThemeService $themeService,
|
|
) {
|
|
$this->settings = $settingsService;
|
|
$this->contents = $contentService;
|
|
$this->themes = $themeService;
|
|
$global = $this->settings->getGlobal();
|
|
$this->info = [
|
|
'keywords' => isset($global['keywords'])
|
|
? $global['keywords']
|
|
: 'fipamo, blog, jamstack, php, markdown, js',
|
|
'menu' => $this->settings->getMenu(),
|
|
'tags' => $this->settings->getTags(),
|
|
'description' => $global['descriptions'],
|
|
'image' => $global['base_url'] . $global['background'],
|
|
'baseURL' => $global['base_url'],
|
|
'dynamicRender' => $global['dynamicRender'],
|
|
'theme' => $global['theme'],
|
|
];
|
|
}
|
|
|
|
public function tags($debug = true)
|
|
{
|
|
$pages = $this->contents->loadAllPages();
|
|
foreach ($pages as $page) {
|
|
$temp = [];
|
|
if (isset($page['tags'])) {
|
|
$temp = explode(',', $page['tags']);
|
|
foreach ($temp as $tag) {
|
|
$label = trim($tag);
|
|
if (!find($this->p_tags, ['tag_name' => $label])) {
|
|
array_push($this->p_tags, [
|
|
'tag_name' => $label,
|
|
'slug' => safeString($label),
|
|
'pages' => $this->tagPages($label, $pages),
|
|
]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
$tagData = [];
|
|
|
|
$settingsTags = [];
|
|
if (isset($this->settings->getTags()['pages'])) {
|
|
$settingsTags = $this->settings->getTags()['pages'];
|
|
}
|
|
$tagData = [
|
|
'debug' => $debug, // for theme kit
|
|
'layout' => 'page',
|
|
'tags' => $this->p_tags,
|
|
'theme' => $this->info['theme'], // for theme kit
|
|
'title' => 'Pages Tagged as Tag',
|
|
'dynamicRender' => $this->info['dynamicRender'],
|
|
'pages' => $settingsTags,
|
|
'info' => $this->info,
|
|
'menu' => $this->settings->getMenu(),
|
|
'media' => [
|
|
['file' => $this->info['image'],
|
|
'type' => trim(pathinfo($this->info['image'], PATHINFO_EXTENSION))]
|
|
]
|
|
];
|
|
|
|
return $tagData;
|
|
}
|
|
|
|
private function tagPages($tag, $pages)
|
|
{
|
|
$tagged = [];
|
|
foreach ($pages as $page) {
|
|
if (isset($page['tags'])) {
|
|
if (strpos($page['tags'], $tag) !== false) {
|
|
array_push($tagged, [
|
|
'title' => urldecode($page['title']),
|
|
'slug' => $page['slug'],
|
|
'path' => $page['path'],
|
|
'feature' => $page['feature'],
|
|
]);
|
|
}
|
|
}
|
|
}
|
|
|
|
return $tagged;
|
|
}
|
|
|
|
public function archive($debug = true)
|
|
{
|
|
$pages = $this->contents->loadAllPages();
|
|
$years = [];
|
|
$archive = [];
|
|
foreach ($pages as $page) {
|
|
$date = explode('/', $page['path']);
|
|
if (!find($years, ['year' => trim($date[0])])) {
|
|
$findPages = filter($pages, ['createdYear' => trim($date[0])]);
|
|
array_push(
|
|
$years,
|
|
[
|
|
'year' => trim($date[0]),
|
|
'count' => count($findPages),
|
|
]
|
|
);
|
|
}
|
|
}
|
|
foreach ($years as $year) {
|
|
$sorted = [];
|
|
$filtered = filter($pages, ['createdYear' => $year['year']]);
|
|
foreach ($filtered as $obj) {
|
|
$month = date('m', date($obj['rawCreated']));
|
|
if (!find($sorted, ['month' => $month])) {
|
|
$perMonth = filter(
|
|
$pages,
|
|
[
|
|
'path' => $year['year'] . '/' . $month,
|
|
'deleted' => false,
|
|
'published' => true,
|
|
'layout' => 'page',
|
|
]
|
|
);
|
|
array_push($sorted, [
|
|
'month' => $month,
|
|
'full_month' => date('F', date($obj['rawCreated'])),
|
|
'count' => count($perMonth),
|
|
'pages' => $perMonth,
|
|
]);
|
|
}
|
|
}
|
|
array_push($this->p_archive, [
|
|
'year' => $year['year'],
|
|
'year_data' => $sorted,
|
|
]);
|
|
}
|
|
$archive_data = [];
|
|
|
|
$archiveData = [
|
|
'debug' => $debug, // for theme kit
|
|
'theme' => $this->info['theme'], // for theme kit
|
|
'layout' => 'page',
|
|
'title' => 'Archives',
|
|
'dynamicRender' => $this->info['dynamicRender'],
|
|
'archive' => $this->p_archive,
|
|
'info' => $this->info,
|
|
'menu' => $this->settings->getMenu(),
|
|
'media' => [
|
|
['file' => $this->info['image'],
|
|
'type' => trim(pathinfo($this->info['image'], PATHINFO_EXTENSION))]
|
|
],
|
|
];
|
|
|
|
return $archiveData;
|
|
}
|
|
|
|
public function page($page, $debug = true)
|
|
{
|
|
$pageOptions = [];
|
|
$tags = [];
|
|
if (isset($page['tags'])) {
|
|
$taglist = explode(',', $page['tags']);
|
|
foreach ($taglist as $tag) {
|
|
$label = trim($tag);
|
|
array_push($tags, [
|
|
'label' => $label . ' ',
|
|
'slug' => safeString($label),
|
|
]);
|
|
}
|
|
}
|
|
$meta = [
|
|
'who' => $page['author'],
|
|
'when' => $page['created'],
|
|
'tags' => $tags,
|
|
];
|
|
// if page feature isn't empty, find image from list and set it as background image
|
|
// if it is empty, just use global background
|
|
if ($page['feature'] != '' || $page['feature'] != null) {
|
|
$media = explode(',', $page['feature']);
|
|
$set = false;
|
|
foreach ($media as $file) {
|
|
$item = trim($file);
|
|
$ext = pathinfo($item, PATHINFO_EXTENSION);
|
|
|
|
if ($ext != 'mp4' && !$set) {
|
|
$this->info['image'] = $this->info['baseURL'] . $item;
|
|
$set = true;
|
|
}
|
|
}
|
|
}
|
|
$recent = [];
|
|
$featured = [];
|
|
$limit = 4;
|
|
$pages = $this->contents->loadAllPages();
|
|
foreach ($pages as $item) {
|
|
if (
|
|
!$item['deleted'] &&
|
|
$item['published'] &&
|
|
$item['menu'] != 'true'
|
|
) {
|
|
if (count($recent) < $limit) {
|
|
array_push($recent, [
|
|
'path' => $item['path'],
|
|
'slug' => $item['slug'],
|
|
'title' => urldecode($item['title']),
|
|
'feature' => $item['feature'],
|
|
]);
|
|
}
|
|
|
|
if ($item['featured'] == true) {
|
|
if (count($featured) < $limit) {
|
|
array_push($featured, [
|
|
'path' => $item['path'],
|
|
'slug' => $item['slug'],
|
|
'title' => urldecode($item['title']),
|
|
'feature' => $item['feature'],
|
|
]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
$pageData = [
|
|
"debug" => $debug,
|
|
"theme" => $this->info['theme'],
|
|
"status" => session('member') != null ? true : false,
|
|
"title" => urldecode($page['title']),
|
|
"meta" => $meta,
|
|
"menu" => $this->settings->getMenu(),
|
|
"info" => $this->info,
|
|
"media" => $page['media'],
|
|
"files" => $page['docs'],
|
|
"content" => $page['html'],
|
|
"layout" => $page['layout'],
|
|
"recent" => $recent,
|
|
"feature" => $featured,
|
|
"tags" => $meta['tags'],
|
|
"dynamicRender" => $this->info['dynamicRender'],
|
|
];
|
|
return $pageData;
|
|
}
|
|
|
|
public function navigation()
|
|
{
|
|
$pageOptions = [
|
|
'title' => 'Edit Navigation',
|
|
'status' => session('member') != '' ? true : false,
|
|
'menu' => $this->settings->getMenu(),
|
|
];
|
|
|
|
return $pageOptions;
|
|
}
|
|
|
|
public function settings()
|
|
{
|
|
$global = $this->settings->getGlobal();
|
|
$updatedContent = new Carbon($global['last_content_backup']);
|
|
$updatedFiles = new Carbon($global['last_files_backup']);
|
|
$status = session('member') != '' ? true : false;
|
|
$pageOptions = [
|
|
'title' => 'Settings',
|
|
'private' => $global['private'],
|
|
'renderOnSave' => $global['renderOnSave'],
|
|
'background' => $global['background'],
|
|
'member' => session('member'),
|
|
'ftoken' => session('form_token'),
|
|
'siteTitle' => $global['title'],
|
|
'baseUrl' => $global['base_url'],
|
|
'desc' => $global['descriptions'],
|
|
'lastContentBackup' => $updatedContent->format('Y F d H i s'),
|
|
'lastFilesBackup' => $updatedFiles->format('Y F d H i s'),
|
|
'currentTheme' => $global['theme'],
|
|
'themes' => $this->themes->getThemes(),
|
|
'apiStatus' => isset($global['externalAPI']) ? $global['externalAPI'] : 'false',
|
|
'dynamicRenderStatus' => isset($global['dynamicRender']) ? $global['dynamicRender'] : 'false',
|
|
'status' => $status,
|
|
];
|
|
return $pageOptions;
|
|
}
|
|
}
|