hook_node_info();にフィールドを追加します。


9

hook_node_infoを使用して宣言されたノードタイプにフィールドを追加することは可能ですか?フィールドを個別に追加する必要がありますか?もしそうなら、私はそのためにどのフックを使用しますか?

回答:


8

フィールドを個別にアタッチする必要があります。フィールドを介して追加することはできませんhook_node_info()。通常、これはhook_install()モジュールの.installファイルの関数で行います。

Drupalコアの優れたシンプルな例は、ブログモジュールのインストールファイルにあります。

function blog_install() {
  // Ensure the blog node type is available.
  node_types_rebuild();
  $types = node_type_get_types();
  node_add_body_field($types['blog']);
}

この関数は単にノードタイプを再構築し(新しく追加されたタイプが利用可能になる)、node_add_body_field()関数を使用してボディフィールドを追加します。この関数自体は、フィールドとそのフィールドのインスタンスを作成し、field_create_field()and field_create_instance()関数を使用してコンテンツタイプにアタッチする方法の優れた例です。

コードはそれほど長くないので、例としてここに含めます。

function node_add_body_field($type, $label = 'Body') {
  // Add or remove the body field, as needed.
  $field = field_info_field('body');
  $instance = field_info_instance('node', 'body', $type->type);
  if (empty($field)) {
    $field = array(
      'field_name' => 'body', 
      'type' => 'text_with_summary', 
      'entity_types' => array('node'),
    );
    $field = field_create_field($field);
  }
  if (empty($instance)) {
    $instance = array(
      'field_name' => 'body', 
      'entity_type' => 'node', 
      'bundle' => $type->type, 
      'label' => $label, 
      'widget' => array('type' => 'text_textarea_with_summary'), 
      'settings' => array('display_summary' => TRUE), 
      'display' => array(
        'default' => array(
          'label' => 'hidden', 
          'type' => 'text_default',
        ), 
        'teaser' => array(
          'label' => 'hidden', 
          'type' => 'text_summary_or_trimmed',
        ),
      ),
    );
    $instance = field_create_instance($instance);
  }
  return $instance;
}

ありがとう。hook_uninstallで何かをする必要がありますか?
ゲーラン2012年

それは本当にあなた次第です...作成したコンテンツ/コンテンツタイプ/フィールドを削除する場合は、はい、削除しない場合は、いいえ:)
クライヴ

モジュールがオフになったときにコンテンツタイプが消えないのはなぜですか?
ゲーラン2012年

2
(Drupal 7で)モジュールを無効にしても、無効なモジュールをアンインストールしても、カスタムコンテンツタイプは消えません。モジュールのhook_uninstall()中にインストール中に作成したコンテンツタイプを削除するコードを記述した場合、モジュールをアンインストールするとコンテンツタイプは表示されなくなります(ただし、単に無効にするだけではありません)。
アンクルコードモンキー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.