B2in Interior: Relaunch der Website, Kernmarken-CMS und Terminanfrage
Umsetzung von AP0-AP6 aus dev/2026-08-28/entwicklungsplan.md sowie der vorab gefundenen Befunde T1 und B1-B13. Befunde - CmsContentSeeder überschrieb bei jedem Lauf alle redaktionellen Inhalte; jetzt Redaktionsschutz plus gezielter Relaunch-Seeder (B1) - Magazin-CMS war nicht ans Frontend angebunden, Artikel jetzt über Slugs mit 301 von den alten numerischen URLs (B2) - Vier veröffentlichte Display-Playlists zeigten auf b2in.test und wären live nicht ladbar gewesen (B13) - Info-Tablet speicherte geleerte Öffnungszeiten nicht (T1) - /service und /portfolio lieferten seit Februar 500 (B12) Website - Startseite neu strukturiert und umgetextet, eigene Seite /marken mit Detailseite je Kernmarke, /netzwerk und Altrouten leiten dorthin - Galerie je Marke, getrennt nach realisierten Projekten und Visualisierungen; ohne gesetzte Kategorie gilt ein Bild als Entwurf - Seite /referenzen, gespeist aus den Markengalerien - Showroom-Display im 9:16-Rahmen über eine schreibgeschützte Embed-Route ohne Preview-Token - Terminanfrage-Widget auf allen Seiten, Markenauswahl aus dem CMS, WhatsApp per Klick-zum-Chat-Link mit vorbereitetem Text - FAQ, Über-uns, Kontakt und Magazin inhaltlich auf Interior umgestellt Sonstiges - Vorschau-Instanzen liefern noindex und verlinken sich bei unbekanntem Host auf sich selbst statt auf eine fremde Domain - Seeder-Zugangsdaten aus dem Code in die Konfiguration (B8) - Ablauf für die Vorschau: dev/2026-08-28/preview-deployment.md 833 Tests grün (3084 Assertions), Pint sauber. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
193d37b1ce
commit
6d53243ea6
132 changed files with 8672 additions and 335 deletions
|
|
@ -91,6 +91,7 @@ Route::middleware(['auth', 'partner.setup'])->group(function () {
|
|||
Volt::route('admin/flux-cms/projects', 'admin.cms.projects-index')->name('cms.projects.index');
|
||||
Volt::route('admin/flux-cms/media', 'admin.cms.media-index')->name('cms.media.index');
|
||||
Volt::route('admin/flux-cms/articles', 'admin.cms.articles-index')->name('cms.articles.index');
|
||||
Volt::route('admin/flux-cms/brands', 'admin.cms.brands-index')->name('cms.brands.index');
|
||||
|
||||
// Documentation
|
||||
Volt::route('admin/documentation', 'admin.documentation')->name('admin.documentation');
|
||||
|
|
|
|||
|
|
@ -75,11 +75,13 @@ Route::get('/immobilien/{slug}', function (Request $request, string $slug) use (
|
|||
return view('web.dev.immobilien-azizi-show', compact('content', 'project', 'dev', 'devQuery', 'overviewRouteName'));
|
||||
})->name('immobilien.show');
|
||||
|
||||
// Die Netzwerk-Seite geht im Abschnitt "Mehr als Marken: unser Netzwerk" auf /marken auf.
|
||||
// Alte Links und Rankings laufen per 301 dorthin; die View bleibt als Archiv liegen.
|
||||
Route::get('/netzwerk', function () {
|
||||
return view('web.netzwerk');
|
||||
return redirect('/marken', 301);
|
||||
})->name('netzwerk');
|
||||
Route::get('/interior', function () {
|
||||
return redirect('/netzwerk', 301);
|
||||
return redirect('/marken', 301);
|
||||
})->name('interior');
|
||||
|
||||
/*Route::get('/immobilien/{slug}', function (string $slug) {
|
||||
|
|
@ -100,24 +102,61 @@ Route::get('/interior', function () {
|
|||
})->name('immobilien.show');
|
||||
*/
|
||||
Route::get('/partner', function () {
|
||||
return redirect('/netzwerk', 301);
|
||||
return redirect('/marken', 301);
|
||||
})->name('partner');
|
||||
Route::get('/magazin', function () {
|
||||
return view('web.magazin');
|
||||
})->name('magazin');
|
||||
Route::get('/magazin/{id}', function ($id) {
|
||||
return view('web.magazin-detail', compact('id'));
|
||||
// Alte numerische Magazin-URLs (/magazin/1 … /magazin/5) dauerhaft auf den Slug umleiten.
|
||||
// Muss vor der Slug-Route stehen, sonst wuerde diese die Ziffern selbst schlucken.
|
||||
Route::get('/magazin/{id}', function (string $id) {
|
||||
$slug = \App\Models\CmsArticle::slugForLegacyId($id);
|
||||
abort_unless($slug !== null, 404);
|
||||
|
||||
return redirect()->route('magazin.detail', ['slug' => $slug], 301);
|
||||
})->whereNumber('id')->name('magazin.detail.legacy');
|
||||
|
||||
Route::get('/magazin/{slug}', function (string $slug) {
|
||||
return view('web.magazin-detail', compact('slug'));
|
||||
})->name('magazin.detail');
|
||||
// Kernmarken: Uebersichtsseite und Detailseite je Marke.
|
||||
Route::get('/marken', function () {
|
||||
return view('web.marken');
|
||||
})->name('marken');
|
||||
|
||||
Route::get('/marken/{slug}', function (string $slug) {
|
||||
$brands = \App\Models\CmsBrand::forFrontend();
|
||||
abort_unless(isset($brands[$slug]), 404);
|
||||
|
||||
$brand = $brands[$slug];
|
||||
$brandTitle = $brand['name'].' – '.$brand['tagline'].' | B2in Interior';
|
||||
$brandDescription = trim(strip_tags((string) $brand['teaser']));
|
||||
|
||||
return view('web.marken-show', compact('slug', 'brandTitle', 'brandDescription'));
|
||||
})->name('marken.show');
|
||||
|
||||
// Referenzen: realisierte Projekte aus den Markengalerien plus der Showroom-Feed.
|
||||
Route::get('/referenzen', function () {
|
||||
return view('web.referenzen');
|
||||
})->name('referenzen');
|
||||
|
||||
// Schreibgeschuetzte Einbettung eines Displays (nur veroeffentlichte Playlists, kein Token).
|
||||
Route::get('/embed/display/{display}', [\App\Http\Controllers\DisplayEmbedController::class, 'show'])
|
||||
->name('display.embed');
|
||||
|
||||
Route::get('/contact', function () {
|
||||
return view('web.contact');
|
||||
})->name('contact');
|
||||
|
||||
// Verwaiste Seiten: ihre Content-Sektionen (hero_image, content_section_left/right, portfolio)
|
||||
// existieren in keiner Lang-Datei mehr und die Seiten liefern seitdem 500. Sie werden wie die
|
||||
// anderen stillgelegten Seiten dauerhaft umgeleitet; die Views bleiben als Archiv liegen.
|
||||
Route::get('/service', function () {
|
||||
return view('web.service');
|
||||
return redirect('/marken', 301);
|
||||
})->name('service');
|
||||
|
||||
Route::get('/portfolio', function () {
|
||||
return view('web.portfolio');
|
||||
return redirect('/immobilien', 301);
|
||||
})->name('portfolio');
|
||||
|
||||
Route::get('/faq', function () {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue