Drupal Module programmieren - Installationsdateien

Oft kommt man bei der Programmierung von Modulen nicht darum herum, Veränderungen in der Datenbank vorzunehmen. Sei es um Platz für Benutzereingaben zu schaffen, oder um Tabellen zu erstellen die Verbindungen zwischen anderen Inhalten herstellen sollen. Da man es dem Anwender eines Moduls nicht zumuten kann, alle notwendigen Tabellen per Hand zu erstellen, kann man einem Modul eine Installationsdatei hinzufügen, die diese Arbeit übernimmt.

Wie auch schon die Module- und Info-Datei, hat die Installationsdatei das Format modulname.install, also z.B. autotag.install oder meinmodul.install. Die Datei ist ebenfalls eine PHP-Datei und kann entsprechenden Code ausführen. Der Unterschied zur Module Datei ist allerdings, dass die Install-Datei nur einmal bei der Erstaktivierung des Moduls ausgeführt wird. Diese Datei ist also der perfekte Ort um Datenbank-Tabellen zu erstellen, oder auf dem Webspace Unterordner zu erstellen, oder irgendwelche anderen Aktionen durchzuführen, die nötig sind, damit das Modul später einwandfrei funktionieren kann.

Der häufigste Fall dürfte es sein, dass man mittels der INSTALL-Datei Datenbanktabellen erstellen möchte, weswegen ich darauf hier eingehe.

Zuerst einmal ein Rahmen für unsere meinmodul.install Datei:

<?php
// $Id$

/**
 * Implementation of hook_install().
 */
function meinmodul_install()
{
  //Use schema API to create database table.
  drupal_install_schema('meinmodul');
}

/**
 * Implementation of hook_uninstall().
 */
function meinmodul_uninstall()
{
  //Use schema API to delete database table.
  drupal_uninstall_schema('meinmodul');
}

Wir definieren hier zwei Hauptfunktionen: eine Install-Funktion und eine Uninstall-Funktion. Das hat den Hintergrund, dass man in Drupal Module deaktivieren und auch deinstallieren kann. Entfernt man den Haken eines Moduls in der Übersicht und klickt speichern, wird das Modul lediglich deaktiviert. Alle Variablen und auch Datenbank-Tabellen bleiben bestehen. Aktiviert man das Modul daraufhin wieder, ist daher nicht nur das Modul wieder verfügbar, sondern auch alle administrativen Einstellungen, die man evtl vorher am Modul vorgenommen hat. Will man ein Modul komplett entfernen, inklusive aller Einstellungen und Datenbankeinträge, muss man das Modul zuerst deaktivieren und dann über den Reiter "Deinstallation" auch noch deinstallieren. Und genau für diesen Fall ist die Funktion meinmodul_uninstall() zuständig.

Aber zurück zum Code: Wie ihr euch denken könnt, wird bei der Installation automatisch die Funktion meinmodul_install() gestartet und bei der Deinstallation automatisch meinmodul_uninstall(). Beide Funktionen machen aber nichts weiteres, als je eine weitere Funktion aufzurufen, nämlich drupal_install_schema und drupal_uninstall_schema.

Da Drupal verschiedene Typen von Datenbanken unterstützt, gibt es die Schema API. Als Modulprogrammierer muss man also die gewünschte Datenbankstruktur so formulieren, dass die Schema API sie versteht. Die tatsächlich Umwandlung in Datenbankverständliche Befehle (also z.B. SQL) erfolgt dann automatisch. Ein weiterer Vorteil ist, dass wir unsere Datenbanktabellen nur einmal beschreiben müssen und die gleiche Beschreibung sowohl für die Installation, als auch für die Deinstallation nutzen können.

Hier ein Beispiel für eine solche Beschreibung:

/**
 * Implementation of hook_schema().
 */
function meinmodul_schema()
{
  $schema['meinmodul'] = array(
    'description' => t('Description of my database table'),
    'fields' => array(
      'nid' => array(
        'type' => 'int',
        'unsigned' => TRUE,
        'not null' => TRUE,
        'default' => 0,
        'description' => t('Description of my database row'),
      ),
      'uid' => array(
        'type' => 'int',
        'unsigned' => TRUE,
        'not null' => TRUE,
        'default' => 0,
        'description' => t('Description of my database row'),
      ),
      'note' => array(
        'description' => t('Description of my database row'),
        'type' => 'text',
        'not null' => TRUE,
        'size' => 'big'
      ),
      'created' => array(
        'description' => t('Description of my database row'),
        'type' => 'int',
        'not null' => TRUE,
        'default' => 0
      ),
    ),
    'primary key' => array(
      'nid', 'uid'
    ),
  );
  
  return $schema;
}

Wie in jeder Datenbanktabelle können wir also sowohl die Tabelle beschreiben, als auch jede einzelne Spalte. Welche Werte uns hier zur Verfügung stehen, findet ihr hier: http://drupal.org/node/146939

Packen wir jetzt alle drei Funktionen zusammen haben wir unsere fertige INSTALL Datei, die sowohl bei der Installation als auch Deinstallation des Moduls ausgeführt wird.

Viele weitere Informationen zur Schema API gibt es außerdem im Drupal Development Guide (einfach nach "Drupal Schema API" googlen).