hook_install()を使用してデータベーステーブルにデフォルト値を追加するにはどうすればよいですか?


9

いくつかのテーブルの独自のスキーマを持つカスタムモジュールを作成しています。モジュールが機能するためには、これらのテーブルにいくつかの値が事前に入力されている必要があります(デフォルトの場所、オプションの選択など)。

hook_install中にこれらのテーブルにデフォルト値を挿入するためのベストプラクティスの方法は何ですか?

drupal_write_recordが利用できないため、db_queryを使用できますが、そうすることで基本的なルールに違反しないことを確認したいだけです。

回答:


7

より良い方法は、hook_enable()内で行うことです。フックが呼び出された時点で、モジュールはすでにインストールされており、そのデータベースのスキーマはDrupalとで使用できますdrupal_write_record()。モジュールがインストールされるときだけでなく、モジュールが有効になるたびにフックが呼び出されるため、フックの実装では、それらのデータベース行がまだ追加されていないかどうかを確認する必要があります(たとえば、ブール値を含むDrupal変数を使用する必要があります)。 。

hook_enable()同様の目的で使用するモジュールの例として、forum_enable()またはphp_enable()(「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))));
  }
}

これらのフック実装からわかるように、フックが実行されるたびにコードを実行する必要がある場合があります。また、データベースに追加されたデフォルト値を、これらの値を変更/削除するためのユーザーインターフェースを持たないユーザーが変更できない場合など、コードを1回実行するだけで十分な場合もあります。


これをhook_enable()で行った場合、モジュールが有効または無効になるたびにデフォルト値がリセットされます。完全にアンインストールしてから再インストールするのではなく、かなり一般的です(この時点でデータベースがリセットされることが予想されます)。
オレンジ

1
「フックの実装は、それらのデータベース行がまだ追加されていないかどうかを確認する必要があります」と私が書いた理由です。つまり、値がすでにデータベーステーブルにあるかどうかを確認するか、Drupal変数を使用して、そのタスクがすでに完了しているかどうかを確認する必要があります。これらの値がデータベースに存在する必要がある場合は、データベーステーブルのチェックが行われます。たとえば、モジュールから値が必要であり、ユーザーがデフォルト値を削除できない場合がこれに該当します。
kiamlaluno

説明をありがとう。これらの値を独自のカスタムテーブルに保存するのと、variable_setを使用して永続変数に保存するだけの違いはありますか?これは、カスタム選択ボックスの値の配列にすぎません。
オレンジ

すべての値を使用して設定variable_set()で削除されていない、variable_del()メモリにロードされ、ときDrupalのブートストラップ、およびグローバル変数に保存されています。これは、モジュールがこれらの値を使用しているかどうかに関係なく、それらがメモリにあることを意味します。カスタムデータベーステーブルを使用すると、モジュールが本当にそれを必要とする場合にのみ、これらの値が確実にロードされます。variable_set()たとえば、Drupal変数に、常に新しい配列インデックスを追加し続ける配列が含まれている場合は使用しないでください。
kiamlaluno

コード(D7)を見てください。hook_installとhook_enableの呼び出しの間にコードが2行しか表示されません。ローカル変数の更新とウォッチドッグの呼び出しです。したがって、実際のインストール中、これらの2つのフックの間で、何が利用可能で登録されているかとそうでないかについてはまったく違いはありません。唯一の違いは、これが初めてのインストールか、単にモジュールを再度有効にするかです。
fietserwin 2012年

4

私は、hook_install()でdb_query/ db_insert(D6 / D7)を使用します。

これは悪い習慣とは見なされていません(そして、あなたにを使うことを強制する人はいませんdrupal_write_record())。

モジュールを無効にしてから再度有効にすることは珍しくありません。その場合、コードはhook_enable()毎回実行されます。それは良くない。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.