Időzóna: (GMT +1 óra) RSS - hozzászólások

Mykee fejlesztési naplója

Szerző
Üzenet
Mykee
Gyakorlott phpBB-s
Gyakorlott phpBB-s
Avatar

Csatlakozott: 2005.08.29. Hétfő 1:00
Hozzászólások: 806
Hozzászólás Elküldve: 2017.04.26. 10:09    Hozzászólás témája:
Hozzászólás az előzmény idézésével
Pár tipp extension írásához

No lássuk a tapasztalatokat! :) Ha bármit csiszolni kellene, szóljatok!

Minden alább írt mappahivatkozás a saját extensionön belül van, tehát az ext/(saját extension) könyvtáron belül!

-----------------------------------
1. A logika

A felépítés érdekes, de hamar át lehet látni, mi mire való és mit hol hívunk meg. Kezdjük a kályhánál!

a) A kiindulópont a services.yml fájl. Itt határozod meg, hogy milyen szolgáltatásokat akarsz használni. A Skeleton Extensiont használva viszonylag jó alapot készít neked, de más extensionökből is el lehet lesni dolgokat. Fontos a sorrend! Ugyanis a szolgáltatásokat ebben a sorrendben kell betölteni a listener vagy controller __construct paraméterei közé! Ha a sorrend nem stimmel, akkor rendezd! Ha ezt a fájlt módosítod, MINDIG töröld a gyökérkönyvtárban lévő cache-ben található production mappát. Fontos, hogy csak olyan szolgáltatásokat használj, amiket tényleg igénybe veszel a kódban, felesleget ne tölts be! Persze kikerülhető az egész procedúra, ha a listenerben vagy a contstructban direktben meghívod az adott funkciót (pl. global $db, $user $template), de ez nem javasolt, erősen ajánlott azt a két percet rászánni, amíg felveszed a szolgáltatásokat.

b) a services.yml után nekiállhatsz a listenernek és a controllernek. Kezdjük az előbbivel! A listener lényege, hogy kiváltsa a korábbi beszúrásokat. A phpbb fejlesztői elég sok hookot nyitottak a kódban, csak ki kell keresni azokat! Egy MOD átírásakor olvastad, hogy melyik sort keresd meg és oda illeszd be a tied. Ez egyszerű volt anno, viszont itt egy lyukon át toljuk be a cuccot. Ennek lényege, hogy kinyitod ugyanazt a fájl és megkeresed benne az adott lyukat, ami neked megfelel. Nem lesz nehéz észrevenni, mert hatalmas kommentblokk van ott, ahol le van írva, milyen adatokat kaphatsz meg, ha kellenek. Pl. ha template változókat szeretnél mondjuk a functions.php-ban, legörgetsz oda és máris ott a hook, milyen adatokat kaphatsz meg. Mivel tömbökben kerülnek átadásra, így nincs más dolgod, mint a listenerben ezt meghívni és az adott tömböt kibővíteni a saját változóiddal és kész.
Ez tényleg ilyen egyszerű.

* Megnyitod a listener fájlod. Megnézed, hogy megvan-e minden szolgáltatás a fejben? Ha nincs, vedd fel, ahogy a többi is ott van (protected mód, __construct változó hozzáadása és sorrend figyelés, majd változó felvétele).

* Jöhet a getSubscribedEvents() lista bővítése! (Csak zárójelben: a 'core.user_setup' blokkot ne buheráld, kell a többnyelvűség betöltéséhez! Max bővítheted, de ritkán ajánlott, mert globális, userre vonatkozó beállítások futnak le ott!)
Az alábbi módon vegyél fel sort, ha a fejlécben akarsz kódot futtatni:

Kód:

'core.page_header_after'            => 'page_header_after',

A teljes event listát itt találod, nagyon hasznos, benne a hook lelőhelyekkel!

* Ezután létrehozol egy public function page_header_after ($event){} funkciót és oda beleírod, amit akarsz. Az $event egy objektum, azon belül a tömbökhöz hozzáférhetsz az átadott paraméterek szerint, pl.: $event['forum_id']
A bővítést úgy szoktam végezni, hogy felveszek egy külön tömböt azzal, amivel bővíteni szeretném, majd beteszem az event tömbbe és kész. Például (hasonlóan a core.user_setup-nál meghívott funkcióban):

