A kimenet felülbírálása a Joomla! 1.5-ben
-
Leírások
Számos igény jelentkezik a webtervezőknél a Joomla! kimenetének vezérléséhez. A nézetek átparaméterezése, a megfelelő kódok átrendezése helyett a Joomla! lehetőséget biztosít a generált kimenet vezérlésének virtuális átvételére bizonyos módszerekkel anélkül, hogy a programozó hackelje vagy átírja a a szoftver rendszerfájljait akár egy újabb verzióra frissítéskor. Ennek a cikknek a célja az, hogy a sablonfejlesztő programozó hogyan tudja testre szabni a Joomla! által generált kimenetet.
MVC 101
Az módszer alapja, az MVC egy betűszó, amely a Modell-Nézet-Vezérlő (angolul Model-View-Controller) kezdőbetűiből származik. Az MVC különleges rugalmasságot biztosít a programozónak, akit ezen belül leginkább a Nézet (View) terület érint leginkább. Ez a rész kapcsolatos főleg a kimenettel.
A különböző bővítmények a kimenetet eltérően jelenítik meg. A komponensek a különböző információkat más-más módon jelenítik meg. Például a cikkeket megjelenítő komponens (com_content) megjeleníthet egy adott cikket, egy kategória cikkeit vagy egy szekció cikkeit. A különböző típusú adatok (cikk, kategória, szekció) megjelenítését hívjuk "nézetnek" (ez az MVC terminológiájából származik). A legtöbb komponens több nézetet kezel. Vagyis a nézet nem magát a kimenetet jeleníti meg. A kimenet megjelenítése az "elrendezés" (angolul layout) dolga, ezért lehet egy nézetnek több elrendezése.
A legfontosabb annak a hangsúlyozása, hogy egy komponensnek több nézete és mindegyik nézetnek több elrendezése lehet. Minden nézet egy meghatározott információhalmazt állít össze, de minden elrendezés máshogyan jeleníti meg ezeket az információkat. Például A cikkek komponensnek kategória nézete felelős a cikkek összeállításáért. Ezek a cikkek megjeleníthetők listában vagy táblázatosan (és más módon is). Így ennek a nézetnek lehet "lista" elrendezése és "table" elrendezése is a kiválasztástól függően.
A modulok egyszerű felépítésű elemek. Általában egyféle dolgot jelenítenek meg egyféle módon. A moduloknak nincs nézetük, de támogatják az elrendezést. Egyes fejlesztők modulparamétereken keresztül támogatják a többféle elrendezést.
Sablon vagy elrendezés?
Fontos a sablon szerepének elkülönítése az elrendezés szerepétől. A sablon egy strukturális keretrendszert szolgáltat a webhely oldalaihoz. Ezen a keretrendszeren belül vannak pozíciók a modulok és a tartalom megjelenítésére. Ami megjelenik, azt a modulelrendezés szabja meg illetve komponens esetében a nézetek és elrendezések kombinációja.
A következő képen egy tipikus Joomla! sablon (a Joomla 1.5-ben alapértelmezett rhuk_milkyway sablon) strukturális elrendezése látható. A modulpozíciók az URL végére illesztett tp=1 paraméterrel jeleníthetőek meg (példa: index.php?tp=1). Tisztán kivehető, hogy hol jelenik meg a modul kimenete a sablonon belül illetve a fő komponenskimenet az alsó-középső részen kezdődve. Ami kimenet ezekben a részekben (régiókban), azt az elrendezések vezérlik.

