OpenCart 3.0.5 Journal3 3.28 PHP 8.x v1.7

GLS PickUP Hungary
Szállítási Modul

GLS csomagpont és csomagautomata választó szállítási modul OpenCart 3.0.5 webshopokhoz, Journal3 és alap OC3 pénztárral egyaránt. Telepítés után azonnal működik – nincs szükség checkout módosításra.

Mit csinál?

A modul egy kereshető dropdown listát jelenít meg a pénztárban, amelyből a vásárló kiválaszthatja a kívánt GLS csomagpontot vagy automatát. A szállítási cím automatikusan a kiválasztott pont adataira cserélődik a rendelésben – az email kiküldése előtt.

  • GLS parcel shop és parcel locker helyek dropdown listában, városonként csoportosítva
  • A szállítási mód kizárólag akkor számít kiválasztottnak, ha konkrét pont van megjelölve – placeholder esetén a GLS nem aktív, a rendelés nem adható le ezzel a móddal
  • Másik szállítási módra váltáskor a csomagpont-választás automatikusan visszaáll a placeholderre
  • A rendelés leadása után a szállítási cím mezők automatikusan felülíródnak a kiválasztott pont adataival (utca, város, irányítószám, GLS azonosító)
  • Beállítható szállítási költség, ingyenes küszöb, maximum súly és méret
  • A csomagpont lista az admin felületről egy gombbal frissíthető a GLS API-ról
  • Működik Journal3 QuickCheckout és alap OC3 pénztárban egyaránt

A modul önellátó: semmilyen checkout controller, footer vagy OCMod fájlmódosítás nem szükséges – a JS automatikusan töltődik be, ha a GLS szállítási mód elérhető.

Hogyan működik?

Pénztár folyamata (vásárlói oldal)

1

JS betöltés

Az OC3 meghívja a getQuote() metódust. Ha a GLS szállítási mód elérhető (geo-zone, súly, méret megfelel), a modell $this→document→addScript('glshu.js') hívással beinjektálja a scriptet az oldalba – OCMod vagy checkout módosítás nélkül.

2

Dropdown injektálás

A glshu.js MutationObserver-rel figyeli a DOM-ot. Amint a GLS radio megjelenik, egyszer letölti az AJAX endpointról (extension/shipping/glshu/getPoints) a dropdown HTML-t, és JS változóban cache-eli – DOM újrarajzoláskor (pl. Journal3 recalculation) nincs újabb szerverhívás.

3

Csomagpont választás

A vásárló kiválaszt egy pontot a dropdownból. A JS beállítja a rejtett radio értékét (glshu.glshu{place_id}), checked=true-ra állítja, és Journal3-ban meghívja a _QuickCheckout.save()-t – a session frissül a pontos kóddal. Az utolsó érvényes választást a glshuLastSelected változó tárolja, hogy DOM újrarajzolás után is visszaállítható legyen.

4

Placeholder vagy módváltás esetén

Ha a vásárló visszavált a placeholderre, vagy másik szállítási módot választ, a GLS radio checked=false lesz, és a select visszaáll a placeholderre. Az OC3 / QuickCheckout „nincs szállítási mód" állapotot lát, és természetesen megakadályozza a rendelés leadását.

Cím frissítés folyamata (rendelés után)

1

Rendelés létrejön

A catalog/model/checkout/order::addOrder() lefut – a szállítási cím ekkor még a vásárló saját lakcíme.

2

Event handler

Az OC3 event rendszere az addOrder/after horgon meghívja az event/glshu_order::afterAddOrder() metódust. Az event az oc_event táblában van regisztrálva, az install() futásakor kerül oda.

3

Cím felülírás

A handler kiolvas a sessionből a glshu.glshu{place_id} kódot, DB-ből lekéri a csomagpont adatait, majd SQL UPDATE-tel felülírja az oc_order tábla négy mezőjét. A shipping_firstname, shipping_lastname, shipping_company mezők érintetlenek maradnak.

4

Megerősítő email

Az OC3 ezután küldi ki a megerősítő emailt – már a csomagpont adataival.

Rendelésbe kerülő cím mezők

Mező (oc_order)Tartalom
shipping_address_1Csomagpont utca + házszám
shipping_address_2GLS azonosító | Csomagpont neve (pl. H1234 | GLS CityPoint)
shipping_cityCsomagpont városa
shipping_postcodeCsomagpont irányítószáma

