Drupal-navigointimoduuli: Taxonomy footer

Saturday, September 19th 2009 at 16:43 in Technology, Drupal

Tuli pitkästä aikaa koodattua hiukan Drupalilla. Tein tänne omalle saitilleni yksinkertaisen navigointi-footerin, joka näyttää artikkelien kategoriat. Siitä tuli ihan irrallinen moduuli, joten pistän tähän jakoon, public domain. Tästä on varmasti enemmän iloa esimerkkikoodina kuin varsinaisena tuotantomoduulina. :-)

Moduuli tuottaa blokin, jossa on kaksiulotteinen taulurakenne. Taulun thead-osuudessa ovat päätason kategoriat ja tbody-osuudessa niiden alakategoriat. Monimutkaisemmat hierarkiat vaativat tuon rakenteen miettimistä vähän eri lailla, mutta omiin tarpeisiini se täsmää. Omassa teemassani olen sijoittanut blokin erilliseen fatfooter-diviin ja tyylittänyt sen sitten CSS:llä.

taxfooter.info

name = Taxonomy footer
description = Show taxonomy navigation as a fat footer
core = 6.x
dependencies[] = taxonomy

taxfooter.module

function taxfooter_block($op = 'list', $delta = 0, $edit = array()) {
  switch ($op) {
    case 'list':
      $blocks = array(
        array('info' => t('Taxonomy footer')),
      );
      return $blocks;
    case 'configure':
      switch ($delta) {
        case 0:
          $vocs = taxonomy_get_vocabularies();
          $vocnames = array(0 => '(none)');
          foreach ($vocs as $voc) $vocnames[$voc->vid] = $voc->name;
          $form = array(
            'taxfooter_vocabulary' => array(
              '#type' => 'select',
              '#title' => t('Vocabulary to show in fat footer'),
              '#default_value' => variable_get('taxfooter_vocabulary', 0),
              '#options' => $vocnames
          ));
          break;
      }
      return $form;
    case 'save':
      switch ($delta) {
        case 0:
          variable_set('taxfooter_vocabulary', (int) $edit['taxfooter_vocabulary']);
          break;
      }
      break;
    case 'view':
      switch ($delta) {
        case 0:
          $vid = variable_get('taxfooter_vocabulary', 0);
          if ($vid <= 0) return null;
          $html = _taxfooter_render($vid);
          $block = array(
            'subject' => t('Fat Footer'),
            'content' => $html);
          break;
      }
      return $block;
  }
}

function _taxfooter_render($vid) {
  $subcolumns = 7;
  $tree = taxonomy_get_tree($vid);
  $html = '<table>';
  $html .= '<thead>';
  $html .= '<tr>';
  $count = 0;
  $toplevel = array();
  foreach ($tree as $category) if ($category->depth == 0) {
    $toplevel[] = $category->tid;
    if ($count++ > 0) $html .= '<td class="divide"></td>';
    $html .= '<td colspan="' . $subcolumns . '">';
    $html .= l($category->name . ' categories', 'taxonomy/term/' . $category->tid) . '<br/>';
    $html .= '</td>';
  }
  $html .= '</tr>';
  $html .= '</thead>';
  $html .= '<tbody>';
  $html .= '<tr>';
  $tcount = 0;
  foreach ($toplevel as $toptid) {
    $scount = 0;
    $ccount = 0;
    foreach ($tree as $subcategory) if ($subcategory->depth > 0 && in_array($toptid, $subcategory->parents)) {
      if ($tcount > 0 && $scount == 0) $html .= '<td class="divide"></td>';
      if ($scount == 0) { $html .= '<td>'; $ccount++; }
      elseif ($scount % 2 == 0) { $html .= '</td><td>'; $ccount++; }
      $html .= l($subcategory->name, 'taxonomy/term/' . $subcategory->tid) . '<br/>';
      $scount++;
    }
    while ($ccount++ < $subcolumns) {
      $html .= '</td><td>';
    }
    $html .= '</td>';
    $tcount++;
  }
  $html .= '</tr>';
  $html .= '</tbody>';
  $html .= '</table>';
  return $html;
}

3 Comments
Aki Björklund 20.9.2009 11:45:30

Minähän en mitään Drupalista tiedä, mutta onko yleinen käytäntö siinä käsitellä HTML:ää stringinä? Aika vaikeasti ylläpidettävältä näyttää.

kennu 20.9.2009 12:14:49

Oikeaoppinen tapa on käyttää templateja, jolloin outputin voi teemata, mutta tällä kertaa laiskotti ja haluamani outputti oli aika vakiomuotoinen taulu.

(Tuollainen hyvin dynaamisesti rakenneltu taulu on tietysti aika lailla yhtä vaikea ylläpitää, riippumatta sijoittaako sen templateen vai moduuliin.)

Vesa Palmu 21.9.2009 23:30:53

Kyllä "oikeissa" Drupal moduuleissa HTML siirretään joko teemoitettavaan erilliseen funktioon tai tiedostoon tilanteen mukaan. Lähtökohtaisesti mitään Drupalin tai sen moduulien koodia ei tarvitse muokata ulkoasun (tai usein edes toiminnallisuuden) muuttamiseksi. Kertakäyttöisenä yhden saitin moduulina tuo toki toimii tuollaisenaan kun kukaan ei ole heti vaatimassa esimerkiksi divien käyttöä tablen sijaan. :-)


You can use Markdown to format your comment:

  • > quoted text
  • *italic* text
  • **bold** text
  • `code block` (multi-line is ok, whitespace is preserved)
  • [link text](http://www.google.com "link title")

Separate paragraphs in your text with two newlines