Kiegészítő testreszabás
Nem szorosan kapcsolódva az MVC-hez, két másik fontos területet kell észrevennünk a Joomla! kimenetének testreszabásával kapcsolatban.
Az elrendezéseken kívül a moduloknak van egy olyan részük, amit "chrome"-nak hívunk. A chrome az a stílus, ahogy a modul megjelenik. A legtöbb fejlesztő, tervező és valószínűleg néhány végfelhasználó otthonos a modulokkal kapcsolatos beépített stílusokkal (raw, xhtml, stb.). Lehetőség van a modulokhoz saját chrome stílusok definiálására az elvárt megjelenéstől függően. Például tervezni lehet egy chrome stílust egy adott pozícióban az összes modul megjelenítéséhez egy JavaScript alapú kinyitó-becsukó elrendezés megvalósításával.
A fenti képernyőkép felismerhetőek egy beépített modul chrome stílusok (rounded, none és xhtml).
A másik dolog a lapozás vezérlése az adatlisták megtekintésekor. Ez később kerül részletezésre
A kimenettípusok és az elrendezés felülbírálása a komponensben
Az elrendezés felülbírálásának megértéséhez ismerni kell a komponens fájlstruktúráját. Egy komponensnek több része van, mindegyikhez különböző szerepek vannak hozzárendelve, de bennünket a komponens /views/ könyvtára érdekel. Az alábbiakban a com_content komponens nézeteinek két részstruktúráját látjuk:
/components
/com_content
/views
/articles
/tmpl
default.php (ez egy elrendezés)
form.php (ez egy elrendezés)
view.html.php (ez egy nézet, amely előállítja a HTML kódot)
view.pdf.php (ez egy nézet, amely előállítja a PDF kódot)
/category
/tmpl
blog.php (elrendezés)
blog_items.php (al-elrendezés)
default.php (elrendezés)
view.html.php (HTML nézet)
view.feed.php (RSS csatorna)
Amit itt látunk, az a /views/ könyvtár alatt van, minden nézet ennek egy-egy alkönyvtárában van. A content komponensnek további három nézetét itt nem jelenítettük meg: archive, frontpage és section.
Kimenettípusok
Az /articles/ könyvtár alatt számos fájlunk van. A fájlok neve majdnem mindig view.html.php. Ezt hívjuk nézetfájlnak, de ebből lehet több is a kimenettípustól függően. Ennek speciális elnevezése van, view.kimenet_tipus.php, ahol a kimenet_tipus lehet html, feed, pdf, raw vagy error (további információkat erről a JDocument-ben az API hivatkozás (reference) részben találunk a /libraries/joomla/document/ könyvtárban). Ami számunkra fontos, az, hogy ha html kimenetet szeretnénk ehhez a nézethez, akkor a view.html.php fájlt kell használnunk, RSS kimenethez pedig a view.feed.php fájlt.
Ezen különböző kimenettípusoknak a hatása főleg akkor érvényesül, ha a Globális konfigurációban a Keresőbarát URL-ek beállítása Igen-re van állítva, az Apache mod_rewrite használata Igen és az utótag hozzáadás az URL-ekhez Igen állapotú. Ezek beállításával az URL-ek ehhez hasonlóak:
- http://www.valami.hu/sports.html
- http://www.valami.hu/sports.feed
- http://www.valami.hu/sports/rowing.html
- http://www.valami.hu/sports/rowing.pdf
A pontos URL változhat a webhely beállításaitól függően, a példában a sports.html a kategória nézet view.html.php fájlját használja, a sports.feed megjeleníti a view.feed.php fájlt használva a kategóriához tartozó RSS csatornát. Meg kell jegyezni, hogy a feed vagy PDF kimenettípusok nem testre szabhatók. A html kimenettípus testre szabható és ez az, ahol az elrendezések bejönnek a képbe.
Elrendezések
A view könyvtárban van egy /tmpl/ nevű könyvtár, amelyben az elrendezés fájlok találhatók. Ebben a könyvtárban minden PHP fájl egy-egy elrendezést valósít meg. Például az article/tmpl/default.php fájl egy cikk alapértelmezett elrendezéséért felelős, az article/tmpl/form.php a cikk szerkesztői űrlapjáért, a category/tmpl/default.php egy kategória alapértelmezett elrendezéséért, a category/tmpl/blog.php másként jeleníti meg a cikklistát.
A kapcsolat a komponens nézetei és elrendezése között főleg egy új menüpont létrehozásakor látható. A következő képernyőkép az Új menüpont oldal tipikus megjelenítését mutatja. A Cikkek elemre kattintva (amely a com_content komponenst képviseli), a fastruktúra a nézetek listáját és az elrendezéseket mutatja a nézeten belül.

