Saját címlap készítése

chx képe

Ebben a cikkben az admin modul kódjából kiindulva, kis változtatásokkal eljutunk egy olyan új modulig, amely webhelyünk címlapját is kiszolgálhatja. Azért esett a választás a címlapra, mert itt gyakorta teljesen egyedi oldalszerkezettel találkozhatunk. Ha már értünk egy kicsit a PHP programozáshoz, akkor ez egyáltalán nem nehéz, csak egyszer neki kell vágnunk.

Kiindulásunk az admin modul, melynek forrása a következő:

/*01*/ function admin_help($section) {
/*02*/ switch ($section) {
/*03*/ case 'admin/modules#description':
/*04*/ return t('Handles the administration pages.');
/*05*/ case 'admin':
/*06*/ return t('Welcome to the administration section. Below are the most recent system events.');
/*07*/ }
/*08*/ }
/*09*/ function admin_menu($may_cache) {
/*10*/ $items = array();
/*11*/ if ($may_cache) {
/*12*/ $items[] = array(
/*13*/ 'path' => 'admin',
/*14*/ 'title' => t('administer'),
/*15*/ 'access' => user_access('access administration pages'),
/*16*/ 'callback' => 'admin_main_page',
/*17*/ 'weight' => 9);
/*18*/ }
/*19*/ return $items;
/*20*/ }
/*21*/ function admin_main_page() {
/*22*/ watchdog_overview('actions');
/*23*/ }
?>

Mivel ez a modul is csak egy oldalt definiál, emellett meglehetősen rövid, ezért ezt fogjuk végignézni sorrol-sorra, hogy lássuk, hogy épül fel egy ilyen modul. Saját modulunk építését bátran kezdhetjük úgy, hogy lemásoljuk az admin.module fájt cimlap.module néven, és kezdetnek lecseréljük az admin_ karaktersorozatokat cimlap_ -ra. Lássuk miből áll az admin modul, és ebből nekünk mire van szükségünk.

Az első függvény a 1-8. sorokban az admin_help, ez a hook_help kampó megvalósítása. Mit jelent egyáltalán az, hogy hook_help? Egyszerűen annyit, hogy az admin.module modul help (súgó) függvényét admin_help néven hívja a rendszer. Szabadon dönthetünk arról, hogy a számos kampó közül melyiket valósítjuk meg, és melyiket nem.

Mint látjuk, a hook_help hívásakor egy paramétert kapunk, a $section értéket. Ennek tartalma egy Drupal útvonal, majd egy esetleges kettőskereszt és egy leíró. Legfontosabb az admin/modules/#description értéket kezelnünk, hiszen ez a modulok listájában megjelenő szöveg. Adjuk meg saját modulunkhoz ezt a harmadik sorban a 'Handles the administration pages.' helyére. Ha nem írunk be semmit, vagy akár az egész _help kampót kihagyjuk, akkor sincs probléma, modulunk egyszerűen nem fog súgókat nyújtani. Ettől ugyan még használható lesz, de nem érdemes ezen a pár szón spórolni.

Bár az admin modul az 5-7. sorokban az admin útvonal meghívásakor is megjelenít egy segítő szöveget, amit a táblázat felett láthatunk, nekünk ilyenre nem lesz szükségünk, ezeket a sorokat törölhetjük.

A 9-20. sorokban az admin_menu függvény következik, mely a hook_menu megvalósítása. Vigyázat, a név kissé becsapós: ennek a segítségével nem csak a navigációs blokkban látható menübe szúrhatunk be menüpontokat. Ugyanitt tudunk füleket definiálni, sőt a menüben meg nem jelenő elérési utakhoz is itt tudunk hozzárendelni kezelőfüggvényeket. Paramétere a $may_cache. Ez igen friss a Drupalban, a http://drupal.org/node/8179 tanúsága szerint 2004. szeptember 13-án vezették be, és a legjobb dokumentáció hozzá – legalábbis szerintem – jelenleg ezen az oldalon található megjegyzés: ha a menüpontunk nem függ az útvonaltól, akkor bátran betehetjük az if ($may_cache) {...} blokkba. Ha azonban függ az oldaltól, mint például a tartalom szerkesztése fül, akkor ennek az else ágába tegyük.

