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
Csonti
Hamarosan elkészülök a modul fejlesztés -hogyan fordításával, így még egyszerűbb lesz ilyesmit csinálni.
"tervezhető include('')"??
Ez mikorra várható?
sz_a
Rendben
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... :(
Mi a kérdés?
É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?
Bocs'
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.
Miben tér el?
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?
Statikus
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...
Legyen üres?
Tehát ne legyen a blokkokon túl más tartalom az oldalon? Kitöltik számodra a blokkok az oldalt?
Üres?
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.
hát
$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.
4.6
Kösz', 4.6 alatt még nem sikerült életre keltenem... :(
Kitartás, küzdelem... :)
ne viccelj
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.
De mi értelme van?
Ugyanezt elérhetné, ha a 'node/132'-re (értelemszerűen) állítaná a honlapját, nemde?
nem
nézzd meg jobban, ez az üdvözlőszöveghez hasonlatosan csak egy szöveget tesz ki, semmi egyebet.
Theme_node-on múlik
A
theme('node')
igencsak sokmindent kitehet még, például a taxonómia termek linkjeit is, meg ezer mást...hát...
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 :)
elvetemült gazember vagyok :)
É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).
na
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...