Észrevehetjük, hogy további fájlok is lehetnek egyes /tmpl/ könyvtárakban (például a pagebreak.php a cikk nézetben), ezek nincsenek a fenti listában. Ennek oka az, hogy az elrendezés XML fájljában levő utasítások (például pagebreak.xml) elrejti az elrendezés (illetve a nézet) fájlokat a menüpont listából. Ez azonban egy másik dolog, amely egy másik ismertető témája lehet.
Az egyes részek egymáshoz fűződő kapcsolatának ismeretében létrehozhatjuk saját elrendezést felülbíráló kódunkat.
Elrendezés fájlok másolása és létrehozása
Az elrendezés felülbírálások csak az aktív sablonban működnek és a sablon /html/ nevű könyvtárában foglalnak helyet. Például a rhuk_milkyway sablonban alkalmazott felülbírálások a /templates/rhuk_milkyway/html/ könyvtárban, a JA Purity sablonra alkalmazottak a /templates/ja_purity/html/ könyvtárban illetve a Beez sablonra alkalmazottak a /templates/beez/html/ könyvtárban találhatóak.
Fontos annak megértése, hogy ha felülbírálásokat készítünk egy sablonhoz, ezek nem érhetők el más sablonból. Például a rhuk_milkyway sablonhoz egyáltalában nem tartoznak komponens elrendezés felülbírálások. Ezt a sablont használva az összes komponensből tiszta kimenetet kapunk. A Beez sablonnál majdnem minden komponensrész kimenetét a sablonban levő elrendezés felülbírálások vezérlik. A A JA Purity esetében egyes komponensekhez vannak felülbírálások, illetve csak bizonyos nézetek vannak.
Az elrendezés felülbírálásokat meghatározott módon kell elhelyezni. A Beez sablont használva példaként az alábbi struktúrát látjuk:
/templates
/beez
/html
/com_content (egyezik a komponenskönyvtár nevével)
/articles (egyezik a nézetkönyvtár nevével)
default.php (egyezik az elrendezésfájl nevével)
form.php
A komponens felülbírálás struktúrája igen egyszerű:
/html/com_komponensnev/nezet_nev/elrendezes_fajlnev.php.
Nézzünk néhány példát!
A rhuk_milkyway sablonban egyik komponenshez sincs elrendezés felülbírálás. Ha például szeretnénk felülbírálni az alapértelmezett elrendezést egy cikkhez, másoljuk át az alábbi fájlt:
/components/com_content/views/article/tmpl/default.php
az alábbi helyre, létrehozva a megfelelő könyvtárakat, amelyek még nincsenek meg:
/templates/rhuk_milkyway/html/com_content/article/default.php
Ha a kategória nézetben levő blog elrendezést szeretnénk felülbírálni, a következő fájlt kell átmásolnunk:
/components/com_content/views/category/tmpl/blog.php
ide:
/templates/rhuk_milkyway/html/com_content/category/blog.php
A fájlok átmásolása után az új helyen levő másolatfájlokban módosításokat végezhetünk igény szerint. Ha nem akarjuk, nem kell elfogadni a paraméter beállításokat.
Az al-elrendezések felülbírálása
Bizonyos nézetekben azt látjuk, hogy egyes elrendezésekhez több ugyanazzal kezdődő fájlok tartoznak. Példa erre a category és a frontpage nézetek. A blog elrendezésnek a kategória nézetben három része van: a fő elrendezésfájl neve blog.php, a két al-elrendezésé pedig blog_item.php illetve blog_links.php. Látható, hogy a loadTemplate metódus segítségével ezek hova kerülnek a blog.php fájlbam. Például:
echo $this->loadTemplate('item');
// vagy
echo $this->loadTemplate('links');
Az al-elrendezések betöltésekor a nézet már ismeri az aktuális elrendezést, ezért nem kell elótagot megadni (ezért elég csak az 'item' megadása a 'blog_item' helyett).
Fontos megjegyezni, hogy az al-elrendezést felül lehet bírálni a teljes fájlcsoport nélkül is. Például ha tetszik a Joomla! alapértelmezett kimenete a blog elrendezésnél és csak az elem al-elrendezését szeretnénk testre szabni, akkor csak a következő fájlt kell átmásolni:
/components/com_content/views/category/tmpl/blog_item.php
ide:
/templates/rhuk_milkyway/html/com_content/category/blog_item.php
Amikor a Joomla! átvizsgálja a nézetet, automatikusan tudja, hogy a blog.php fájlt az eredeti com_content könyvtárból kell beolvasni és a blog_item.php fájlt pedig a sablonban levő felülbírálásokból.
Modul elrendezés felülbírálások
A komponensekhez hasonlóan a moduloknak is adott könyvtárstruktúrájuk van.
/modules
/mod_latest_news
/tmpl
default.php (az elrendezés)
helper.php (az adatlogikát tartalmazó helper fájl)
mod_latest_news.php (a fő modulfájl)
mod_latest_news.xml (a telepítő XML fájl)
A komponensekhez hasonlóan a fő modulkönyvtár alatt (például mod_latest_news) van egy /tmpl/ nevű könyvtár. Általában egy elrendezésfájl található itt, de lehet több is a fejlesztő szándékától függően.
Ahogy a komponenseknél, itt is modul felülbírálások is meghatározott helyre kerülnek. A Beez sablon esetében az alábbi struktúrát látjuk:
/templates
/beez
/html
/mod_latest_news (egyezik a modulkönyvtár nevével)
default.php (egyezik az elrendezés fájl nevével)
A modul felülbírálások struktúrája itt is egyszerű:
/html/mod_modulnev/elrendezes_fajlnev.php.
Elrendezésfájlok másolása és létrehozása
A rhuk_milkyway sablon nem tartalmaz egyetlen elrendezés felülbírálást egyik modulhoz sem. Ha például a Latest News modulhoz szeretnénk felülbírálást készíteni, át kell másolnunk ezt a fájlt:
/modules/mod_latest_news/default.php
erre a helyre, létrehozva a megfelelő könyvtárakat, amennyiben azok nem léteznek:
/templates/rhuk_milkyway/html/mod_latest_news/default.php
A modul elrendezés felülbírálását kellő óvatossággal kell végezni, mert a modul terve más és más lehet modultól függően és ezért mindegyik lehetőséget eltérően kell kezelni.
Modulstílusok (Chrome)
A Joomla! 1.0 esetében egy sor fix stílus volt, amellyel a modulokat meg lehetett jeleníteni egy adott pozícióban. Ezek a stílusok számmal voltak azonosítva:
- 0 (alapértelmezett) - a modulok függőleges táblázatban jelentek meg
- 1 - a modulok vízszintes táblázatban jelentek meg
- -1 - a modulok tiszta kimenete jelent meg
- -2 - a modulok XHTML kompatibilis formában jelentek meg H3 címkével ellátott címmel.
- -3 - a modulok egymásba ágyazott DIV címkékkel jelentek meg, amely lehetővé tett a lekerekített sarkú technikát
Ez egy nagyszerű dolog volt, kivéve két dolgot:
- Nem lehetett fejben tartani, hogy melyik szám mit jelent
- Nem lehetett kiterjeszteni a stílusokat
Az 1.5 verzióban a számok még megmaradtak, de a stílust már egy-egy szó képviseli Emellett a modulpozíció megjelenítésének szintaxisa is megváltozott. Az alábbi kódrészlet például minden bal (left) pozícióban levő modult xhtml stílussal jelenít meg:
<jdoc:include type="modules" name="left" style="xhtml" />
A beépített stílusok a következők szerint érhetők el:
- table (korábban 0 és alapértelmezés)
- horz (korábban 1)
- none (korábban -1)
- xhtml (korábban -2)
- rounded (korábban -3)
- outline (újdonság - a modulpozíciók előnézetére használatos - lásd a képernyőképet feljebb)
A forráskódban ezekre a stílusokat nevezik "chrome"-nak. Az alapértelmezett chrome stílusok a Joomla! telepítvény system sablonjában találhatók:
/templates/system/html/modules.php
Ezt a fájlt a projekt kezeli, ezért soha nem kell módosítani közvetlenül, különben megvan annak a kockázata, hogy elvész a Joomla magasabb verzióra frissítésekor.
Saját chrome vagy modulstílus készítéséhez csak annyit kell tenni, hogy a sablonok /html/ könyvtárában készítünk egy modules.php nevű fájlt illetve ha már van ilyen, azt szerkesztjük (ez ugyanaz a könyvtár, amiről a komponensek és a modulok elrendezés felülbírálásainál is szó volt).
A rhuk_milkyway sablon szolgáltat néhány külön chrome-ot példaként ("slider" néven megjegyzés sorokban). Ez a következő fájlban található:
/templates/rhuk_milkyway/html/modules.php
Saját chrome létrehozása egyszerű dolog. Képzeletbeli példánk a modult definíciós listában jeleníti meg (DL, DT és DD címkék).
Helyezzük el a következő függvényt az alapértelmezett sablonkönyvtár /html/modules.php fájljában (ha még nem létezik, hozzuk létre!):
/*
* Modul chrome: becsomagolja a modult egy definíciós listába
*/
function modChrome_dlist($module, &$params, &$attribs)
{ ?>
<dl class="<?php echo $params->get('moduleclass_sfx'); ?>">
<?php if ($module->showtitle != 0) : ?>
<dt>
<?php echo $module->title; ?>
</dt>
<?php endif; ?>
<dd>
<?php echo $module->content; ?>
</dd>
</dl>
<?php
}
A stílust "dlist"-nek nevezzük el, ezért a függvény neve modChrome_dlist lesz!
A függvénynek három bemeneti paramétere van: a modulobjektum, a modul paraméterek és végül a $attribs tömb, amely a jdoc XML címke összes attribútumát tartalmazza.
A modulobjektumban három fő tulajdonság van, amivel foglalkozni kell:
- showtitle - megmondja, hogy meg kell-e jeleníteni a modul címét vagy sem
- title - a modul címe
- content - a modul tartalma (ennek elrendezéséből érkezik)
Ez egy nagyon egyszerű eset, természetesen lehet összetettebb stílusokat tervezni feltehetőselg egyedi attribútumokkal az XML címkében.
Lapozási linkek felülbírálása
Az utolsó felülbírálás a lapozási linkeké. Ez vezérli egy oldalon megjelenő elem számát és a listamegjelenítés lapozási linkjeit, ahogy a következő képernyőkép mutatja.