Kód:

$sql_ary = $event['sql_ary'];
      $sql_ary['last_post_text'] = ' ';
      $sql_ary['last_post_text_pm'] = ' ';
      $event['sql_ary'] = $sql_ary;


vagy így:

Kód:

$template_data       = $event['template_data'];
      $forum_data          = $event['forum_data'];
      $template_data_addon = array (
         'S_TOPIC_LIST_ENABLE'       => ($forum_data['topiclist_enable']) ? true : false,
      );
      $event['template_data'] = $template_data + $template_data_addon;


Persze, ha csak simán kódot akarsz ott futtatni, azt is lehet és akkor nem kell az $event sem.

Röviden tehát:
1. kikeresed azt a hookot, ahová be akarod tenni a kódot vagy az átadott adatok megfelelnek
2. a listenerben megírod a kiegészítést és kész.

FIGYELEM! A listenerekkel óvatosan bánjunk és érdemes beépíteni scriptnév ellenőrzést, hogy a kód valóban csak ott fusson le, ahová szánjuk! Például ha a page_head_after listenerbe betöltesz valamit, az minden lapon lefut! Van még pár ilyen listener, amivel érdemes csínján bánni!
Ha azt szeretném, hogy csak a saját extensionömben fusson le a cucc, akkor ezzel kezdem a listenerben, ha a route /enappom linken van:

Kód:

$mainpath = $this->request->server('PATH_INFO');
if($mainpath === '/enappom')
{
// ide jön a kód vagy a controller hívása
}

esetleg ha neked az app/(bővítményed) kell vagy a template-en használt SCRIPT_NAME, mint azonosítás, akkor ezt is használhatod a $mainpath változóban:

Kód:

$scriptname = str_replace('.' . $this->php_ext, '', $this->user->page['page_name']);
if($scriptname == 'index' || $scriptname == 'app/enappom')
{
// ide jön a kód vagy a controller hívása
}

Ha nem figyelsz oda, akkor hamar leterhelheted az oldalakat a sok felesleggel!



c) A controller lényege, hogy megfelelő legyen a megjelenítés az önálló lap számára, de nagyon jól lehet használni ajax hívásokra is (ld. lentebb)! Ugyanis a routing.yml-el (ld. következő pont) együtt úgy tud működni, mintha önálló fájlokat hívnánk meg. Persze lehet bármennyi kontrollered, ha szereted a tiszta kódot, de elvileg elég egy is, hiszen minden funkciót meg lehet hívni saját útvonallal is. Tehát amikor meghívsz egy útvonalat, akkor ráfut a controller adott funkciójára és végrehajtja. Mindig kell lennie egy visszatérő résznek benne, tehát a controller return értéket kell kapjon! Ha POST hívással hívtad meg és nem lenne return, akkor ezt a sort tedd be válaszként:

Kód:

return new \Symfony\Component\HttpFoundation\Response($template_file, 200);


GET esetében érdemes az újratöltéshez a html fájlt megadni így, például:

Kód:

return $this->helper->render('@mykeehu_wiwrld/wiwrld_base.html');

vagy a klasszikus page_header(), (body blokk) page_footer() trióval. Ilyenkor elvileg nem kell return (legalábbis nálam nem volt gond). Ha mégis, ld. a POST-nál írtat.


Ehhez még egy kiegészítés, mélyvíz kedvelőknek:
Ott érdemes használni a route-ot, ahol minden szükséges paramétert át tudunk adni a listeneren át az egyedi sablonnak, vagy ezeket le tudjuk kérni a controllerben.
Viszont ha mondjuk egy URL paraméterrel hívunk meg egy sablont, célszerű a listenerben (persze a megfelelő helyen) használni az előbbi, page_header-body-page_footer triót.
Erre a legjobb példa az, hogy a nyomtatási képet kérjük le, ott ugye a &view=print paraméterrel szimplán cseréli a lapot (nézd meg a viewtopic.php alját!). Itt felesleges a controller a lapcseréhez, mert többe kerülne átadni az összes paramétert a viewtopic.php-ból, mintha egyszerűen cserélnénk a trióval. És ilyenkor nem kell route, ahogy controller sem.