Egy kétdimenziós tömbbel kell visszatérnünk, ezt építi fel a modul a következő három sorban. Ha használtuk már az adminisztrációs felületet, akkor csupa ismerős dologgal találkozhatunk. Láthatjuk a 13. sorban, hogy ez a modul az admin Drupal útvonalban érdekelt. A saját modulunkban ennek értéke legyen cimlap. A menüben egy administer feliratú bejegyzés jön létre a 14. sor hatására, nekünk itt a címlap felel meg. Az adminisztrációs az oldalt csak az access administration pages elérési jog birtokában nézhetjük meg (15. sor), nekünk jobban megfelel a szintén beépített access content jog használata. A callback adja meg a 16. sorban, hogy mely függvényt hívja majd meg a Drupal az oldal előállításához. Legyen ez cimlap_page, a Drupal hagyományoknak megfelelően. A 17. sorban a weight szokásos módon a bejegyzés súlyát mondja meg, mely szerint a menüben sorrendezhető. Ha ezt nem adjuk meg, akkor ábécé rendben kerülnek sorba a menüpontok.

A cimlap_page függvényben állítsunk össze egy $output karakterláncot, ami az oldal tartalma és függvényünk utolsó utasításaként írassuk ezt ki egy print theme('page', $output); hívással. Ennek hatására megjelenik az előállított HTML kód az aktuális sminkben. Mostanra a következő kódhoz jutottunk:

function cimlap_help($section) {
switch ($section) {
case 'admin/modules#description':
return 'A címlap tartalmát állítja elő';
}
}
function cimlap_menu($may_cache) {
$items = array();
if ($may_cache) {
$items[] = array(
'path' => 'cimlap',
'title' => 'címlap',
'access' => user_access('access content'),
'callback' => 'cimlap_page',
'weight' => 0);
}
return $items;
}
function cimlap_page() {
$output = 'Ez a címlap tartalma';
print theme('page', $output);
}
?>

Próbáljuk ki a http://drupal.site/cimlap oldalunkat. Ha ez jó, akkor állítsuk át az admin/settings alatt a címlapra behívott elérést node-ról cimlap értékre. Egy igazán élvezhető főoldlahoz persze tartalom is dukál, de ezt már PHP tudásunk birtokában könnyen el tudjuk készíteni. Tippekhez érdemes megnézni a node_page kódját, mely az alapértelmezett főoldalt generálja.

A főoldal egyediségéhez tartozhat még, hogy bizonyos blokkok csak ott jelennek meg, vagy éppen csak ott nem jelennek meg. Ezt az admin/block oldal Elérési út oszlopában szabályozhatjuk, mintaillesztő kifejezések segítségével. Ha például azt szeretnénk, hogy egy blokk csak a főoldalon jelenjen meg, akkor annak az elérési útja legyen |^$|. Ha viszont szeretnénk meggátolni, hogy egy blokk megjelenjen a főoldalon, akkor ugyanide pl. a |^.| ajánlható.

Hozzászólások

Anonymous képe

Hamarosan elkészülök a modul fejlesztés -hogyan fordításával, így még egyszerűbb lesz ilyesmit csinálni.

Anonymous képe

Ez mikorra várható?
sz_a

ATamás@gyermekjog.hu képe

Kösz', rendben, működik is...

A gondom az, hogy kiteszi a "Címlap" linket és az oldal nevét...

Hogyan lehet elérni azt, hogy a friss installú Drupal kezdőszövegéhez hasonló felületet kapjak?

Bocs', programozói tudás nélkül már vagy 8 órát buheráltam, semmi megoldás... :(

Hojtsy Gábor képe

Én nem értem a kérdést. Miben tér el a "kezdőszövegtől", mit értünk kezdőszöveg alatt egyáltalán?

ATamás@gyermekjog.hu képe