A rhuk_milkyway sablon egy jól kommentált példát mutat erre a felülbírálásra a következő fájlban:
/templates/rhuk_milkyway/html/pagination.php
Ha lapozási lista szükséges, a Joomla! ezt a fájlt az alapértelmezett sablonokban keresi. Ha megtalálja, akkor betölti és a benne levő függvényeket használja.
Négy függvény használható:
- pagination_list_footer - Ez a függvény felelős az egy oldalon megjelenítendő elemszám kijelzéséért.
- pagination_list_render - Ez a függvény felelős az oldalszám linkek megjelenítésért (Első, Utolsó, Előző és Következő).
- pagination_item_active - Ez a függvény jeleníti meg az aktuális oldaltól eltérő oldalakra mutató linkeket.
- pagination_item_active - Ez a függvény jeleníti meg az aktuális oldalszámot, általában nem linkelve.
Testreszabások
A rhuk_milkyway sablont használva példaként itt egy rövid összegzés az alapelvekről.
A komponens kimenet testreszabása
Egy komponens elrendezés (például a cikk nézet alapértelmezett elrendezése) felülbírálására másoljuk a:
/components/com_content/views/article/tmpl/default.php
fájlt ide:
/templates/rhuk_milkyway/html/com_content/article/default.php
A modul kimenet testreszabása
A modul elrendezés (például a Latest News modul a rhuk_milkyway sablon felhasználásával) felülbírálására másoljuk a:
/modules/mod_latest_news/default.php
fájlt ide:
/templates/rhuk_milkyway/html/mod_latest_news/default.php
Modulstílusok hozzáadása
Új modulstílus (chrome) készítéséhez helyezzük el ezeket a következő fájlban:
/templates/rhuk_milkyway/html/modules.php
Lapozási linkek testreszabása
Az egy oldalon megjelenő elemek számának megadásához használatos választó és a lapozási linkek megjelenítésének testreszabásához szerkesszük a következő fájlt:
/templates/rhuk_milkyway/html/pagination.php
Végkövetkeztetés
A Joomla! 1.5 az MVC segítségével jelentősen rugalmasabbá válik a webtervezők részére. Néhány egyszerű alapelv segítségével, mint például egyes fájlok másolása a sablonban bizonyos helyekre, a tervező részére lehetővé válik a Joomla! majdnem minden generált html kimenetének felülbírálása.
A kimenet felülbírálásával kapcsolatos kérdésekre a fejlesztők válaszolnak illetve tovább bővítik ezt a leírást.








