- topbar: Livewire LegacySyncButton next to 写文章 (moved from user menu) - view modes: add 图文(card) grid with cover fallback chain (cover → attachment → first content image → placeholder); list mode now title-only compact - archives: year/month/day index grid - page cache admin: size + expiry columns, total size, cache policy note - theme inject: stylevars switch from KeyValue to Repeater with multi-line HTML editing - import: html_entity_decode for category/post-title/link/keywords/comment author
73 lines
1.6 KiB
PHP
73 lines
1.6 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Blog\Support;
|
|
|
|
use Illuminate\Http\Request;
|
|
|
|
/**
|
|
* Homepage / list browse mode, matching old SaBlog 标准 | 列表.
|
|
*/
|
|
class HomeViewMode
|
|
{
|
|
public const LIST = 'list';
|
|
|
|
public const FULL = 'full';
|
|
|
|
public const CARD = 'card';
|
|
|
|
public const COOKIE = 'll_home_view';
|
|
|
|
/**
|
|
* @return array<string, string>
|
|
*/
|
|
public static function options(): array
|
|
{
|
|
return [
|
|
self::LIST => '列表',
|
|
self::FULL => '标准',
|
|
self::CARD => '图文',
|
|
];
|
|
}
|
|
|
|
public static function isValid(mixed $value): bool
|
|
{
|
|
return is_string($value) && in_array($value, [self::LIST, self::FULL, self::CARD], true);
|
|
}
|
|
|
|
public static function resolve(?Request $request = null): string
|
|
{
|
|
$request ??= request();
|
|
|
|
foreach ([
|
|
$request->query('view'),
|
|
$request->cookie(self::COOKIE),
|
|
blog_setting('home_view_mode', config('blog.home_view_mode', self::LIST)),
|
|
] as $value) {
|
|
if (self::isValid($value)) {
|
|
return $value;
|
|
}
|
|
}
|
|
|
|
return self::LIST;
|
|
}
|
|
|
|
public static function current(): string
|
|
{
|
|
$request = request();
|
|
$mode = self::resolve($request);
|
|
|
|
if (self::isValid($request->query('view'))) {
|
|
cookie()->queue(cookie(self::COOKIE, (string) $request->query('view'), 60 * 24 * 30));
|
|
}
|
|
|
|
return $mode;
|
|
}
|
|
|
|
public static function url(string $mode): string
|
|
{
|
|
return request()->fullUrlWithQuery(['view' => $mode]);
|
|
}
|
|
}
|