feat: 文章/分类/评论关联细节完善
- 文章列表:会员插件注入「付费」徽章列(会员/付费¥xx,停插件即消失) - 分类:真实文章数(withCount)、名称点击跳文章列表并按分类筛选(ListPosts booted 预置筛选) - 分类:新增封面(medialibrary)+ 介绍(description 字段/表单);前台分类页顶部展示介绍区;SEO description + BreadcrumbList 结构化数据(GEO) - 文章编辑:MarkdownEditor 内容区加大(26rem);文章编辑页新增「评论」关系管理页(可审/拒) - 评论列表:文章列带摘要 - 三套主题补 .category-intro 样式 - 测试更新(付费徽章列)
This commit is contained in:
@@ -2,7 +2,6 @@
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
|
||||
namespace App\Filament\Resources\Posts\Pages;
|
||||
|
||||
use App\Filament\Resources\Posts\PostResource;
|
||||
@@ -13,6 +12,18 @@ class ListPosts extends ListRecords
|
||||
{
|
||||
protected static string $resource = PostResource::class;
|
||||
|
||||
public function bootedInteractsWithTable(): void
|
||||
{
|
||||
// 支持从分类管理跳转:?category_id=X 预置分类筛选
|
||||
// (在 booted 阶段设置,早于表单填充;SelectFilter 状态为 category_id.value 嵌套结构)
|
||||
if (blank($this->tableFilters) && ($categoryId = (int) request()->query('category_id', 0))) {
|
||||
$this->tableFilters = ['category_id' => ['value' => $categoryId]];
|
||||
$this->tableDeferredFilters = ['category_id' => ['value' => $categoryId]];
|
||||
}
|
||||
|
||||
parent::bootedInteractsWithTable();
|
||||
}
|
||||
|
||||
protected function getHeaderActions(): array
|
||||
{
|
||||
return [
|
||||
|
||||
@@ -54,7 +54,7 @@ class PostResource extends Resource
|
||||
public static function getRelations(): array
|
||||
{
|
||||
return [
|
||||
//
|
||||
\App\Filament\Resources\Posts\RelationManagers\CommentsRelationManager::class,
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,81 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Filament\Resources\Posts\RelationManagers;
|
||||
|
||||
use App\Models\Comment;
|
||||
use Filament\Forms\Components\TextInput;
|
||||
use Filament\Forms\Components\Textarea;
|
||||
use Filament\Resources\RelationManagers\RelationManager;
|
||||
use Filament\Tables\Actions\Action;
|
||||
use Filament\Tables\Columns\TextColumn;
|
||||
use Filament\Tables\Table;
|
||||
|
||||
class CommentsRelationManager extends RelationManager
|
||||
{
|
||||
protected static string $relationship = 'comments';
|
||||
|
||||
protected static ?string $title = '相关评论';
|
||||
|
||||
protected static ?string $modelLabel = '评论';
|
||||
|
||||
protected static ?string $pluralModelLabel = '评论';
|
||||
|
||||
public function form(\Filament\Schemas\Schema $schema): \Filament\Schemas\Schema
|
||||
{
|
||||
return $schema
|
||||
->components([
|
||||
TextInput::make('author_name')->label('昵称')->disabled(),
|
||||
TextInput::make('author_email')->label('邮箱')->disabled(),
|
||||
TextInput::make('author_url')->label('网址')->disabled(),
|
||||
Textarea::make('content')->label('内容')->disabled()->rows(4),
|
||||
]);
|
||||
}
|
||||
|
||||
public function table(Table $table): Table
|
||||
{
|
||||
return $table
|
||||
->columns([
|
||||
TextColumn::make('author_name')->label('昵称'),
|
||||
TextColumn::make('content')->label('内容')->limit(40),
|
||||
TextColumn::make('status')->label('状态')
|
||||
->badge()
|
||||
->formatStateUsing(fn ($state) => match ($state) {
|
||||
'published' => '已发布',
|
||||
'pending' => '待审核',
|
||||
'spam' => '垃圾',
|
||||
'rejected' => '已拒绝',
|
||||
default => $state,
|
||||
})
|
||||
->color(fn ($state) => match ($state) {
|
||||
'published' => 'success',
|
||||
'pending' => 'warning',
|
||||
'spam' => 'danger',
|
||||
'rejected' => 'gray',
|
||||
default => 'gray',
|
||||
}),
|
||||
TextColumn::make('created_at')->label('时间')->dateTime('Y-m-d H:i'),
|
||||
])
|
||||
->recordActions([
|
||||
Action::make('approve')
|
||||
->label('通过')
|
||||
->color('success')
|
||||
->visible(fn (Comment $record) => $record->status !== 'published')
|
||||
->action(function (Comment $record) {
|
||||
if ($record->status !== 'published') {
|
||||
$record->post?->increment('comment_count');
|
||||
}
|
||||
$record->update(['status' => 'published']);
|
||||
}),
|
||||
Action::make('reject')
|
||||
->label('拒绝')
|
||||
->color('danger')
|
||||
->visible(fn (Comment $record) => $record->status !== 'rejected')
|
||||
->action(fn (Comment $record) => $record->update(['status' => 'rejected'])),
|
||||
])
|
||||
->recordUrl(null)
|
||||
->recordAction(null)
|
||||
->defaultSort('created_at', 'desc');
|
||||
}
|
||||
}
|
||||
@@ -63,6 +63,9 @@ class PostsTable
|
||||
->sortable(),
|
||||
])
|
||||
->filters([
|
||||
SelectFilter::make('category_id')
|
||||
->label('分类')
|
||||
->relationship('category', 'name'),
|
||||
SelectFilter::make('status')
|
||||
->label('状态')
|
||||
->options([
|
||||
|
||||
Reference in New Issue
Block a user