Eigene theme_ hooks implementieren und preprocess Funktionen nutzen

Um eigene Theming Funktionen in einem Modul zu implementieren, müssen folgende Schritte durchgeführt werden.

1. theme_hook verwenden, um die Theme Funktionen in der Drupal Theme Registry bekannt zu machen. Wichtig: Jede Änderung wird erst dann sichtbar, wenn der Cache geleert wurde. Dies erreicht man am einfachsten, in dem man das Devel-Modul installiert und den Block auf der Webseite einfügt. Dann hat man immer die Möglichkeit, den Cache zu leeren.

function mymodule_theme() {
  return array(
    'mymodule' => array(
      'template' => 'mymodule_overview',
      'arguments' => array('node' => null),
     ),
    'mymodule_details' => array(
      'template' => 'mymodule_details',
      'arguments' => array('node' => null),
     ),
    'mymodule_file' => array(
      'arguments' => array('file' => NULL),
      'file' => 'formatter.inc',
    ), 
  );
}

Der Beispielcode registriert zwei theme hooks. Als Parameter wird jeweils die $node Variable übergeben.

2. template_preprocess Funktionen implementieren. Mit den Preprocess Funktionen können alle Variablen aufbereitet werden, die im Template zur Verfügung stehen sollen. Damit wird eine saubere Trennung zwischen Code und Design erreicht. Auf die Variablen greifen wir im letzten Schritt zu.

function template_preprocess_mymodule(&$variables) {
	
  $node = $variables['node'];
  $variables['title'] = l($node->title, 'node/'.$node->nid);
  $variables['detaillink'] = l(t('Details'), 'node/'.$node->nid);
	
}

function template_preprocess_mymodule_details(&$variables) {
	
  $node = $variables['node'];
  $variables['title'] = l($node->title, 'node/'.$node->nid);

}

3. Modul-Template Files anlegen und auf die vorbereiteten Variablen zugreifen

File mymodule.tpl.php

<?php

/**
 * 
 * Template für normale Ansicht
 */

?>
<h1><?php print $title ?></h1>
<?php 
	$view = views_get_view('liste');
	print $view->execute_display('default', array($node->nid));	
?>
<br />
<?php print $detaillink ?>

?>

File mymodule_details.tpl.php

/**
 * 
 * Template für Detailansicht
 */

?>
<h1><?php print $title ?></h1>
<?php 
	$view = views_get_view('liste');
	print $view->execute_display('all', array($node->nid));	
?>

4. Template Funktionen ohne template File implementieren. Wie man in der Theme Registry sehen kann, unterscheidet sich der letzte Hook von den Beiden ersten. Hierbei handelt es sich um eine Theme Funktion die auf eine Template Datei verzichtet und einfach den entsprechenden gerenderten HTML Code zurückgibt.

Datei formatter.inc (im gleichen Verzeichnis wie mymodule.module)

<?php

/**
 * file formatter
 */

function theme_filefield_file($file) {
  if (empty($file['fid'])) {
    return '';
  }

  $path = $file['filepath'];
  $url = file_create_url($path);
  $options = array(
    'attributes' => array(
      'type' => $file['filemime'],
      'length' => $file['filesize'],
    ),
  );

  if (empty($file['data']['description'])) {
    $link_text = $file['filename'];
  }
  else {
    $link_text = $file['data']['description'];
    $options['attributes']['title'] = $file['filename'];
  }

  return '<div class="filefield-file clear-block">'. $icon . l($link_text, $url, $options) .'</div>';
}

?>