# CMS Architecture

## Verzió

1.0

---

# Bevezetés

Ez a CMS nem egy hagyományos weboldal, hanem egy moduláris rendszer, amelynek célja, hogy ugyanazzal a motorral lehessen:

- egyszerű céges weboldalt készíteni
- landing page-et készíteni
- többoldalas weboldalt készíteni
- webshopot készíteni
- később akár portált is készíteni

A rendszer minden eleme modulokra épül.

Minden modul ugyanazt a felépítést követi.

Ez jelentősen megkönnyíti az új funkciók fejlesztését és a rendszer karbantartását.

---

# A rendszer filozófiája

A CMS egyik legfontosabb célja:

**Minden feladatnak egyetlen felelőse legyen.**

Ez a "Single Responsibility Principle".

Példák:

GalleryService
→ csak galériákkal foglalkozik.

VideoService
→ csak videókkal foglalkozik.

DocumentService
→ csak dokumentumokkal foglalkozik.

ThemeService
→ csak a megjelenítést koordinálja.

AssetService
→ csak a CSS és JS állományokat gyűjti.

Hook
→ csak eseményeket kezel.

ShortcodeParser
→ csak shortcode-okat dolgoz fel.

Ennek eredményeként az osztályok kicsik maradnak,
egyszerűbb őket megérteni és tesztelni.

---

# A rendszer rétegei

A CMS több egymásra épülő rétegből áll.

```

Browser

↓

Routes

↓

Controller

↓

ThemeService

↓

PageResolver

↓

Service

↓

Layout

↓

AssetService

↓

site.php

↓

HTML

```

Minden rétegnek saját feladata van.

---

# Browser

A böngésző HTTP kérést küld.

Példa:

```

https://domain.hu/munkaink

```

---

# Routes

A Route dönti el,
melyik Controller kezelje a kérést.

Példa:

```

/munkaink

↓

Page::show()

```

A Route nem végez üzleti logikát.

Csak továbbít.

---

# Controller

A Controller feladata:

- paraméterek fogadása
- Service meghívása
- ThemeService meghívása

A Controller nem ír HTML-t.

A Controller nem épít CSS-t.

A Controller nem dolgozza fel az adatokat.

A Controller csak koordinál.

---

# ThemeService

A ThemeService a teljes publikus oldal központja.

Feladata:

- aktuális téma meghatározása
- menü betöltése
- beállítások betöltése
- logó betöltése
- layout kiválasztása
- content átadása a site.php részére

A ThemeService nem készít tartalmat.

Csak összerakja az oldalt.

---

# PageResolver

A PageResolver feladata:

megállapítani,

hogy egy URL:

- CMS oldal
- statikus oldal
- 404

Ha CMS oldal,
akkor meghívja a Dynamic Block rendszert.

---

# Service

Minden modul saját Service osztállyal rendelkezik.

Például:

GalleryService

VideoService

DocumentService

PopupService

ContactFormService

A Service végzi az üzleti logikát.

Például:

- adatbázis lekérése
- layout kiválasztása
- AssetService értesítése
- View renderelése

---

# Layout

A Layout kizárólag a HTML megjelenítésért felel.

Nem végez adatbázis műveletet.

Nem végez üzleti logikát.

Csak megjelenít.

Példa:

layout1.php

layout2.php

layout3.php

---

# AssetService

A modulok nem írnak ki közvetlenül CSS vagy JS fájlokat.

Helyette:

GalleryService

↓

AssetService::addCss()

↓

AssetService::addJs()

↓

site.php

↓

renderCss()

↓

renderJs()

Így minden asset egyszer kerül betöltésre.

---

# site.php

Ez az oldal végső váza.

Feladata:

- HTML
- HEAD
- HEADER
- FOOTER
- Hook-ok
- Asset-ek kiírása
- Modulok HTML tartalmának megjelenítése

A site.php nem tartalmaz üzleti logikát.

---

# HTML

A böngésző végül ezt kapja meg.

Ez már teljesen renderelt oldal.

Nincs benne PHP logika.

---

# Modulok felépítése

Minden modul ugyanazt a mintát követi.

Gallery

↓

Controller

↓

Service

↓

Layout

↓

CSS

↓

JS

↓

Shortcode

↓

HTML

Ez biztosítja,
hogy minden modul ugyanúgy működjön.

---

# Miért ilyen a rendszer?

A cél nem csupán egy működő weboldal készítése.

A cél egy olyan keretrendszer létrehozása,

amelyben új modulokat minimális munkával lehessen elkészíteni.

Ezért minden modul ugyanazt a struktúrát követi.

A fejlesztés során mindig a meglévő mintát kell követni,
nem pedig új megoldást kitalálni.
