Shop Projekt - Dokumentation

Shop LDM

Teil 05: Seiten & Inhalte

Dieses Modul erweitert das Labels-Modul um strukturierte Seiteninhalte.

Während Labels für UI-Elemente (Buttons, Labels) und kurze Texte verwendet werden, ermöglicht dieses Modul die Verwaltung kompletter Seiten mit mehrsprachigen Inhalten, strukturiert in Sektionen und Inhaltstypen.

🗺️ Stufe 0 | 📚 Aktuell | 📟 2026 06 15 | 📍 Datenbank - Seiteninhalte

  • Content_section: Seiten werden in logische Sektionen unterteilt.
  • Content_type: Unterschiedliche Inhaltstypen innerhalb jeder Sektion.
  • Page_content: Alle Inhalte in allen unterstützten Sprachen.
  • v_page_render: Vereinfachte Abfrage für Seiteninhalte (Node-Content-Ansatz).
  • Beispiel: Typische Seitenstruktur mit Sektionen, Inhaltstypen und mehrsprachigen Inhalten.

HTML-freundlich: Direkte Integration in Frontend-Templates möglich.

Content_section

Zweck: Definiert strukturierte Bereiche innerhalb einer Seite.

Felder:
    - sec_ID         (PK)
    - cat_ID         (FK → Category)           -- Seite/Node zugehörigkeit
    - sec_order      INT NOT NULL DEFAULT 0    -- Reihenfolge der Sektionen
    - sec_type       VARCHAR(20)               -- HTML-Elementtyp (div, section, article)
    - sec_html_id    VARCHAR(50)               -- HTML-ID-Attribut
    - sec_class      VARCHAR(100)              -- CSS-Klassen
    - UNIQUE (cat_ID, sec_order)               -- Nur eine Sektion pro Position

Content_type

Zweck: Definiert die Art des Inhalts innerhalb einer Sektion.

Felder:
    - typ_ID          (PK)
    - sec_ID          (FK → content_section)
    - typ_is_global   BOOLEAN                  -- Ist der Inhalt für alle Sprachen gleich?
    - typ_order       INT                      -- Reihenfolge innerhalb der Sektion
    - typ_element     VARCHAR(20)              -- HTML-Element (h1, h2, p, ul, etc.)
    - typ_class       VARCHAR(100)             -- CSS-Klassen
    - UNIQUE (sec_ID, typ_order)               -- Nur ein Typ pro Position

Page_content (Realer Text)

Zweck: Speichert die tatsächlichen Inhalte in verschiedenen Sprachen.

Felder:
    - con_ID          (PK)
    - typ_ID          (FK → content_type)
    - lan_ID          (FK → language)          -- NULL = sprachunabhängig
    - con_order       INT                      -- Reihenfolge bei Mehrfacheinträgen
    - con_value       TEXT                     -- Der eigentliche Inhalt
    - UNIQUE (typ_ID, lan_ID, con_order)       -- Nur ein Inhalt pro Sprache und Reihenfolge

vw_page_render View

Zweck: Vereinfachte Abfrage für Seiteninhalte (Node-Content-Ansatz).

Felder:
    - cat_key         -- Eindeutiger Seiten-Key (z.B. 'home')
    - cat_ID          -- ID des Nodes
    - sec_ID          -- Sektion-ID
    - sec_order       -- Reihenfolge der Sektion
    - sec_type        -- HTML-Element der Sektion
    - sec_html_id     -- HTML-ID der Sektion
    - sec_class       -- CSS-Klassen der Sektion
    - typ_ID          -- Inhaltstyp-ID
    - typ_order       -- Reihenfolge des Typs
    - typ_element     -- HTML-Element des Typs
    - typ_class       -- CSS-Klassen des Typs
    - typ_is_global   -- Sprachunabhängig?
    - lan_ID          -- Sprach-ID
    - con_value       -- Der eigentliche Inhalt

Quelle:
    - FROM tb_category c
    - JOIN tb_content_section cs ON c.cat_ID = cs.cat_ID
    - JOIN tb_content_type ct ON cs.sec_ID = ct.sec_ID
    - JOIN tb_page_content pc ON ct.typ_ID = pc.typ_ID

Sortierung: ORDER BY cs.sec_order, ct.typ_order, pc.con_order

Typische Seitenstruktur (Beispiel)

page (z.B. 'about_us')
├── section 0: header
│   ├── type 0: h1
│   │     └── 0 'Über uns'
│   └── type 1: p
│         ├── 0: strong 'Willkommen'
│         └── 1: span 'Bei uns.'
├── section 1: intro
│   ├── type 0: h2
│   │     └── 0 'Unsere Geschichte'
│   ├── type 1: p
│   │     ├── 0: 'Text...'
│   │     └── 1: '...Text...'
│   └── type 2: img
│         └── 0 'team-photo.jpg'
└── section 2: team
    ├── type 0: h2
    │     └── 0 'Unser Team'
    ├── type 1: li
    │     ├── 0: ul 'Number 1'
    │     ├── 1: ul 'Number 2'
    │     ├── 2: ul 'Number 3'
    │     └── 3: ul 'Number 4'
    └── type 2: p
          └── 0 'Kontakt...'