forked from projects/fipamo
ro
1f62e6f816
decided to keep the sorting service class as is and remix how it works to return data objects rather than just settings information to render pages. the overall size of the class is still large but now there are some opportunites to move around some methodolgy to reduce it. also made the necessary changes in the render service class and the theme controller to use the new methodology
289 lines
10 KiB
PHP
289 lines
10 KiB
PHP
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
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 = [];
|
|
|
|
$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' => $this->settings->getTags()[3]['pages'],
|
|
'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 M D d'),
|
|
'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;
|
|
}
|
|
}
|