Elnézést, ha nem a szakzsargont használom... :(

Friss Drupal install estén a "Welcome to your new Drupal-powered website. ..." szöveg jelenik meg. Ekkor természetesen még nincs node, az ilyen módon való megjelenés alkalmas lehet arra, hogy teljesen egyedi arculatú cíomoldal legyen létrehozható. Ehhez kértem segítséget.

Hojtsy Gábor képe

Akkor mivel csak a kérdés második felére kaptam választ, menjünk vissza az elsőre :) Miben nem akarod, hogy eltérjen? Nem szeretnéd, ha lenne címe, hozzá lehetne szólni, lenne beküldési információja, stb?

ATamás@gyermekjog.hu képe

Keresem annak a megoldhatóságát, hogy egy statikus oldal legyen,
-> csak a beállított blokkok legyenek, semmi más.

Megjelenésként ezért utaltam a friss installáció kezdőképére, ami valamilyen módon szerkeszthetővé téve talán megvalósítható lenne... itt elakadtam rendesen...

Hojtsy Gábor képe

Tehát ne legyen a blokkokon túl más tartalom az oldalon? Kitöltik számodra a blokkok az oldalt?

ATamás@gyermekjog.hu képe

Na, félrebeszélek itten... :(

Az adott kezdőoldalon természetesen legyenek blokkok, csak a kezdőoldal tartalmában ne legyen a szokásos:

- "Címoldalra"
- Az oldal neve,
- hozzászólás stb.

tehát csak az oldal tartalma, a blokkokkal.

chx képe


$nid = ;
$result = db_rewrite_sql(db_query('SELECT body, format FROM {node} WHERE nid = %d', $nid));
$node = db_fetch_object($result);
return theme('node', node_prepare($node), FALSE, TRUE);
?>

A $nid = után kell egy node szám, tehát node/123 esetén 123.

A kódból készült modult a http://drupal.hu/udvozloszoveg címen tekinthetik meg a Kedves Olvasók.

ATamás@gyermekjog.hu képe

Kösz', 4.6 alatt még nem sikerült életre keltenem... :(
Kitartás, küzdelem... :)

chx képe

ez csak 4.6 alatt működik a db_rewrite_sql miatt. A kód tutira jó, saját patchemből szedtem ki, amit végül nem fogadtak el, más megoldás születik a welcome text node -ba mozgatására. Mondjuk abbban FALSE, FALSE volt a theme két paramétere... de szerintem FALSE, TRUE helyesebb.

Hojtsy Gábor képe

Ugyanezt elérhetné, ha a 'node/132'-re (értelemszerűen) állítaná a honlapját, nemde?

chx képe

nézzd meg jobban, ez az üdvözlőszöveghez hasonlatosan csak egy szöveget tesz ki, semmi egyebet.

Hojtsy Gábor képe

A theme('node') igencsak sokmindent kitehet még, például a taxonómia termek linkjeit is, meg ezer mást...

chx képe

Mivel node_load-ot nem hívtam meg, ezért ebbe a világon semmi bele nem kerül. A node_prepare csak filtereket hív meg. A theme('node') meg, hacsak nem egy elvetemült gazember a theme írója, nem fog lehívni újabb mezőket, mint amik rendelkezésre állnak.

Az önálló verzióban már node_prepare sincs, nehogy bele tudjál kötni :)

Hojtsy Gábor képe

Én akkor elvetelmült gazember lennék, mert a weblabor sminkjében például lekérdezem a kategóriákat, hiszen valamiért nem minden esetben kapja meg a smink függvény az infót... Illetve ez így volt 4.4-el, aztán most megörökölte az új smink is ezt a viselkedést. Meg egyéb elvetemültségek is vannak benne. Ezért nem feltételezem, hogy a node smink függvény minden esetben tényleg csak a szöveget írja ki egy fejléccel. Különben már a fejléc több mint ami az alap honlap (bár a ATamás konkrét követelményeit még mindig nem ismerem).

chx képe

Egyrészt ATamásnak megfelelt. Ismerd el, a legtöbb smink nem pull jellegű. A 4.4-es az más volt, a weblabor meg nagyon speciális eset. Fejlécet tuti nem ír ki, mert nincs benne a lekérésben!

Hogy abbahagyjuk: a theme('node'..) csak az egyszerűség kedvéért van benne, ki lehet hagyni teljes egészében, a node_prepare megteszi, sőt a tippeknél már csak check_output van...