Bagaimana cara menambahkan nilai default ke tabel database menggunakan hook_install ()?

9

Saya membuat modul khusus dengan skema sendiri dari beberapa tabel. Tabel-tabel ini perlu memiliki beberapa nilai yang terisi sebelumnya ke dalamnya agar modul dapat berfungsi (lokasi default, opsi pilih, dll).

Apa cara praktik terbaik untuk memasukkan nilai default ke tabel ini selama hook_install?

Karena drupal_write_record tidak tersedia, saya dapat menggunakan db_query, tetapi saya hanya ingin memastikan bahwa saya tidak melanggar aturan utama dengan melakukannya.

jeruk13
sumber

Jawaban:

7

Cara yang lebih baik adalah melakukannya di dalam hook_enable () ; pada saat hook dipanggil, modul sudah diinstal, dan skema database-nya tersedia untuk Drupal, dan untuk drupal_write_record(). Karena kait dipanggil setiap kali modul diaktifkan, dan bukan hanya ketika modul dipasang, implementasi kait harus memeriksa apakah sudah menambahkan baris database tersebut (misalnya, ia harus menggunakan variabel Drupal yang berisi nilai boolean) .

Sebagai contoh modul yang digunakan hook_enable()untuk tujuan serupa, Anda dapat memeriksa forum_enable () , atau php_enable () (yang menambahkan format input "kode 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))));
  }
}

Seperti yang ditunjukkan dari implementasi pengait tersebut, kode harus perlu dieksekusi setiap kali pengait dijalankan; bisa juga kode hanya perlu dijalankan sekali, karena dalam kasus ini nilai-nilai default yang ditambahkan ke database tidak dapat diubah dari pengguna, yang tidak memiliki antarmuka pengguna untuk mengubah / menghapus nilai-nilai tersebut.

kiamlaluno
sumber
Jika saya melakukan ini di hook_enable (), itu berarti nilai default akan diatur ulang setiap kali modul diaktifkan dan dinonaktifkan. Saya pikir itu cukup umum, yang bertentangan dengan un-install dan instal ulang (pada saat itu diharapkan database akan direset).
jeruk13
1
Itulah sebabnya saya menulis, "implementasi hook harus memeriksa jika tidak menambahkan baris database tersebut." Ini berarti bahwa itu harus memeriksa apakah nilai-nilai sudah ada di tabel database, atau menggunakan variabel Drupal untuk memeriksa apakah sudah melakukan tugas itu. Memeriksa tabel database akan dilakukan jika nilai-nilai itu perlu dalam database; misalnya, ini adalah kasus jika nilai diperlukan dari modul, dan pengguna tidak diperbolehkan untuk menghapus nilai default.
kiamlaluno
Terimakasih atas klarifikasinya. Apakah ada perbedaan dalam menyimpan nilai-nilai ini di tabel kustom saya sendiri vs hanya menggunakan variabel_set untuk menyimpannya dalam variabel persisten? Ini hanya array nilai untuk kotak pilih khusus.
jeruk13
Semua nilai yang ditetapkan menggunakan variable_set(), yang tidak dihapus dengan variable_del(), dimuat dalam memori saat bootup Drupal, dan disimpan dalam variabel global; ini berarti mereka berada dalam memori apa pun modul yang menggunakan nilai-nilai itu, atau tidak. Menggunakan tabel basis data khusus, Anda dapat memastikan nilai-nilai itu hanya dimuat ketika modul benar-benar membutuhkannya. Anda tidak boleh menggunakan variable_set()jika variabel Drupal berisi larik yang terus Anda tambahkan indeks larik baru setiap saat, misalnya.
kiamlaluno
Melihat kode (D7). Saya hanya melihat 2 baris kode antara doa hook_install dan hook_enable: pembaruan ke variabel lokal dan panggilan ke watchdog. Jadi, selama instalasi yang sebenarnya, tidak ada perbedaan apa pun antara 2 kait ini tentang apa yang tersedia dan yang terdaftar dan yang tidak. Satu-satunya perbedaan adalah apakah ini merupakan instalasi pertama kali atau hanya mengaktifkan kembali modul.
fietserwin
4

Saya akan menggunakan db_query/ db_insert(D6 / D7) di hook_install ().

Itu tidak dianggap praktik buruk (dan tidak ada yang memaksa Anda untuk menggunakan drupal_write_record()).

Ini tidak biasa bagi orang untuk menonaktifkan dan mengaktifkan kembali modul, dan dalam hal ini kode Anda hook_enable()akan diaktifkan setiap kali. itu tidak baik.

Bojan Zivanovic
sumber