カスタムモジュールで定義されたカスタムノードにプログラムでフィールドを割り当てる


7

モジュールをDrupal 6からDrupal 7に変換しようとしています。Drupal7は、独自のノードタイプをhook_node_infoで定義します。

hook_node_infoはhas_titleとhas_bodyをTRUEに定義していますが、これらのフィールドをノードフォームに表示するにはどうすればよいですか?以前は、hook_form()を使用していました。

function mymodule_form(&$node, $form_state) { 
  $type = node_get_types('type', $node);

  if ($type->has_title) {
    $form['title'] = array(
        '#type' => 'textfield',
        '#title' => check_plain($type->title_label),
        '#required' => TRUE,
        '#default_value' => $node->title,
        '#weight' => -25,
    );
  }

  if ($type->has_body) {
    $form['body_field'] = node_body_field($node, $type->body_label, $type->min_word_count);
    $form['body_field']['body']['#rows'] = 5;
    $form['body_field']['body']['#description'] = 'Enter a short message to present to the user.';
  }

  return $form;
}

D6では、これでうまくいきました。Drupal 7では、hook_formが変更されており、私はそのドキュメントを完全にはフォローしていません。

モジュールがアクティブ化されたときに、コアのボディとタイトルフィールドをどのように利用し、このノードタイプに割り当てることができますか?

さらに、新しいフィールドタイプを定義して、本文(要約付きの長いテキスト)を選択したものに模倣するにはどうすればよいですか?

回答:


4

bodyフィールドをコンテンツタイプに追加するには、node_add_body_field()を使用します。身体のフィールドではないフィールドを追加するには、使用)(field_create_fieldフィールドが存在し、しない場合は、field_create_instance()エンティティ(例えば、Aノードまたはユーザオブジェクト)に、フィールドのインスタンスを割り当てること。

これらの関数の使用方法の例として、次のコードを含む標準プロファイルのインストールフックであるstandard_install()を見ることができます。

  $field = array(
    'field_name' => 'field_' . $vocabulary->machine_name, 
    'type' => 'taxonomy_term_reference',
    'cardinality' => FIELD_CARDINALITY_UNLIMITED, 
    'settings' => array(
      'allowed_values' => array(
        array(
          'vocabulary' => $vocabulary->machine_name, 
          'parent' => 0,
        ),
      ),
    ),
  );
  field_create_field($field);

  $instance = array(
    'field_name' => 'field_' . $vocabulary->machine_name, 
    'entity_type' => 'node', 
    'label' => 'Tags', 
    'bundle' => 'article', 
    'description' => $vocabulary->help, 
    'widget' => array(
      'type' => 'taxonomy_autocomplete', 
      'weight' => -4,
    ), 
    'display' => array(
      'default' => array(
        'type' => 'taxonomy_term_reference_link', 
        'weight' => 10,
      ), 
      'teaser' => array(
        'type' => 'taxonomy_term_reference_link', 
        'weight' => 10,
      ),
    ),
  );
  field_create_instance($instance);

コードは、コンテンツタイプ「Article」に分類用語フィールドを追加しています。


1

これは、Drupal 6.xから7.xへのモジュールの変換に関する優れたドキュメントです。

状態があります

ノード本体のフィールドインスタンスは、フィールドAPIによって排他的に処理されるようになりました

ノードタイプを定義するか、node_type_save()でノードタイプを作成する場合、 'has_body'および 'body_label'キーは非推奨になりました。

本文フィールドを追加するには、代わりにnode_add_body_field($ type);を呼び出します。これにより、フィールドインスタンスがそのノードタイプに追加されます。例については、blog.installおよびforum.installを参照してください。

forum.installblog.installをチェックしてください

したがって、これを実行する場所は、mymodule.install内、およびmymodule_install()またはmymodule_enable()内です。



本文のようなフィールドを模倣するには、node_add_body_fieldからコードを取得して、プライベート関数に入れます
iStryker

フィールドを作成してノードタイプに割り当てる単純なフィールドAPIはありませんか?
ケビン

mymodule_form()内など、もっと簡単な方法はないと思います。Drupal 7はフィールドインスタンスを使用しており、私の理解では、使用する前にデータベースに追加する必要があります。フォーラムとブログモジュールがhook_install()とhook_enable()を使用するのはそのためです。補足:プライベート関数でfield_create_instance()とfield_create_field()を使用して、後で型に追加できますが、それはなぜでしょうか。
iStryker、2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.