forked from projects/fipamo
ro
9923f087a6
when sorting tags on a fresh install, a fatal error happens when the tag array is empty because it looks for a var that doesn't exist yet. that's been patched the settings json file was still referencing the old version of the base theme, so it was crashing because it doesn't exist anymore. updating it to the new theme name clears this error
293 lines
10 KiB
PHP
293 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
|
|
'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' => $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
|
|
'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' => $item['title'],
|
|
'feature' => $item['feature'],
|
|
]);
|
|
}
|
|
|
|
if ($item['featured'] == true) {
|
|
if (count($featured) < $limit) {
|
|
array_push($featured, [
|
|
'path' => $item['path'],
|
|
'slug' => $item['slug'],
|
|
'title' => $item['title'],
|
|
'feature' => $item['feature'],
|
|
]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
$pageData = [
|
|
"debug" => $debug,
|
|
"theme" => $this->info['theme'],
|
|
"status" => session('member') != null ? true : false,
|
|
"title" => $page['title'],
|
|
"meta" => $meta,
|
|
"menu" => $this->settings->getMenu(),
|
|
"info" => $this->info,
|
|
"media" => $page['media'],
|
|
"files" => $page['docs'],
|
|
"content" => $page['html'],
|
|
"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();
|
|
$email = $this->settings->getEmail();
|
|
$updated = new Carbon($global['last_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'],
|
|
'lastBackup' => $updated->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',
|
|
'mailOption' => $email['active'],
|
|
'mailConfig' => $email,
|
|
'status' => $status,
|
|
];
|
|
return $pageOptions;
|
|
}
|
|
}
|