Files
ABSDEV/Modules/Content/Http/Controllers/ContentDocumentController.php
T
Mark Gregory c972808d0a hasComposition()
* renderRegion()
* draft and published-state handling
* document and placement scheduling
* disabled-placement filtering
* ordered region rendering
* safe fallback when composition tables or document views are missing
* compatibility with common alternative column names
2026-07-27 09:43:42 +01:00

69 lines
3.0 KiB
PHP

<?php
declare(strict_types=1);
namespace Modules\Content\Http\Controllers;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\View\View;
use Modules\Content\Http\Requests\SaveContentDocumentRequest;
use Modules\Content\Models\ContentDocument;
use Modules\Content\Models\ContentType;
final class ContentDocumentController extends Controller
{
public function index(Request $request): View
{
$documents = ContentDocument::query()->with(['type','placements'])
->when($request->filled('search'), fn ($q) => $q->where(fn ($q) => $q->where('title','like','%'.$request->string('search').'%')->orWhere('slug','like','%'.$request->string('search').'%')))
->when($request->filled('type'), fn ($q) => $q->whereHas('type', fn ($q) => $q->where('key',$request->string('type'))))
->when($request->filled('status'), fn ($q) => $q->where('status',$request->string('status')))
->latest()->paginate(25)->withQueryString();
return view('content::admin.index', ['documents'=>$documents, 'types'=>ContentType::orderBy('name')->get()]);
}
public function create(Request $request): View
{
$types = ContentType::orderBy('name')->get();
$selectedType = $types->firstWhere('id', (int) $request->integer('type')) ?? $types->first();
return view('content::admin.form', ['document'=>new ContentDocument(['status'=>'draft','content_type_id'=>$selectedType?->id]), 'types'=>$types, 'selectedType'=>$selectedType]);
}
public function store(SaveContentDocumentRequest $request): RedirectResponse
{
$document = ContentDocument::create($request->payload());
return redirect()->route('content.documents.edit',$document)->with('status','Content document created.');
}
public function edit(ContentDocument $document): View
{
$document->load('placements');
return view('content::admin.form', ['document'=>$document, 'types'=>ContentType::orderBy('name')->get(), 'selectedType'=>$document->type()->first()]);
}
public function update(SaveContentDocumentRequest $request, ContentDocument $document): RedirectResponse
{
$document->update($request->payload());
return back()->with('status','Content document saved.');
}
public function duplicate(ContentDocument $document): RedirectResponse
{
$copy = $document->replicate(['slug']);
$copy->title = $document->title.' copy';
$copy->slug = str($copy->title)->slug().'-'.str()->lower(str()->random(6));
$copy->status = 'draft';
$copy->save();
return redirect()->route('content.documents.edit',$copy)->with('status','Independent copy created.');
}
public function destroy(ContentDocument $document): RedirectResponse
{
abort_if($document->placements()->exists(), 422, 'A document used by a page cannot be deleted.');
$document->delete();
return redirect()->route('content.index')->with('status','Content document deleted.');
}
}