CMS: Standorte an der Marke, Seitenbaum mit Vorschau, Referenzen-Modul

Nachtrag 11: Herkunfts-Sektion liest Ort, Entfernung und Rolle aus der
Markenverwaltung (drei neue Felder an cms_brands, BrandOriginSeeder),
Kartenpositionen im Code, „Marken“ in der Sidebar.

Nachtrag 12: Inhalte-Editor zeigt die Seiten der Website mit ihren
Sektionen in Reihenfolge (config/cms_pages.php, CmsPageTree), Felder in
Klartext, fehlende Sektionen aus der Sprachdatei anlegbar, Vorschau der
echten Seite im iframe mit Sprung zur Sektion; Anker an allen lebenden
Sektionen nachgezogen.

Nachtrag 13: Referenzen als eigenes Modul (CmsReference, Portal-Seite,
/referenzen mit Fallback auf die Markengalerien); Immobilien-Projekte
aus Sidebar und CMS-Übersicht genommen, Route bleibt.

Dazu .gitignore für _b2in_interior_shop/ und docs/.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-09-15 14:58:45 +00:00
parent 7953a8c9a1
commit 90aa079cf7
50 changed files with 2580 additions and 324 deletions

View file

@ -0,0 +1,37 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
/**
* Fertigungsort je Kernmarke (Nachtrag 11 zu Arbeitsplan 14.09.2026, Punkt 1.3).
*
* Die Herkunfts-Sektion „Aus der Region gefertigt“ holt ihre Standorte nicht mehr aus einem
* JSON-Eintrag im generischen Inhalte-Editor, sondern aus der Markenverwaltung: Marcel pflegt
* Ort, Entfernung und Rolle direkt bei der Marke. Die Kartenpositionen bleiben im Code.
*
* - `origin_city` Fertigungsort, z. B. „Bünde“ – leer bedeutet: Marke erscheint nicht in der Sektion
* - `origin_distance` Entfernung ab Bielefeld als Text, z. B. „rund 30 km“
* - `origin_role` Ein Satz zur Rolle des Standorts
*
* Alle drei sind übersetzbar wie die übrigen Textfelder der Marke.
*/
return new class extends Migration
{
public function up(): void
{
Schema::table('cms_brands', function (Blueprint $table) {
$table->json('origin_city')->nullable()->after('showroom');
$table->json('origin_distance')->nullable()->after('origin_city');
$table->json('origin_role')->nullable()->after('origin_distance');
});
}
public function down(): void
{
Schema::table('cms_brands', function (Blueprint $table) {
$table->dropColumn(['origin_city', 'origin_distance', 'origin_role']);
});
}
};

View file

@ -0,0 +1,44 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
/**
* Referenzprojekte der Interior-Welt (Nachtrag 13).
*
* AP5 hatte die Referenzen aus den Markengalerien zusammengesammelt, um keine zweite Pflegestelle
* zu schaffen. Abstimmung 15.09.: Marcel soll Referenzen als eigene Einträge pflegen – ein
* realisiertes Projekt hat mehr als ein Bild und mehr als eine Marke. Solange kein Eintrag
* existiert, greift das Frontend weiter auf die Markengalerien zurück.
*
* - `title`, `description` übersetzbar
* - `location`, `year` Ort und Jahr als Text („Bielefeld“, „2025“)
* - `image` Titelbild (Dateiname aus der Medienbibliothek)
* - `gallery` weitere Bilder mit Bildunterschrift
* - `brand_slugs` beteiligte Kernmarken (Slugs aus cms_brands), verlinkt auf die Markenseiten
*/
return new class extends Migration
{
public function up(): void
{
Schema::create('cms_references', function (Blueprint $table) {
$table->id();
$table->json('title');
$table->string('location')->nullable();
$table->string('year', 20)->nullable();
$table->json('description')->nullable();
$table->string('image')->nullable();
$table->json('gallery')->nullable();
$table->json('brand_slugs')->nullable();
$table->boolean('is_published')->default(true);
$table->integer('order')->default(0);
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('cms_references');
}
};