Lepszym sposobem jest zrobienie tego wewnątrz hook_enable () ; w momencie wywołania haka moduł jest już zainstalowany, a schemat jego bazy danych jest dostępny dla Drupala i dla drupal_write_record()
. Ponieważ hook jest wywoływany za każdym razem, gdy moduł jest włączony, a nie tylko podczas instalacji modułu, implementacja hooka powinna sprawdzić, czy nie dodała już tych wierszy bazy danych (np. Powinna używać zmiennej Drupal zawierającej wartość logiczną) .
Jako przykład modułu, który używa hook_enable()
do podobnego celu, możesz sprawdzić forum_enable () lub php_enable () (który dodaje format wejściowy „kod PHP”).
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))));
}
}
Jak pokazano z tych implementacji przechwytujących, kod może koniecznie być wykonywany za każdym razem, gdy wykonywane jest przechwytywanie; kod może być po prostu wykonany raz, ponieważ w przypadku domyślnych wartości dodanych do bazy danych nie można zmienić od użytkownika, który nie ma interfejsu użytkownika do zmiany / usunięcia tych wartości.
variable_set()
, które nie są usuwanevariable_del()
, są ładowane do pamięci podczas ładowania Drupala i zapisywane w zmiennej globalnej; oznacza to, że są w pamięci niezależnie od tego, czy moduł używa tych wartości, czy nie. Korzystając z niestandardowej tabeli bazy danych, możesz być pewien, że te wartości są ładowane tylko wtedy, gdy moduł naprawdę tego potrzebuje. Nie powinieneś używać,variable_set()
jeśli zmienna Drupal zawiera tablicę, do której na przykład ciągle dodajesz nowy indeks tablicy.Poszedłbym z
db_query
/db_insert
(D6 / D7) w hook_install ().Nie jest to uważane za złą praktykę (i nikt nigdy nie zmusza cię do użycia
drupal_write_record()
).Często zdarza się, że ludzie wyłączają i ponownie włączają moduły, a w takim przypadku Twój kod
hook_enable()
uruchamia się za każdym razem. co nie jest miłe.źródło