Összefoglalva:
- ha az URL marad, és csak a beltartalmat cseréled ki, akkor a triót használod a listenerben és nem kell controller, meg a route,
- ha pedig kintről hívod meg (pl. linkkel vagy scripttel), akkor kell a controller és a route. Szintén kell a controller és route, ha pl. plugint készítesz, amit több oldalon akarsz megjeleníteni.


Térjünk vissza egy ajaxos megoldáshoz. Korábban például így ment egy ajax hívás a scriptben: valami.php?sid=111111111

No most kicsit tekertek rajta, ugyanis egy URL-t hívsz majd meg, amit template változóként adsz át az alábbi lépésekben:

- felveszel egy template változót mondjuk az egyik listenerbe, pl. így:

Kód:

$this->template->assign_vars(array(
            'U_WIWRLD'                => $this->helper->route('mykeehu_wiwrld_controller'),
         ));

A route nevét a routing.yml fájlban határozzuk majd meg, ott társítjuk a funkcióhoz (ld. következő pont). Tehát átadtad a template-nek a címet. Szuper!

- a templateben a korábbi php helyett meghívod ezt (az előbbi példánál maradva): {'U_WIWRLD'}?sid=111111111
és kész. :) Az adott funkció lefut.

Tehát a controllerbe olyan cuccok kerülnek, hogy ha a routing.yml-ben meghívott URL-t lefuttatjuk, akkor mi történjen?


d) Az előbb már említett routing.yml állomány a config mappában van és lássunk egy konkrét felépítést:

Kód:

mykeehu_wiwrld_controller:
    path: /wiwrld
    defaults: { _controller: mykeehu.wiwrld.controller:wiwrldbase }


Az első sorban van az a név, amit megcímeztünk a listenerben, tehát ezzel hívjuk meg. A "path" részbe jön az a cím, aminek valami egyedi nevet próbáljunk meg kitalálni. Ez jön az app.php/ után. Fontos az egyediség, főleg akkor, ha aktív használatban is lesz (mint pl. /blog)! Hiába nem lesz kitéve a felületre, attól még kell az útvonal, ha meg akarjuk hívni az adott funkciót (ld. ajax).
A "defaults" sorban adjuk meg a funkció elérhetőségét a services.yml alapján, tehát kiolvassuk a servicesből, mi a controllerünk neve, majd a kettőspont után megadjuk a funkciót, amit futtatni szeretnénk.
Röviden: amikor meghívunk egy URL-t, akkor ráfut, kikeresi a funkciót és végrehajtja. Nem kell minden ajaxhívásnak külön php-kat készíteni, "csak" funkciókat egy fájlon belül :)

Persze ha nem akarunk külön "felületi" műveleteket, akkor a controller és a routing.yml sem szükséges, de elegánsabb a fent említett return értékkel meghívni a beszúrandó html kódot, mint a listenerben mókolni a direkt betöltéssel.



e) Elvileg készen is vagyunk. A common.php állományt csak ki kell egészíteni a nyelvi bővítésekkel (persze en mappa mellé másoljunk egy hu verziót), illetve ha van admin felületünk, akkor azt is hasonlóan elkészíthetjük, ott persze saját listener fájllal és template-tel dolgozunk.

Összefoglalva tehát:
- a services.yml-ben betöltjük a szükséges szolgáltatásokat
- a listenerben beszúrjuk a megfelelő funkciókat a kívánt helyekre
- a controllerrel megjelenítést vagy ajax hívásokat kezelünk
- a routing.yml-ben pedig felvesszük a controller funkcióihoz az útvonalakat.


Tipp php listener és controller használatához, avagy: mikor melyiket használjuk?
A listenernél figyelni kell arra, hogy melyik oldalon tartózkodsz, különben ha nem vagy körültekintő, akkor MINDEN oldalon lefuttatod az adott parancsot, ami lassulást okoz és leterheli az oldalt!
Ezért azt javaslom, hogy
- ha mindenképp kellenek a listener változói, de csak a saját oldaladon használnád, akkor előtte szűrj rá, melyik oldalon hívod meg! (Ezt ld. fentebb leírtam.) Esetleg add át a template-nek, mint változó.
- ha csak az adott oldalon akarsz valamit végrehajtani, használd a controllert, mert ezek a parancsok csak a saját oldalon futnak le, a többin nem!

