# 05_HOOK_SYSTEM.md

# Hook rendszer

## Bevezetés

A Hook rendszer lehetővé teszi,
hogy egy modul módosítsa vagy kibővítse az oldal működését
anélkül, hogy a meglévő kódot módosítani kellene.

Ez a CMS egyik legfontosabb bővíthetőségi eleme.

---

# Mi a Hook?

A Hook egy előre definiált esemény.

Például:

head

before_header

after_header

before_content

after_content

before_footer

after_footer

Amikor a rendszer elér egy ilyen pontot,
megnézi,

szeretne-e valamelyik modul itt megjelenni.

Ha igen,

lefuttatja.

---

# Egyszerű példa

A site.php:

```php
<?= Hook::run('before_footer') ?>
```

Ez önmagában nem csinál semmit.

Csak azt mondja:

"Mielőtt kirajzolom a footert,
megkérdezem,
akar-e valaki ide HTML-t beszúrni."

---

# Hogyan működik?

Valamelyik modul ezt mondja:

```php
Hook::register(
    'before_footer',
    function () {

        return '<div>...</div>';

    }
);
```

Ezzel feliratkozik.

Amikor később lefut:

```php
Hook::run('before_footer');
```

a callback meghívódik.

---

# A folyamat

Popup

↓

Hook::register()

↓

Hook::$hooks

↓

...

↓

site.php

↓

Hook::run()

↓

Popup HTML

---

# Mi történik belül?

A Hook egy listát tart fenn.

Például:

```php
[
    'before_footer'=>[
        callback1,
        callback2,
        callback3
    ]
]
```

Amikor:

```php
Hook::run('before_footer');
```

lefut,

végigmegy rajta:

```php
foreach(...)
```

és meghívja az összes callbacket.

---

# Miért callback?

A callback nem fut le azonnal.

Csak eltárolódik.

Például:

```php
Hook::register(

    'head',

    function(){

        return "...";

    }

);
```

Ez még nem jelenik meg.

Csak vár.

Majd később:

```php
Hook::run('head');
```

meghívja.

---

# Miért jobb ez?

Hook nélkül:

```php
<?= popup() ?>

<?= chat() ?>

<?= analytics() ?>

<?= newsletter() ?>

<?= cookie() ?>

<?= survey() ?>
```

Minden új modulnál új sor.

Hookkal:

```php
<?= Hook::run('before_footer') ?>
```

Soha nem kell módosítani.

---

# Példa

Popup

↓

before_footer

Chat

↓

before_footer

Survey

↓

before_footer

↓

Hook::run()

↓

Popup

↓

Chat

↓

Survey

---

# A Hook nem ismeri a modulokat

A Hook nem tudja:

mi az a Popup

mi az a Chat

mi az a Survey

Csak callbackeket tárol.

Ezért teljesen általános.

---

# Miért static?

Pont ugyanazért,

mint az AssetService.

Minden modul ugyanazt a Hook listát használja.

Ha nem lenne static,

minden modul saját Hook listát vezetne.

A rendszer nem tudná őket összegyűjteni.

---

# Mikor használjunk Hookot?

Ha egy modul automatikusan szeretne megjelenni.

Például:

Marketing Popup

Cookie figyelmeztetés

Chat widget

Analytics

Facebook Pixel

Cookie Consent

Live Chat

Newsletter

Floating Button

---

# Mikor NE használjunk Hookot?

Ha a felhasználó dönt arról,
hol jelenjen meg.

Például:

Gallery

Video

Documents

FAQ

Contact

Ezek shortcode-ok.

---

# Hook és Shortcode

Sokan összekeverik.

Pedig teljesen más.

Hook

↓

A rendszer dönti el,
hol fut le.

Shortcode

↓

A szerkesztő dönti el,
hol jelenjen meg.

---

# Hook és AssetService

Szintén hasonlóak.

AssetService

↓

Fájlokat gyűjt.

Hook

↓

Függvényeket gyűjt.

Mindkettő registry.

---

# Hook életútja

Modul

↓

register()

↓

Hook::$hooks

↓

...

↓

site.php

↓

run()

↓

callback()

↓

HTML

---

# A jelenlegi Hook pontok

head

A HEAD végén.

---

before_header

A fejléc előtt.

---

after_header

A fejléc után.

---

before_content

A tartalom előtt.

---

after_content

A tartalom után.

---

before_footer

A footer előtt.

---

after_footer

A footer után.

---

# Jövőbeli Hookok

before_gallery

after_gallery

before_video

after_video

before_contact

after_contact

before_sidebar

after_sidebar

before_menu

after_menu

---

# Hook fejlesztési szabályok

A Hook:

✓ nem ír adatbázist

✓ nem tartalmaz üzleti logikát

✓ csak callbackeket tárol

✓ nem ismeri a modulokat

✓ általános célú

Ez biztosítja,

hogy a CMS bővíthető marad.
