Jak dodać wartości domyślne do tabeli bazy danych za pomocą hook_install ()?

9

Tworzę niestandardowy moduł z własnym schematem kilku tabel. Tabele te muszą mieć wstępnie wypełnione niektóre wartości, aby moduł mógł działać (domyślne lokalizacje, wybierz opcje itp.).

Jaki jest najlepszy sposób wstawiania wartości domyślnych do tych tabel podczas hook_install?

Ponieważ drupal_write_record nie jest dostępny, mogę używać db_query, ale chcę się tylko upewnić, że nie łamię żadnych zasadniczych reguł.

pomarańcze 13
źródło

Odpowiedzi:

7

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.

kiamlaluno
źródło
Gdybym to zrobił w hook_enable (), oznacza to, że wartości domyślne byłyby resetowane za każdym razem, gdy moduł jest włączany i wyłączany. Myślę, że jest to dość powszechne, w przeciwieństwie do całkowitego odinstalowywania i ponownej instalacji (w tym momencie oczekuje się, że baza danych zostanie zresetowana).
pomarańcze
1
Dlatego napisałem: „Implementacja przechwytująca powinna sprawdzić, czy nie dodała już tych wierszy bazy danych”. Oznacza to, że powinien sprawdzić, czy wartości są już w tabeli bazy danych, lub użyć zmiennej Drupal, aby sprawdzić, czy już wykonał to zadanie. Sprawdzanie tabeli bazy danych byłoby wykonane, jeśli te wartości muszą koniecznie znajdować się w bazie danych; na przykład ma to miejsce, gdy wymagane są wartości z modułu, a użytkownicy nie mogą usunąć wartości domyślnych.
kiamlaluno
Dziękuję za wyjaśnienie. Czy jest jakaś różnica w przechowywaniu tych wartości w mojej własnej tabeli niestandardowej w porównaniu z używaniem zmiennej_set do przechowywania ich w zmiennej trwałej? To tylko tablica wartości dla niestandardowych pól wyboru.
pomarańcze
Wszystkie wartości ustawione za pomocą variable_set(), które nie są usuwane variable_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.
kiamlaluno
Patrząc na kod (D7). Widzę tylko 2 linie kodu między wywołaniem hook_install a hook_enable: aktualizacja zmiennej lokalnej i wywołanie watchdoga. Tak więc podczas prawdziwej instalacji nie ma żadnej różnicy między tymi dwoma haczykami na temat tego, co jest dostępne i zarejestrowane, a co nie. Jedyną różnicą jest to, czy jest to pierwsza instalacja, czy tylko ponowne włączenie modułu.
fietserwin
4

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.

Bojan Zivanovic
źródło