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.
variable_set()
, die nicht mit gelöscht werdenvariable_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.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.quelle