1
0
cms11/app/Services/BundleRenderers/Renderers/DateBasedListRenderer.php
2024-04-25 15:44:29 +02:00

173 lines
5.7 KiB
PHP

<?php
namespace App\Services\BundleRenderers\Renderers;
use App\Classes\Bundle;
use Carbon\Carbon;
class DateBasedListRenderer extends ListRenderer
{
/**
* Renders a complete HTML view of the bundle
*/
public function render()
{
$this->prepareRender();
$parts = preg_split('#/#', $this->bundle->getPath(), -1, PREG_SPLIT_NO_EMPTY);
$count = count($parts);
switch ($count) {
case 2:
// A year is specified
$date = sprintf('%s-%s-%s', $parts[1], '01', '01');
$date = Carbon::parse($date);
$articleTitle = $date->isoFormat('YYYY');
$siteTitle = sprintf('Articles publiés en %s', $date->isoFormat('YYYY'));
break;
case 3:
// A month is specified
$date = sprintf('%s-%s-%s', $parts[1], $parts[2], '01');
$date = Carbon::parse($date);
$articleTitle = $date->isoFormat('MMMM YYYY');
$siteTitle = sprintf('Articles publiés en %s %s', $date->isoFormat('MMMM'), $date->isoFormat('YYYY'));
break;
case 4:
// A day is specified
$date = sprintf('%s-%s-%s', $parts[1], $parts[2], $parts[3]);
$date = Carbon::parse($date);
$articleTitle = $date->isoFormat('DD MMMM YYYY');
$siteTitle = sprintf('Articles publiés le %s %s %s', $date->isoFormat('DD'), $date->isoFormat('MMMM'), $date->isoFormat('YYYY'));
break;
}
if (!empty($articleTitle)) {
data_set($this->viewData, 'articleTitle', $articleTitle);
data_set($this->viewData, 'siteTitle', $siteTitle);
}
return view('article', $this->viewData);
}
/**
* Return a boolean value indicating if this creator in particular can
* create bundles for specified section
*/
public static function handles(Bundle $bundle): bool
{
$parts = preg_split('#/#', $bundle->getPath(), -1, PREG_SPLIT_NO_EMPTY);
$count = count($parts);
$sections = ['blog', 'liens-interessants'];
return $count > 0
&& in_array($parts[0], $sections)
&& $count < 5;
}
protected function handleFilters($subBundles)
{
$url = $this->bundle->getPath();
$parts = preg_split('#/#', $url, -1, PREG_SPLIT_NO_EMPTY);
// $parts[0] is section
$selectedYear = $parts[1] ?? null;
$selectedMonth = $parts[2] ?? null;
$selectedDay = $parts[3] ?? null;
$filters = [
'Année' => [
'values' => [],
'selected' => $selectedYear ?? 'Toutes',
'visible' => true,
],
'Mois' => [
'values' => [],
'selected' => $selectedMonth ?? 'Tous',
'visible' => $selectedYear !== null,
],
'Jour' => [
'values' => [],
'selected' => $selectedDay ?? 'Tous',
'visible' => $selectedMonth !== null,
],
];
$prefix = sprintf('%s/', $parts[0]);
if ($selectedYear) {
$prefix .= $selectedYear . '/';
if ($selectedMonth) {
$prefix .= $selectedMonth . '/';
if ($selectedDay) {
$prefix .= $selectedDay . '/';
}
}
}
foreach ($subBundles as $subBundle) {
$fileParts = preg_split('#/#', $subBundle, -1, PREG_SPLIT_NO_EMPTY);
// $parts[0] is section
$year = $fileParts[1] ?? null;
$month = $fileParts[2] ?? null;
$day = $fileParts[3] ?? null;
if ($year) {
$filters['Année']['values'][$year] = [
'title' => $year,
'path' => sprintf('/%s/%s/', $parts[0], $year),
];
if ($month && $selectedYear !== null) {
$date = Carbon::parse(sprintf('%s-%s-%s', $year, $month, '01'));
$monthName = $date->isoFormat('MMMM');
$filters['Mois']['values'][$month] = [
'title' => $monthName,
'path' => sprintf('/%s/%s/%s/', $parts[0], $year, $month),
];
if ($day && $selectedMonth !== null) {
$filters['Jour']['values'][$day] = [
'title' => $day,
'path' => sprintf('/%s/%s/%s/%s/', $parts[0], $year, $month, $day),
];
}
}
}
}
ksort($filters['Année']['values']);
ksort($filters['Mois']['values']);
ksort($filters['Jour']['values']);
$filters['Année']['values'] = [
'Toutes' => [
'title' => 'Toutes',
'path' => sprintf('/%s/', $parts[0]),
],
]
+ $filters['Année']['values'];
$filters['Mois']['values'] = [
'Tous' => [
'title' => 'Tous',
'path' => sprintf('/%s/%s/', $parts[0], $selectedYear),
],
]
+ $filters['Mois']['values'];
$filters['Jour']['values'] = [
'Tous' => [
'title' => 'Tous',
'path' => sprintf('/%s/%s/%s/', $parts[0], $selectedYear, $selectedMonth),
],
]
+ $filters['Jour']['values'];
data_set($this->viewData['pagination'], 'filters', $filters);
}
}