Drupal-navigointimoduuli: Taxonomy footer
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
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ää.
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.)
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:
Separate paragraphs in your text with two newlines