Tehát
- a listenert akkor használd, ha egy meglévő értéket akarsz módosítani, törölni, hozzáadni, esetleg belső tartalmat felülírni url változás nélkül
- a controllert akkor, ha egyedi kódokat írsz be, esetleg ajax hívásokat végzel, netán egyedi url-t használsz.




-----------------------------------
2. Egyedi táblák használata

Korábban DEFINE módon láttam az egyedi táblázatok elnevezéseinek globálissá tételét. Az új rendszerben van egy egyedibb megoldás rá a fenti logika szerint. Az első pontban írt útvonalat bejárva egyszerűen használhatók a táblák is:

- természetesen a telepítéskor elkészítjük a táblákat a migrations/install_user_schema.php fájlban

- a config mappában hozzuk létre a tables.yml fájlt.

- írjuk be az alábbi sablon szerint a szöveget:

Kód:

parameters:
    (azonosítód).(extension név).table.(táblanév): %core.table_prefix%(táblanév)

konkrétabban például:

Kód:

parameters:
    mykeehu.library.table.library_filelist: %core.table_prefix%library_filelist

- ha ezzel megvagyunk, akkor jöhet a services.yml, ahová csak be kell szúrnod a megadott táblahivatkozást (parameters első része), ahol használni akarod. Az előbbi példánál maradva ezt a sort:

Kód:

- '%mykeehu.library.table.library_filelist%'

valamint a fájl tetejére az importálást végző részt:

Kód:

imports:
    - { resource: tables.yml }

- ezután már a szokott módon meghívod a fájlban (controller vagy listener), ahogy a többi paramétert. Tehát felveszed protectednek a változót (protected $library_filelist_table;), hivatkozol rá a __constructban ($library_filelist_table) és felveszed ugyanitt változónak ($this->library_filelist_table = $library_filelist_table;)

- innentől már tudsz hivatkozni a táblára egy SQL lekérdezésnél a $this->library_filelist_table névvel

:)



A hozzászólás legutóbb Mykee által 2017.05.23. 10:36-kor lett szerkesztve, összesen 20 alkalommal.

Felhasználó profiljának megtekintése Privát üzenet küldése
Mykee
Gyakorlott phpBB-s
Gyakorlott phpBB-s
Avatar

Csatlakozott: 2005.08.29. Hétfő 1:00
Hozzászólások: 806
Hozzászólás Elküldve: 2017.04.26. 11:07    Hozzászólás témája:
Hozzászólás az előzmény idézésével
-----------------------------------
3. Template trükkök


1)
Azért a felületen is lehet trükkösködni, például egyedi HTML oldal betöltésénél. Például létrehozunk egy linket egy egyedi HTML-hez, aminek nem a szokott fej és láblécet szánjuk. Tehát tiszta HTML, de szeretnénk betölteni a phpbb változókat is, mint script és stylesheetek. Meg kell határoznunk a blokkok helyét.

A template head részébe kell elhelyezni ezt a címkét a meta értékek után, ide kerülnek betöltésre a hozzáadott CSS-ek. Ezután jöhet már az INCLUDECSS, például:

Kód:

{$STYLESHEETS}
      <!-- INCLUDECSS masonrybook.css -->


A HTML végére, a záró body elé pedig előbb be kell tölteni a JQueryt, aztán jöhet a blokk, majd az egyedi javascript, például (a jQuery blokkot nem tudtam betenni, de nem szabad lehagyni! Kód itt, a jQuery részben):

Kód:

{$SCRIPTS}
      <!-- INCLUDEJS js/masonry.pkgd.min.js -->


Ezzel a trükkel egyedi HTML-ekbe tudjuk betölteni a saját kódunkat. Az útvonalakkal nem kell foglalkozni: ha megtalálja a template vagy a theme mappán belül, akkor betölti. Persze új HTML elemek vagy event elemek hozzáadásakor a cache mappa production almappáját törölni kell!
Még egy kiegészítés: meg lehet hívni @-os azonosítóval is az útvonalat, ha az adott fájlt más oldalon is be akarjuk tölteni, pl. mykeehu_library/js/masonry.pkgd.min.js, de az adott extensionben a saját cuccaiban böngész a rendszer.


2)
Ha csak egy sablon színeit szeretnénk módosítani, felépítését nem, akkor célszerű gyereksablont használni (pl. mytemplate)! Ilyenkor a gyökérkönyvtárban elég létrehozni egy új mappát, benne egy template, valamint egy theme és egy theme/images mappákat.
Így:

