style updates
This commit is contained in:
+35
-2
@@ -1,4 +1,37 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema;
|
||||
return new class extends Migration { public function up(): void { Schema::table('pages', function(Blueprint $table): void { $table->string('template')->default('default'); $table->timestamp('expires_at')->nullable(); $table->string('preview_token',64)->nullable()->unique(); $table->foreignId('locked_by')->nullable()->constrained('users')->nullOnDelete(); $table->timestamp('locked_at')->nullable(); }); Schema::create('page_revisions', function(Blueprint $table): void { $table->id(); $table->foreignId('page_id')->constrained('pages')->cascadeOnDelete(); $table->foreignId('user_id')->nullable()->constrained()->nullOnDelete(); $table->string('title'); $table->longText('content')->nullable(); $table->json('snapshot'); $table->timestamps(); }); } public function down(): void { Schema::dropIfExists('page_revisions'); Schema::table('pages', function(Blueprint $table): void { $table->dropConstrainedForeignId('locked_by'); $table->dropColumn(['template','expires_at','preview_token','locked_at']); }); } };
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('pages', function (Blueprint $table): void {
|
||||
$table->string('template')->default('default');
|
||||
$table->timestamp('expires_at')->nullable();
|
||||
$table->string('preview_token', 64)->nullable()->unique();
|
||||
$table->foreignId('locked_by')->nullable()->constrained('users')->nullOnDelete();
|
||||
$table->timestamp('locked_at')->nullable();
|
||||
});
|
||||
Schema::create('page_revisions', function (Blueprint $table): void {
|
||||
$table->id();
|
||||
$table->foreignId('page_id')->constrained('pages')->cascadeOnDelete();
|
||||
$table->foreignId('user_id')->nullable()->constrained()->nullOnDelete();
|
||||
$table->string('title');
|
||||
$table->longText('content')->nullable();
|
||||
$table->json('snapshot');
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('page_revisions');
|
||||
Schema::table('pages', function (Blueprint $table): void {
|
||||
$table->dropConstrainedForeignId('locked_by');
|
||||
$table->dropColumn(['template', 'expires_at', 'preview_token', 'locked_at']);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
@@ -10,22 +10,55 @@ use Modules\Pages\Models\Page;
|
||||
|
||||
final class PageController extends Controller
|
||||
{
|
||||
public function index(): View { return view('pages::admin.index', ['records' => Page::query()->latest()->paginate(20)]); }
|
||||
public function create(): View { return view('pages::admin.form'); }
|
||||
public function store(Request $request): RedirectResponse { $data = $request->validate(['title' => ['required', 'string', 'max:255'],
|
||||
public function index(): View
|
||||
{
|
||||
return view('pages::admin.index', ['records' => Page::query()->latest()->paginate(20)]);
|
||||
}
|
||||
|
||||
public function create(): View
|
||||
{
|
||||
return view('pages::admin.form');
|
||||
}
|
||||
|
||||
public function store(Request $request): RedirectResponse
|
||||
{
|
||||
$data = $request->validate(['title' => ['required', 'string', 'max:255'],
|
||||
'slug' => ['required', 'string', 'max:255'],
|
||||
'summary' => ['nullable', 'string'],
|
||||
'content' => ['nullable', 'string'],
|
||||
'status' => ['required', 'string', 'max:255'],
|
||||
'published_at' => ['nullable', 'date'],
|
||||
'is_home' => ['sometimes', 'boolean']]); $data['is_home'] = $request->boolean('is_home'); Page::create($data); return redirect()->route('pages.index')->with('status', 'Page created.'); }
|
||||
public function edit(Page $page): View { return view('pages::admin.form', ['record' => $page]); }
|
||||
public function update(Request $request, Page $page): RedirectResponse { $data = $request->validate(['title' => ['required', 'string', 'max:255'],
|
||||
'is_home' => ['sometimes', 'boolean']]);
|
||||
$data['is_home'] = $request->boolean('is_home');
|
||||
Page::create($data);
|
||||
|
||||
return redirect()->route('pages.index')->with('status', 'Page created.');
|
||||
}
|
||||
|
||||
public function edit(Page $page): View
|
||||
{
|
||||
return view('pages::admin.form', ['record' => $page]);
|
||||
}
|
||||
|
||||
public function update(Request $request, Page $page): RedirectResponse
|
||||
{
|
||||
$data = $request->validate(['title' => ['required', 'string', 'max:255'],
|
||||
'slug' => ['required', 'string', 'max:255'],
|
||||
'summary' => ['nullable', 'string'],
|
||||
'content' => ['nullable', 'string'],
|
||||
'status' => ['required', 'string', 'max:255'],
|
||||
'published_at' => ['nullable', 'date'],
|
||||
'is_home' => ['sometimes', 'boolean']]); $data['is_home'] = $request->boolean('is_home'); $page->update($data); return redirect()->route('pages.index')->with('status', 'Page updated.'); }
|
||||
public function destroy(Page $page): RedirectResponse { $page->delete(); return back()->with('status', 'Page deleted.'); }
|
||||
'is_home' => ['sometimes', 'boolean']]);
|
||||
$data['is_home'] = $request->boolean('is_home');
|
||||
$page->update($data);
|
||||
|
||||
return redirect()->route('pages.index')->with('status', 'Page updated.');
|
||||
}
|
||||
|
||||
public function destroy(Page $page): RedirectResponse
|
||||
{
|
||||
$page->delete();
|
||||
|
||||
return back()->with('status', 'Page deleted.');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,17 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Pages\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\View\View;
|
||||
use Modules\Pages\Models\Page;
|
||||
final class PublicPageController extends Controller { public function show(string $slug): View { $page=Page::query()->where('slug',$slug)->where('status','published')->where(fn($q)=>$q->whereNull('published_at')->orWhere('published_at','<=',now()))->firstOrFail(); return view('pages::public.show',compact('page')); } }
|
||||
|
||||
final class PublicPageController extends Controller
|
||||
{
|
||||
public function show(string $slug): View
|
||||
{
|
||||
$page = Page::query()->where('slug', $slug)->where('status', 'published')->where(fn ($q) => $q->whereNull('published_at')->orWhere('published_at', '<=', now()))->firstOrFail();
|
||||
|
||||
return view('pages::public.show', compact('page'));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,19 +5,23 @@ namespace Modules\Pages\Models;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
use Modules\Workflow\Concerns\HasWorkflow;
|
||||
use Modules\Localization\Concerns\HasTranslations;
|
||||
use Modules\Sites\Concerns\BelongsToSites;
|
||||
use Modules\Workflow\Concerns\HasWorkflow;
|
||||
|
||||
final class Page extends Model
|
||||
{
|
||||
use BelongsToSites, HasFactory, HasTranslations, HasWorkflow, SoftDeletes;
|
||||
protected $table = 'pages';
|
||||
protected $fillable = ['title', 'slug', 'summary', 'content', 'status', 'published_at', 'is_home'];
|
||||
|
||||
protected function casts(): array { return [
|
||||
'published_at' => 'datetime',
|
||||
'is_home' => 'boolean'
|
||||
]; }
|
||||
|
||||
protected $table = 'pages';
|
||||
|
||||
protected $fillable = ['title', 'slug', 'summary', 'content', 'status', 'published_at', 'is_home'];
|
||||
|
||||
protected function casts(): array
|
||||
{
|
||||
return [
|
||||
'published_at' => 'datetime',
|
||||
'is_home' => 'boolean',
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,9 +2,10 @@
|
||||
|
||||
use Illuminate\Support\Facades\Route;
|
||||
use Modules\Pages\Http\Controllers\PageController;
|
||||
use Modules\Pages\Http\Controllers\PublicPageController;
|
||||
|
||||
Route::middleware(['auth', 'verified'])->prefix('administration/pages')->name('administration.pages.')->group(function (): void {
|
||||
Route::resource('/', PageController::class)->parameters(['' => 'page'])->except('show');
|
||||
});
|
||||
|
||||
Route::get('/pages/{slug}', [Modules\Pages\Http\Controllers\PublicPageController::class, 'show'])->name('pages.public.show');
|
||||
Route::get('/pages/{slug}', [PublicPageController::class, 'show'])->name('pages.public.show');
|
||||
|
||||
@@ -2,4 +2,6 @@
|
||||
|
||||
use Illuminate\Support\Facades\Route;
|
||||
|
||||
it('registers the Pages administration route', function (): void { expect(Route::has('administration.pages.index'))->toBeTrue(); });
|
||||
it('registers the Pages administration route', function (): void {
|
||||
expect(Route::has('administration.pages.index'))->toBeTrue();
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user