Adatbázis tábla (oc_z_glshu)

MezőTípusLeírás
place_idINT(6) AUTO_INCREMENT PKBelső azonosító
nameVARCHAR(50)Csomagpont neve
cityVARCHAR(25)Város (nagybetűs)
pcodeVARCHAR(4)Irányítószám
addressVARCHAR(50)Utca, házszám
countryVARCHAR(10)Ország (pl. Hungary)
typeVARCHAR(20)parcel-shop vagy parcel-locker
idVARCHAR(25)GLS belső azonosító (pl. H1234)
sortVARCHAR(3)Sorrend (jelenleg fix: 1)

Event regisztráció

Az install() az alábbi rekordot írja az oc_event táblába:

MezőÉrték
codeglshu_order_address_fix
triggercatalog/model/checkout/order/addOrder/after
actionevent/glshu_order/afterAddOrder
status1 (aktív)
Fontos: Az event csak az install() futtatásakor kerül be – ez automatikusan lefut, amikor az admin felületen aktiválod a modult. Ha korábban telepítve volt, először kapcsold ki (Disable), majd kapcsold vissza (Enable).

Követelmények

KomponensVerzióStátusz
OpenCart3.0.5 Tesztelt
Journal3 téma3.28 Tesztelt – QuickCheckout + alap OC3 pénztár
PHP8.0, 8.1, 8.2 Kompatibilis
MySQL / MariaDBbármely aktuális MyISAM engine a csomagpont táblához
allow_url_fopenPHP beállítás Szükséges a GLS API eléréséhez
Az allow_url_fopen legtöbb tárhelyen alapértelmezetten be van kapcsolva. Ha a csomagpont frissítés nem működik, ellenőrizd ezt a beállítást.

1. Fájlok feltöltése

Töltsd fel az összes fájlt FTP / SFTP-vel a webshop gyökérkönyvtárába. A mappastruktúra megfelel a szerver struktúrájának – egyszerű 1:1 másolás.

upload/
├── admin/→ webshop gyökér/admin/
└── catalog/→ webshop gyökér/catalog/
install.xml→ webshop gyökér/
Meglévő fájlok felülírása szándékos – frissítés esetén így kerülnek be az újabb verziók. Az adatbázis tartalmát ez nem érinti.

2. OCMod frissítés

1

Megnyitás

Admin → Extensions → Modifications

2

Refresh

Kattints a Refresh gombra (jobbra fent, kék ikon). Az OC3 feldolgozza az install.xml-t és frissíti a módosítás gyorsítótárat.

Az install.xml jelenleg üres módosítást tartalmaz – ez normális. A Refresh mégis szükséges, hogy az OC3 regisztrálja az extension-t.

3. Aktiválás az admin felületen

1

Navigálás

Admin → Extensions → Extensions → Shipping

2

Install

Keresd meg a GLS PickUP sort a listában, majd kattints az Install gombra (zöld + ikon). Ez lefuttatja az install() metódust:

  • Létrehozza az oc_z_glshu táblát (CREATE TABLE IF NOT EXISTS)
  • Beregisztrálja a cím frissítő eventet az oc_event táblában
  • Letölti a GLS csomagpont adatait az API-ról
3

Edit

Kattints az Edit gombra (ceruza ikon) a beállítások megadásához.

Figyelem: Az Install lépés során a szerver letölti a GLS csomagpont adatbázist a map.gls-hungary.com API-ról. Ez néhány másodpercig tarthat – ne navigálj el az oldalról, amíg a folyamat be nem fejeződik.

4. Beállítások

BeállításLeírásAlapértelmezett
StátuszModul engedélyezése / letiltásaLetiltva
Szállítási költségGLS csomagpont szállítási ára (az üzlet alap pénznemében)0
Ingyenes fölöttEnnyi összeg felett a szállítás ingyenes. 0 = mindig fizetős0
Maximum súly (kg)Ha a kosár összsúlya meghaladja, a GLS opció nem jelenik meg40
Maximum méret (cm)Ha bármely termék leghosszabb oldala meghaladja, a GLS opció nem jelenik meg200
TípusCsak csomagpontok (parcel-shop) / Csak automaták (parcel-locker) / MindkettőCsak csomagpontok
AdóAdóosztály a szállítási díjhozNincs
TerületGeo-zone korlátozás. Ha üres, mindenütt elérhetőMinden terület
SorrendA szállítási módok listájában elfoglalt hely (kisebb = előrébb)0
A szállítási költséget az OC3 alapvalutájában add meg. A pénztárban automatikusan a vásárló pénznemére lesz átváltva az árfolyam alapján.