mytemplate
|
|-template
|
|-theme
|-theme-|-images


A template mappába létrehozol egy overall_header.html fájlt, ami a jelenlegi overall_header másolata legyen. Én még létrehoztam oda egy üres my_scripts.js fájlt is, illetve a theme mappában egy üres stylesheet.css fájlt, hogy saját formázást is használhassak.

A sablon gyökérkönyvtárába (mytemplate) létrehoztam egy style.cfg fájlt, aminek ez a tartalma:

Kód:


#
# phpBB Style Configuration File
#
# This file is part of the phpBB Forum Software package.
#
# @copyright (c) phpBB Limited <https://www.phpbb.com>
# @license GNU General Public License, version 2 (GPL-2.0)
#
# For full copyright and license information, please see
# the docs/CREDITS.txt file.
#
# At the left is the name, please do not change this
# At the right the value is entered
#
# Values get trimmed, if you want to add a space in front or at the end of
# the value, then enclose the value with single or double quotes.
# Single and double quotes do not need to be escaped.
#
#

# General Information about this style
name = mytemplate
copyright = © phpBB Limited, 2007
style_version = 3.2.0
phpbb_version = 3.2.0

# Defining a different template bitfield
# template_bitfield = lNg=

# Parent style
# Set value to empty or to this style's name if this style does not have a parent style
parent = prosilver


Végül az overall_header.html fájlomban módosítottam a style útvonalakat root alapúra (bővebben ld. itt, a Method 4. részben)

Ennek a lényege, hogy a prosilver style-ok után betöltöm a sajátom (T_STYLESHEET_LINK), amiben azt írok felül, amit akarok és kész :) A gyári sablonban módosulhatnak az értékek, a sajátomban írom át, tehát nem kell belebuherálnom a gyári stylesheetekbe.



Hirtelen ennyi. Remélem, hasznos tippeket adtam azoknak, akik extension készítésére adnák a fejüket! :roll:

Felhasználó profiljának megtekintése Privát üzenet küldése
Mykee
Gyakorlott phpBB-s
Gyakorlott phpBB-s
Avatar

Csatlakozott: 2005.08.29. Hétfő 1:00
Hozzászólások: 806
Hozzászólás Elküldve: 2017.04.28. 20:55    Hozzászólás témája:
Hozzászólás az előzmény idézésével
-----------------------------------
4. Tippek és trükkök haladóknak

1. Külső extensionből a saját kódunk futtatása egyedi listener hiányában

Említettem, hogy ellenőrzöm a scriptnevet a page_header_after esetén. Úgy gondoltam, oda létrehozok egy egyedi listenert és akkor más extensionökben egyszerűen meg lehet majd adni, hogy mi az app neve. Tehát elvileg egy szép tömb jönne létre, ahol engedni szeretném a funkció futását. Pl. ('index', 'app/enappom', 'app/masikapp') és így tovább.
Ez tök jó lett volna feltételnek, hiszen betolják nekem és az alapján fut le a cucc. De valami miatt a page_header_after vagy a page_header listenerbe sem sikerült áttolni a cuccot (listener a listenerben). A tömb rendben volt, ellenőriztem a másik extensionben, de nem kaptam vissza az értéket. Ugyanez a trükk egy controllernél gond nélkül ment, de listenerben nem.
Akkor hogyan ellenőrzök olyan extensionöknél, amit más írt, hogy ő engedi-e az enyémet vagy sem? :roll:

A megoldást úgy kerültem ki, hogy a másik extension esetében betettem a controller template variációjába az értéket, mondjuk ezt:

Kód:

'U_POTD_SHOW'=> false,

Aztán a saját extensionöm page_header_afterben a template_contexten át lekértem:

Kód:


$rootref = $this->template_context->get_root_ref();

/* Run if enable on page */
if(isset($rootref['U_POTD_SHOW']) && $rootref['U_POTD_SHOW'] == true)
{
// ide jön a futtatandó kód
}

és máris csak ott fut le az adott kód, ahol ezt beállították. Tehát ha egy extension írója beadja ezt az értéket a template variációba, akkor nálam végrehajtódik a cucc.
:)


2. Egyedi oldal készítése extensionök alapján

