Hoe werkt themen in drupal 6

Posted by: 
Dominique De Cooman

Stel je wil iets themen in je module.
Je gebruikt het drupal theme systeem omdat je logic van presentatie wil scheiden.
De mogelijkheden:
Een ordinaire theme functie zoals in drupal 5
Begin niet te flippen als het niet direct gaat en onthou elke keer je een functie bijschrijft moet drupal dit te weten komen. Dus clear de cache telkens je een nieuwe functie of file bijschrijft (admin/settings/performance onderaan staat de clear cache knop)

  • Registreer je theme functie met hook_theme() http://api.drupal.org/api/function/hook_theme/6
  • <?php
    function tandem_misc_theme() {
      return array(
        
    'sponser_link' => array(
          
    'arguments' => array('link' => NULL),
        ),
      );
    }
    ?>

  • Nu kan schrijf je je theme functie theme_naam_die_je_registreerde
  • <?php
    function theme_sponser_link($link) {
      return 
    check_url($link);
    }
    ?>

  • Deze theme functie kan je overriden zoals in drupal 5 door in je template.php file van je theme het volgende te zetten
  • <?php
    function phptemplate_sponsor_link($link) {
      
    $link '<a href="http://ietsanders';
    ">http://ietsanders';
    </a>  return 
    $link;
    }
    ?>

  • Wat we nu gedaan hebben is niet de manier van werken in drupal zes. We hebben nu de template preprocess functies. Deze functies worden gebruikt om eventueel nog logic uit te voeren voor het presenteren. Wat echter niet mogelijk is ze te gebruiken met een theme functie. Ze kunnen enkel gebruikt worden met een tpl.php file

Hoe doen we dat dan?

  • Registreer je functie met hook_theme() en je zorgt dat in je array de key template met als value je file name gebruikt.
  • <?php
    function tandem_misc_theme() {
      return array(
        
    'sponser_link' => array(
          
    'template' => 'sponser_link',
          
    'arguments' => array('link' => NULL),
        ),
      );
    }
    ?>

  • Je maakt een file aan sponser_link.tpl.php en in de file gebruik je alleen html, je doet hier geen logic. Je kan de file in je module folder zetten of in je theme folder staan ze in beide dan primeerd de file in de theme folder
  • <?php
    //tpl file
    print check_url($link);
    ?>

  • Wil je nu de link veranderen dan gebruik je in je template.php file in je theme folder de template_preprocess functie
  • <?php
    function phptemplate_preprocess_sponser_link(&$variables) {
      
    $variables['link'] = '<a href="http://ietsanders.com';
    ">http://ietsanders.com';
    </a>} 
    ?>

  • Ziezo nu is presentatie mooi van logic gescheiden en kunnen er geen problemen opduiken van ongecheckte, onveilige content.
  • Roep je theme functie bijvoorbeeld op vanuit een hook node api
  • <?php
    function tandem_misc_nodeapi(&$node$op$a3 NULL$a4 NULL) {
      
    //print_r($node);
      
    if ($node->type == 'tandem') {
        switch (
    $op) {
          case 
    'view':
            
    //build the sponsor link for payment system here:
            
    $link '<a href="http://google.com';
    ">http://google.com';
    </a>        
            
    $node->content['sponser_link'] = array(
              '#value' => theme('sponser_link', 
    $link),
              '#weight' => 10,
            );
            break;
        }
      }
    }
    ?>

Voor meer lees zeker de drupal documentatie http://drupal.org/node/165706 en de api voor hook_theme http://api.drupal.org/api/function/hook_theme/6

Reactie toevoegen