Jak napsat vlastní modul pro Drupal - díl 3. - Bloky
V dnešním minidíle seriálu o tvoření modulů se podíváme na to, jak tvořit vlastní bloky.
Pro tvoření bloků máme k dispozici opět hook, který se jmenuje hook_block (Dokumentace pro verzi 5].
Hook Block
Základní syntax hook_block vypadá následovně (opět na příkladu modulu testmod)
function testmod_block($op = 'list', $delta = 0, $edit = array()) {
switch ($op) {
case 'list':
// vypis bloku v administraci
break;
case 'configure':
// konfigurace bloku (delta!)
break;
case 'save':
// konfigurace se uklada (delta!)
break;
case 'view':
// zobrazeni konkretniho bloku (delta!)
break;
}
}
Celým kódem nás provází hodnota $delta a $edit. Delta se používá, pokud máte v této funkci více bloků, delta pak určuje, kterého z nich se operace týká. Pole $edit jsou hodnoty z formuláře, který odeslal uživatel, v případě operace save.
Nyní si ukážeme, jak definovat blok (dva bloky):
function testmod_block($op = 'list', $delta = 0, $edit = array()) {
switch ($op) {
case 'list':
// vypis bloku v administraci
$block[0] = array('info' => t('Jmeno bloku 1'), 'weight' => 0, 'region' => 'left', 'enabled' => 0);
$block[1] = array('info' => t('Jmeno bloku 2'), 'weight' => 0, 'region' => 'left', 'enabled' => 0);
return $block;
break;
}
}
Tady jsme si přidali do modulu dva bloky, „Jmeno bloku 1“ a „Jmeno bloku 2“. Tím jsme řekli Drupalu, že existují. Dobré vědět:
- Index pole v $block je právě budoucí $delta.
- Weight, Region a Enable jsou nepovinné, slouží jako výchozí hodnoty. Když je nepoužijete, nic nezkazíte.
V následujícím kódu výše přidané bloky zobrazíme.
function testmod_block($op = 'list', $delta = 0, $edit = array()) {
switch ($op) {
case 'view':
// zobrazeni bloku
switch ($delta) {
case '1':
// delta je 1, jde o blok "Jmeno bloku 1"
$block = array('subject' => t('Nadpis bloku 1'), 'content' => 'Ahoj, to je muj novy blok. Proste vypisu text a koncim.');
break;
case '2':
// delta je 2, jde o blok "Jmeno bloku 2"
$block = array('subject' => t('Nadpis bloku 2'), 'content' => _testmod_viewblock2());
break;
}
return $block;
break;
}
}
Ukázali jsme si, jak provést zobrazení bloku. Operace view se zavolá, pokud některý blok povolíte v administraci a zároveň se generuje stránka, kde má být blok zobrazen. Pole $block je jednoduché, index subject ukazuje nadpis bloku, index content obsah. V bloku 2 vidíte, že jsme pro obsah použili nějakou externí funkci, její doplnění je na Vás.
Pro reálné použití zbývá tyto dvě části spojit dohromady. Pokud nepotřebujete speciální nastavení bloku, „configure“ a „save“ se Vás netýká. (Speciální nastavení může být třeba, pokud zobrazujete nějaké položky z databáze a chcete ovlivnit, kolik se jich v daném bloku zobrazí. Tedy v konfiguraci vytvoříte formulář, který v „save“ uložíte do nějaké proměnné.

Uvítal bych pokračování
Uvítal bych pokračování seriálu, nejlépe vydat upravené verze předchozích dílů, v kompatibilitě s novým Drupalem 6.
"SubModuly"
Ahoj, chtěl bych se zeptat jestli lze nějakým způsobem vytvořit moduly o adresář(e) níže. Třeba: all/modules/barvy/bila/bila.module all/modules/barvy/cervena/cervena.module a přistupovat k nim nějak takto: ?q=barvy/bila ?q=barvy/cervena nebo to jde pouze: all/modules/barva_bila/barva_bila.module all/modules/barva_cervena/barva_cervena.module a přistupovat k nim takto: ?q=barva_bila ?q=barva_cervena Jde mi o nějakou logiku v adresářích. Mám D6.
to jak k nim „přistupuješ“
to jak k nim „přistupuješ“ nemá vůbec co dělat s jejich fyzickým umístěním. Pokud modul poskytuje nějakou stránku (např. barva/cerna), implementuje hook_menu a tam to řeší. Přečti si starter guide na api.drupal.org
Díky za "nakopnutí"
jdu to prostudovat :-)
Tak jsem prve dělal dobře.
Prve jsem to taky dělal pomocí hook_menu, jenže teprve teď jsem zjistil, že se ten modul po úpravách menu musí restartovat.
Neexistuje nic jako
Neexistuje nic jako „restartovat modul“. Menu modul v Drupal 6+ ma „registry“, ktery si pamatuje dane URL. FUnguje v podstate jako menu router. Je treba jen vyprazdnit Menu registry cache. Napr pomoci developer modulu
Drupal 7.x
Ahoj, funguje to i na Drupal v7.x? Zkouším to a položku nevidím v blocích.
Poslat nový komentář