Mi van akkor, ha egy olyan egyedi oldalt szeretnél összerakni, mint én? :D Na jó, bővebben: egy olyan oldalt, ahol van egy chat, egy recent topics, egy Ki hol van és még sorolhatnám. Ergo: több extension egy oldalon. Ráadásul úgy, hogy ha letiltod az extensiont, akkor is működjön?

A megoldás egyes esetekben nagyon egyszerű, én is sok agyaláson vagyok túl, mire rájöttem, hogy faék egyszerűségű. Lássuk a hozzávalókat:
- egyedi oldal eventekkel tűzdelve
- listenerek létrehozása.

Kezdjük az előbbivel: létrehozol egy frontoldalt, menüvel, tehát egy controller kell hozzá, beállítottad az útvonalat, menüt létrehoztad (ha kell). A sablonodba felveszel egy csomó pozíciót, mint Eventek, ami azért árulkodik a helyről, pl.:

Kód:

<!-- EVENT mykeehu_beszelgeto_chatpos -->

Tehát a beszélgető oldalam chat pozíciója :D

Jöhet a második lépés! Létrehozunk a pozícióval megegyező fájlnévvel egy üres html fájlt! Előbbi példánál maradva:
mykeehu_beszelgeto_chatpos.html
Ezt bemásolod a bővítményed event mappájába. Példánknál maradva az mchat esetében az ext/dmzx/mchat/styles/prosilver/template/event mappába.
Ha ez is megvan, akkor nincs más dolgod, mint szerkeszteni a fájlt. Mi legyen benne? Melyik fájlt akarod megjeleníteni? A chatet, tehát elég ennyit beleírni:

Kód:

<!-- INCLUDE @dmzx_mchat/mchat_body.html -->

vagy röviden ez is elég elvileg:

Kód:

<!-- INCLUDE mchat_body.html -->

Elmented és kész. :D

FONTOS, hogy cache törlést végezz, tehát a cache/production mappát töröld, másképp a saját html fájljaid nem fognak beépülni az extensionökbe!

Persze ha a belső tartalmat szeretnéd átszabni (pl. a chat tetején szeretnéd látni a szövegmezőt, nem alul vagy mondjuk egy feltételt akarsz hozzáadni, esetleg törölni), akkor az mchat_body.html tartalmát másolod bele és ott átszabod, ahogy akarod. Ennek egy hátránya van: ha a fejlesztő módosítja a html tartalmát, akkor neked is igazodni kell hozzá, míg az előbbi esetben nem!


Egyes extensionök esetében (mint pl. a fenti mchat is) kell még egy saját listener fájl az egyedi oldalhoz vagy tehetjük a controllerbe is, ahová importáljuk a __construct számára a szükséges funkciókat. Ilyenkor figyelnünk kell arra, hogy a service.yml állományba is fel legyen véve a hívás, illetve ezt az egyedi oldalt csak akkor használhatjuk, ha az ilyen extensiönök engedélyezve vannak!
Tehát az mchat esetében ezt kell még felvenni a services.yml-be:

Kód:

- '@dmzx.mchat.core'

majd importáljuk a listenerbe:

Kód:

/** @var mchat */
   protected $mchat;

majd a __constructba is felvesszük:

Kód:

\dmzx\mchat\core\mchat $mchat

és a __construct funkcióba:

Kód:

$this->mchat = $mchat;


Ha listenerbe tetted, ezután meg tudjuk hívni, pl. a core.page_header_after-ben (persze rászűrve előtte, hogy melyik oldalon vagyunk!) vagy simán a controllerben:

Kód:

$this->mchat->page_index();


És a fenti móka után a chat máris életre kel!



A hozzászólás legutóbb Mykee által 2017.05.23. 08:54-kor lett szerkesztve, összesen 5 alkalommal.

Felhasználó profiljának megtekintése Privát üzenet küldése
Ragadozo
Gyakorlott phpBB-s
Gyakorlott phpBB-s
Avatar

Csatlakozott: 2008.05.08. Csütörtök 18:26
Hozzászólások: 629
Hozzászólás Elküldve: 2017.05.01. 08:18    Hozzászólás témája:
Hozzászólás az előzmény idézésével
Szia!

Küldtem egy PÜ-t. :)