5. Csomagpontok frissítése

A GLS rendszeresen frissíti a csomagpont listáját. A modul beépített frissítővel rendelkezik:

1

Megnyitás

Admin → Extensions → Shipping → GLS PickUP → Edit

2

Frissítés

Kattints a sárga „Címlista frissítése" gombra (jobb felső sarok). A rendszer letölti a legfrissebb adatokat a GLS API-ról (map.gls-hungary.com/data/deliveryPoints/hu.json), törli a régi adatokat és újratölti a teljes táblát.

Figyelem: A frissítés az összes régi csomagpont adatot törli és újra feltölti. A place_id értékek megváltozhatnak – a már lezárt rendelések nem érintettek, mert azoknál a csomagpont adata az oc_order táblában van rögzítve.

Az admin beállítások oldal alján az összes elérhető csomagpont táblázatban jelenik meg a frissítés után.

Frissítés újabb verzióra

  1. Töltsd fel az új fájlokat FTP-vel (felülírja a régieket)
  2. Admin → Extensions → Modifications → Refresh
  3. Admin → Extensions → Shipping → GLS PickUP → Disable, majd Enable – ez újra futtatja az install()-t, ami frissíti az event regisztrációt
  4. Ellenőrizd a beállításokat – az értékek megmaradnak
Az install() CREATE TABLE IF NOT EXISTS-t használ, tehát a meglévő csomagpont adatokat nem törli frissítéskor.

Eltávolítás

  1. Admin → Extensions → Shipping → GLS PickUP → Uninstall (piros gomb) – törli az oc_z_glshu táblát és a glshu_order_address_fix event bejegyzést
  2. Fájlok manuális törlése a szerverről (az összes feltöltött fájl)
  3. Admin → Extensions → Modifications → Refresh
Figyelem: Az Uninstall az oc_z_glshu táblát és az összes csomagpont adatot visszavonhatatlanul törli. A korábban már lezárt rendelések szállítási adatait ez nem érinti.

Hibaelhárítás

A csomagpont dropdown nem jelenik meg a pénztárban

  • Ellenőrizd, hogy a modul státusza Engedélyezve
  • Böngésző konzolban ellenőrizd, hogy a glshu.js betöltődött-e (Network tab)
  • Ellenőrizd, hogy az oc_z_glshu táblában vannak-e sorok (Admin → Edit → csomagpont lista az oldal alján)
  • A getQuote() csak akkor tölti be a JS-t, ha a GLS szállítási mód elérhető – ellenőrizd a súly/méret limiteket és a geo-zone beállítást

A rendelés szállítási cím nem frissül a csomagpont adataira

  • Ellenőrizd az oc_event táblában, hogy létezik-e a glshu_order_address_fix sor
  • Ha nem létezik: Admin → GLS PickUP → Disable, majd Enable
  • Ellenőrizd a PHP error_log-ban, hogy van-e [GLSHU] bejegyzés rendelés leadásakor

GLS-t kiválasztva le lehet adni a rendelést csomagpont nélkül

  • A GLS csak akkor számít kiválasztottnak, ha a selectben konkrét pont van (nem placeholder). Ellenőrizd, hogy a glshu.js betöltődött-e
  • Ha a JS nem fut, a rejtett radio értéke a szerver által visszaadott alapértelmezett lehet – töltsd újra az oldalt és ellenőrizd az OCMod Refresh-t

„Címlista frissítése" gomb nem csinál semmit / fehér oldalt dob

  • Az allow_url_fopen PHP beállítás ki van kapcsolva – engedélyezd a php.ini-ben vagy a tárhely vezérlőpultban
  • Tűzfal blokkolja a map.gls-hungary.com API-t a szerver oldalon
  • PHP max_execution_time lejár – az API válasz lassú lehet, növeld az időkorlátot

Telepítéskor SQL hiba / tábla nem jön létre

  • Ellenőrizd, hogy az adatbázis felhasználónak van-e CREATE TABLE jogosultsága
  • MySQL strict mode esetén ellenőrizd a PHP error_log-ot a pontos hibaüzenetért

