Wie füge ich einer Datenbanktabelle mit hook_install () Standardwerte hinzu?

9

Ich erstelle ein benutzerdefiniertes Modul mit einem eigenen Schema einiger Tabellen. In diese Tabellen müssen einige Werte vorab ausgefüllt sein, damit das Modul funktioniert (Standardspeicherorte, Auswahloptionen usw.).

Was ist die beste Methode, um während der Hook-Installation Standardwerte in diese Tabellen einzufügen?

Da drupal_write_record nicht verfügbar ist, kann ich db_query verwenden, möchte aber nur sicherstellen, dass ich damit keine Kardinalregeln verletze.

Orangen13
quelle

Antworten:

7

Der bessere Weg ist, es in hook_enable () zu tun ; Zum Zeitpunkt des Aufrufs des Hooks ist das Modul bereits installiert und das Schema seiner Datenbank steht Drupal und drupal_write_record(). Da der Hook immer dann aufgerufen wird, wenn ein Modul aktiviert ist, und nicht nur, wenn das Modul installiert ist, sollte die Hook-Implementierung prüfen, ob diese Datenbankzeilen noch nicht hinzugefügt wurden (z. B. sollte eine Drupal-Variable verwendet werden, die einen booleschen Wert enthält). .

Als Beispiel für ein Modul, das hook_enable()für einen ähnlichen Zweck verwendet wird, können Sie forum_enable () oder php_enable () überprüfen (wodurch das Eingabeformat "PHP-Code" hinzugefügt wird ).

function php_enable() {
  $format_exists = (bool) db_query_range('SELECT 1 FROM {filter_format} WHERE name = :name', 0, 1, array(':name' => 'PHP code'))->fetchField();
  // Add a PHP code text format, if it does not exist. Do this only for the
  // first install (or if the format has been manually deleted) as there is no
  // reliable method to identify the format in an uninstall hook or in
  // subsequent clean installs.
  if (!$format_exists) {
    $php_format = array(
      'format' => 'php_code', 
      'name' => 'PHP code',
      // 'Plain text' format is installed with a weight of 10 by default. Use a
      // higher weight here to ensure that this format will not be the default
      // format for anyone. 
      'weight' => 11, 
      'filters' => array(
        // Enable the PHP evaluator filter.
        'php_code' => array(
          'weight' => 0, 
          'status' => 1,
        ),
      ),
    );
    $php_format = (object) $php_format;
    filter_format_save($php_format);

    drupal_set_message(t('A <a href="@php-code">PHP code</a> text format has been created.', array('@php-code' => url('admin/config/content/formats/' . $php_format->format))));
  }
}

Wie aus diesen Hook-Implementierungen hervorgeht, muss der Code möglicherweise immer ausgeführt werden, wenn der Hook ausgeführt wird. Es kann auch sein, dass der Code nur einmal ausgeführt werden muss, da die der Datenbank hinzugefügten Standardwerte nicht vom Benutzer geändert werden können, der keine Benutzeroberfläche zum Ändern / Löschen dieser Werte hat.

kiamlaluno
quelle
Wenn ich dies in hook_enable () getan habe, bedeutet dies, dass die Standardwerte jedes Mal zurückgesetzt werden, wenn das Modul aktiviert und deaktiviert wird. Ich denke, das ist ziemlich häufig, im Gegensatz zu einer vollständigen Deinstallation und Neuinstallation (an diesem Punkt wird erwartet, dass die Datenbank zurückgesetzt wird).
Orangen13
1
Aus diesem Grund schrieb ich: "Die Hook-Implementierung sollte prüfen, ob diese Datenbankzeilen noch nicht hinzugefügt wurden." Dies bedeutet, dass überprüft werden sollte, ob sich die Werte bereits in der Datenbanktabelle befinden, oder mithilfe einer Drupal-Variablen überprüft werden sollte, ob diese Aufgabe bereits ausgeführt wurde. Das Überprüfen der Datenbanktabelle würde durchgeführt, wenn diese Werte unbedingt in der Datenbank vorhanden sein müssen. Dies ist beispielsweise der Fall, wenn die Werte vom Modul benötigt werden und die Benutzer die Standardwerte nicht entfernen dürfen.
Kiamlaluno
Danke für die Klarstellung. Gibt es einen Unterschied beim Speichern dieser Werte in meiner eigenen benutzerdefinierten Tabelle gegenüber der Verwendung von variable_set zum Speichern in einer persistenten Variablen? Es ist nur ein Array von Werten für benutzerdefinierte Auswahlfelder.
Orangen13
Alle mit verwendeten Werte variable_set(), die nicht mit gelöscht werden variable_del(), werden beim Drupal-Bootstraps in den Speicher geladen und in einer globalen Variablen gespeichert. Dies bedeutet, dass sie sich im Speicher befinden, unabhängig davon, ob das Modul diese Werte verwendet oder nicht. Mithilfe einer benutzerdefinierten Datenbanktabelle können Sie sicher sein, dass diese Werte nur geladen werden, wenn das Modul sie wirklich benötigt. Sie sollten nicht verwenden, variable_set()wenn die Drupal-Variable ein Array enthält, zu dem Sie beispielsweise immer wieder einen neuen Array-Index hinzufügen.
Kiamlaluno
Den Code betrachten (D7). Ich sehe nur zwei Codezeilen zwischen dem Aufruf von hook_install und hook_enable: ein Update einer lokalen Variablen und einen Aufruf von watchdog. Während einer echten Installation gibt es also keinen Unterschied zwischen diesen beiden Hooks, was verfügbar und registriert ist und was nicht. Der einzige Unterschied besteht darin, ob dies eine Erstinstallation ist oder nur das Modul wieder aktiviert.
Fietserwin
4

Ich würde mit db_query/ db_insert(D6 / D7) in hook_install () gehen.

Es wird nicht als schlechte Praxis angesehen (und niemand zwingt Sie jemals dazu drupal_write_record()).

Es ist nicht ungewöhnlich, dass Benutzer Module deaktivieren und wieder aktivieren. In diesem Fall wird Ihr Code hook_enable()jedes Mal ausgelöst. das ist nicht schön.

Bojan Zivanovic
quelle