Felhasználó profiljának megtekintése Privát üzenet küldése Email küldése Felhasználó weblapjának megtekintése
Mykee
Gyakorlott phpBB-s
Gyakorlott phpBB-s
Avatar

Csatlakozott: 2005.08.29. Hétfő 1:00
Hozzászólások: 806
Hozzászólás Elküldve: 2017.05.04. 19:49    Hozzászólás témája:
Hozzászólás az előzmény idézésével
Közben elkészítettem egy régebbi MOD-omat, a Post Of The Day-t, amibe beleírtam egy másik kiegészítőmet is. :) Úgyhogy a blog és egy elég spec modom kivételével amit akartam, átírtam. Majd átnézem egyszer ezeket, de elvileg készen vagyok. :) A hitelesítésen még gondolkodom, de jó lenne, ha előtte egy hozzáértőbb phpbb guru is átnézné. :roll:

Felhasználó profiljának megtekintése Privát üzenet küldése
Mykee
Gyakorlott phpBB-s
Gyakorlott phpBB-s
Avatar

Csatlakozott: 2005.08.29. Hétfő 1:00
Hozzászólások: 806
Hozzászólás Elküldve: 2017.05.23. 08:32    Hozzászólás témája:
Hozzászólás az előzmény idézésével
No rájöttem arra, hogyan pakolhatunk össze egy custom oldalt extensionökkel. :) Nincs más dolgunk, mint eventeket és listenereket gyártani. Bővebben lásd fent, a négyes, haladóknak szóló leírásomban!
Kiegészítettem az első blokkot is, hogy mikor érdemes listenert és controllert használni.

Felhasználó profiljának megtekintése Privát üzenet küldése
Mykee
Gyakorlott phpBB-s
Gyakorlott phpBB-s
Avatar

Csatlakozott: 2005.08.29. Hétfő 1:00
Hozzászólások: 806
Hozzászólás Elküldve: 2017.05.26. 12:21    Hozzászólás témája:
Hozzászólás az előzmény idézésével
Tegnap egy egyszerű extension esetében azért belefutottam egy érdekességbe: nem akartam listenert, mert úgy gondoltam, "pull" módban készítem el, tehát egy template event húzza be a szükséges HTML fájlt, amiben benne van a változó. Azt akartam, hogy a controllerben lévő parancs csak akkor fusson le, ha megjelenik az adott HTML, tehát így bárki ott jeleníthetné meg, ahol akarja (nem kellene beégetni a listenerben, hogy pl. minden oldalon lefusson). De sajnos nem működik így a cucc.
Hiába volt hozzá egy controller, de route-tal vagy anélkül sem futott le a benne lévő php feladat. Tehát a controllerben megírtam, hogy ezt és ezt csináld, a végeredmény a template-be megy, de semmi. A HTML szépen megjelent, csak a controllerben lévő érték nem.
Próbáltam route-tal, anélkül, de semmi. Ez csak azért volt érdekes, mert előtte készítettem olyan extensiont, aminek a listener részében végülis csak a ki hol vant és a nyelvet piszkáltam, mást semmit, meg egy webcímet készítettem a route segítségével. A munkát a controllerrel végeztettem el.
Aztán leesett a tantusz: a linkre kattintva fut le a kontroller (ergo: felhasználói aktivitásra), magától nem fut le, hiába jeleníti meg a HTML fájlt. Tehát vagy kell egy automata hívás, pl. listenerből vagy egy link kattintás, esetleg egy ajaxhívás.
Végül nem maradt más hátra, mint egy listenerbe tettem be a műveletet és az átadott érték máris megjelent. Controller és a route ment a kukába.

Úgyhogy álljon itt tanulságképp: a behúzott HTML fájl nem jelenti azt, hogy a controllert is húzza magával, mindenképp kell egy esemény, hogy a controller lefusson. :roll:

Felhasználó profiljának megtekintése Privát üzenet küldése
Hozzászólások megtekintése:  

Időzóna: (GMT +1 óra) RSS - hozzászólások
Nem készíthetsz új témákat ebben a fórumban.
Nem válaszolhatsz egy témára ebben a fórumban.
Nem módosíthatod a hozzászólásaidat a fórumban.
Nem törölheted a hozzászólásaidat a fórumban.
Nem szavazhatsz ebben fórumban.

Hirdetés
Hirdetés