Nincs jogosultságod hiba az admin mentésnél

  • Admin → System → Users → User Groups → adjunk hozzá extension/shipping/glshu jogosultságot (view + modify)

Debug: event ellenőrzése adatbázisban

SQL
SELECT * FROM oc_event WHERE code = 'glshu_order_address_fix';

Ha üres az eredmény, az event nincs regisztrálva. Megoldás: Disable + Enable a modul admin felületén.

Debug: utolsó rendelések szállítási adatai

SQL
SELECT order_id, shipping_address_1, shipping_address_2, shipping_city, shipping_postcode
FROM oc_order
ORDER BY order_id DESC
LIMIT 5;

Ha a shipping_address_2 tartalmaz H1234 | GLS CityPoint formátumú adatot, az event sikeresen futott.

Általános tipp: Minden fájlfrissítés után töröld az OC3 cache-t (Admin → Dashboard → fogaskerék → Refresh) és a böngésző cache-t is (Ctrl+Shift+R).

Fájlszerkezet

upload/
├── admin/controller/extension/shipping/
│   └── glshu.phpAdmin: telepítés, beállítások, csomagpont frissítés
├── admin/language/en-gb/extension/shipping/
│   └── glshu.phpAngol nyelvfájl (admin)
├── admin/language/hu-hu/extension/shipping/
│   └── glshu.phpMagyar nyelvfájl (admin)
├── admin/view/template/extension/shipping/
│   └── glshu.twigAdmin beállítások sablon
├── catalog/controller/event/
│   └── glshu_order.phpEvent handler: cím frissítés rendelés után
├── catalog/controller/extension/shipping/
│   └── glshu.phpAJAX: csomagpont lista (getPoints) és adatok (getPointData)
├── catalog/language/*/extension/shipping/
│   └── glshu.phpNyelvfájlok (frontend) – en-gb és hu-hu
├── catalog/model/extension/shipping/
│   └── glshu.phpFő logika: getQuote(), getPoints(), JS betöltés
└── catalog/view/javascript/
    └── glshu.jsFrontend: dropdown, szinkron, select-alapú validáció
install.xmlOCMod (üres – nem módosít fájlokat, de szükséges az OC3-nak)

Fájlonkénti szerepek

FájlSzerepe
admin/controller/.../glshu.php install(): tábla létrehozása, event regisztráció, GLS adatok letöltése
uninstall(): tábla és event törlése
refresh_data(): GLS API lekérése, adatbázis feltöltése
index(): beállítások oldal
catalog/model/.../glshu.php getQuote($address): szállítási ajánlat, JS betöltés (addScript), geo-zone / súly / méret ellenőrzés, POST és session alapú place_id meghatározás
getPoints(): HTML dropdown generálása az AJAX válaszhoz; a radio display:none, a select önmaga a szállítási mód választó
catalog/controller/.../glshu.php getPoints(): AJAX endpoint – a model getPoints()-át hívja, HTML visszaadása
getPointData(): egy csomagpont JSON adatai place_id alapján
catalog/controller/event/glshu_order.php afterAddOrder(): az addOrder/after event hívja. Sessionből kiolvas, DB-ből lekéri a csomagpont adatait, UPDATE-eli az oc_order táblát
catalog/view/javascript/glshu.js 1. blokk: MutationObserver – GLS radio megjelenésekor AJAX-szal betölti a dropdown HTML-t; cache-eli JS változóban; a glshuLastSelected változó tárolja az utolsó érvényes választást, visszaállítja DOM újrarajzolás után
2. blokk: select change esemény – érvényes pont: radio.checked=true + _QuickCheckout.save(); placeholder: radio.checked=false; más szállítási mód választásakor a select visszaáll placeholderre

Változásnapló

VerzióDátumVáltozás
1.7 2026-04-15 Select-alapú szállítási mód logika: a radio gomb rejtett, a GLS kizárólag akkor számít kiválasztottnak, ha a selectben konkrét csomagpont van megjelölve. Placeholder esetén a radio checked=false – az OC3 automatikusan blokkolja a rendelés leadását. Másik szállítási módra váltáskor a select visszaáll placeholderre. glshuLastSelected változó bevezetése a DOM újrarajzolás utáni visszaállításhoz. JS validációs blokk (3. blokk) eltávolítva.
1.6 JS cache kezelés és MutationObserver alapú dropdown injektálás. Journal3 QuickCheckout integráció.
1.0 Első kiadás.