36 lines
1.8 KiB
PHP
36 lines
1.8 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Admin;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\CmsPage;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Str;
|
|
use Illuminate\Validation\Rule;
|
|
|
|
final class CmsPageController extends Controller
|
|
{
|
|
public function index() { return view('admin.cms.index', ['pages' => CmsPage::latest()->paginate(25)]); }
|
|
public function create() { return view('admin.cms.form', ['page' => new CmsPage()]); }
|
|
public function store(Request $request) { $page = CmsPage::create($this->validated($request)); return redirect()->route('admin.cms.edit', $page)->with('status', 'Page created.'); }
|
|
public function edit(CmsPage $page) { return view('admin.cms.form', compact('page')); }
|
|
public function update(Request $request, CmsPage $page) { $page->update($this->validated($request, $page)); return back()->with('status', 'Page updated.'); }
|
|
public function destroy(CmsPage $page) { $page->delete(); return redirect()->route('admin.cms.index')->with('status', 'Page deleted.'); }
|
|
|
|
private function validated(Request $request, ?CmsPage $page = null): array
|
|
{
|
|
$request->merge(['slug' => Str::slug($request->input('slug') ?: $request->input('title', ''))]);
|
|
$data = $request->validate([
|
|
'title' => ['required','string','max:160'],
|
|
'slug' => ['required','string','max:180', Rule::unique('cms_pages','slug')->ignore($page?->id)],
|
|
'excerpt' => ['nullable','string','max:1000'],
|
|
'body' => ['required','string'],
|
|
'meta_title' => ['nullable','string','max:160'],
|
|
'meta_description' => ['nullable','string','max:320'],
|
|
]);
|
|
$data['is_published'] = $request->boolean('is_published');
|
|
$data['published_at'] = $data['is_published'] ? ($page?->published_at ?? now()) : null;
|
|
return $data;
|
|
}
|
|
}
|