Přeskočit přímo na text


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é.

About the author

Jakub Suchý je provozovatelem projektu Drupal.cz. Je členem Drupal Security Teamu, vytvořil několik volně dostupných modulů a také se Drupalem živí.

 

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ář

Obsah tohoto pole je soukromý a nebude veřejně zobrazen.
  • You can use Texy! to format and alter entered content.
  • Povolené HTML značky: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <p> <br> <b> <i> <h2> <img> <pre> <sup> <sub> <pre class="php"> <span class="php-keyword1"> <span class="php-var"> <span class="php-num"> <img class="screenshot"> <p class="beginner"> <a class="greybox"> <h3> <h4>

Více informací o možnostech formátování

Mollom CAPTCHA (play audio CAPTCHA)
Type the characters you see in the picture above; if you can't read them, submit the form and a new image will be generated.

Drupal meet-up mobilni web 2011

Hledat

Přihlášení

Poslední komentáře