カスタム列をユーザーテーブルに追加する正しい方法?


7

'updated'という名前の列をユーザーテーブルに直接追加しようとしています。

この場合、外部の制約のために、フィールドAPIと結合はオプションではありません。

user_schemaを安全に変更して、カスタムモジュールに「更新」列を追加し、モジュールが削除されたときに安全にクリーンアップするにはどうすればよいですか?

以下は、スキーマAPIに基づく「更新」列のレイアウトです。

  $field = array(
      'type' => 'int',
      'not null' => TRUE,
      'default' => 0,
      'description' => 'Timestamp for last time user was updated.',
  );

現在、hook_installを使用した私の試みは、期待どおりに機能していません。

回答:


5

hook_schema_alter()が欠落していたようです。これにより、drupal_write_record()およびビューに関する問題が修正されました。あなたが感謝@Cliveあなたのためにここにコメント

必要な作業の概要:

  • hook_install()あなたが呼び出す必要がありdb_add_fieldをフィールドを追加します()。
  • hook_schema_alter()あなたは他のモジュールが変更と対話できるようにスキーマを変更します。
  • hook_uninstall()あなたが呼び出す必要がありdb_drop_field /クリーンアップあなたの追加フィールドを削除するために)(。

実際のコード:

これが私がこれを達成した方法です。以下のコードはmodule.installファイルに属しています。

function hook_install() {
  $field = array(
      'type' => 'int',
      'not null' => TRUE,
      'default' => 0,
      'description' => 'Timestamp for last time user was updated.',
  );
  $index = array(
      'indexes' => array(
          'updated' => array('updated')
      ),
  );
  db_add_field('users', 'updated', $field, $index);
}
function hook_schema_alter(&$schema) {
  $schema['users']['fields']['updated'] = array(
      'type' => 'int',
      'not null' => TRUE,
      'default' => 0,
      'description' => 'Timestamp for last time user was updated.',
  );
}

function hook_uninstall() {
  db_drop_field('users', 'updated');
}

空のmymodule.moduleを作成しました。さらに、mymodule.info(モジュールリストに表示されるようにするため)とmymodule.install(上記のコードを使用)を追加しました。すべての「hook_」を「mymodule_」に変更しました。変更をアンインストールするには、モジュールの選択を解除し、[アンインストール]タブに移動して、それを確認する必要があります。その方法でアンインストールすると、そのフィールドに関連付けられているすべてのデータが削除されます。
sksallaj 2016

私は間違っているかもしれませんが、一般的にモジュールをアンインストールするときは、モジュールが作成または追加されたすべてのトレースを削除しようとしています。
Citricguy 2016

はい。ただし、フィールドを更新しようとしたときに、フィールドをアンインストールし、再インストールして更新を適用する必要があります。上記のコードの列に変更があった場合、Drupalは単にコードを更新しません。そのため、更新前に特定の手順を考慮する必要があります。
sksallaj 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.