web-dev-qa-db-ja.com

プログラムでカスタムモジュールのファイルフィールドを使用してコンテンツタイプを作成する

以前に作成したカスタムモジュールを作成していますが、フィールドを使用してコンテンツタイプを作成しようとしたのはこれが初めてです。私は hook_node_info を実装しましたが、admin_menuのドロップダウンのコンテンツタイプのリストにコンテンツタイプが表示されていますが、_admin/structure/types_にアクセスするとリストされません。

私は hook_install を実装し、別のSO質問で見つけたいくつかのコードを取得しました。コードがいくつかのデバッグ情報をエラーログに出力し、すべてがうまくいくように見えます、ただし、構造コンテンツタイプを参照すると、追加したフィールドが表示されません。

ここにフックがあります:

_function mymod_node_info() {
  return array(
    'mymod_content' => array(
      'name' => t('My Mod'),
      'base' => 'mymod_content',
      'description' => t('A Description'),
    )
  );
}

function mymod_install() {
    error_log('mymod_install');
    $types = node_type_get_types();

    if ( ! field_info_field('field_mymod_myfile') ) {
        $field = array(
            'field_name' => 'field_mymod_myfile',
            'type' => 'file',
        );
        $created_field = field_create_field($field);
        error_log('---- field_create_field -----');
        error_log(var_export($created_field, true));
    }

    $instance = array(
        'field_name' => 'field_mymod_myfile',
        'entity_type' => 'mymod_content',
        'bundle' => 'mymod_content',
        'required' => TRUE,
    );
    $created_instance = field_create_instance($instance);
    error_log('---- field_create_instance -----');
    error_log(var_export($created_instance, true));
}
_

データベースで_field_data_field_mymod_myfile_というテーブルを見ることができるので、最初の部分が機能したことがわかります。ただし、テーブルは空です。

エラーログは、field_create_instance()メソッドがこれを返したことを示しています:

_array (
  'field_name' => 'field_mymod_myfile',
  'entity_type' => 'mymod_content',
  'bundle' => 'mymod_content',
  'required' => true,
  'field_id' => '5',
)
_

このコンテンツタイプに私のフィールドが表示されないのはなぜですか?

9
Kenny Wyland

これは前の答えを拡張したものなので、それほど多くの答えではありません。

これら2つのリンクは、カスタムモジュールノードタイプにカスタムフィールドを追加するためにシステムが必要とするものを理解するのに非常に役立ちました。

ベスト: http://www.sitepoint.com/creating-a-new-drupal-node-type/

良い追加情報: http://public-action.org/content/drupal-7-field-api-drupal-7-adding-custom-content-type-custom-fields-field-api

私が抱えていた問題は、これら(およびオンラインで見つけることができる他のすべての例)が非常に具体的な例であり、自分の使用例の解決策を理解するのに役立つ十分なドキュメントがないことです。

助けになったのは、機能モジュールを使用してカスタムフィールドの配列を取得することに関するOPへのtenkenのコメントでした。

だから私は機能モジュールをダウンロードして有効にしました: https://drupal.org/project/features

次に、Drupalの管理インターフェイスを使用して、通常のようにモジュールを作成することを望んで、コンテンツタイプにフィールドを作成しました。次に、[構造]> [機能]> [機能の作成]に移動し、機能の偽の名前(私は「テスト」を使用)で、次にコンポーネント領域で「フィールドインスタンス」をクリックし、カスタムフィールドのチェックボックスをオンにします。フィールドはすべてnode- [your node type machine name]-[field name]なので、私の場合、画像フィールドが必要だったので、node-novel_section-field_imageでした。

ノードタイプのカスタムフィールドを選択した後、「ダウンロード機能」をクリックして.tarファイルをデスクトップに保存し、それを開き、「test」フォルダーを開き、test.features.field_base.incを表示してテストしました。 features.field_instance.incを使用して、フィールドに必要な配列を取得します。

次に、私が投稿した最初のリンクで概説されている構造を使用しましたが、その後は完全に機能しました。私のために。

画像フィールドや分類法参照フィールドなどに必要な配列構造に関するドキュメントは見つかりませんでした。また、オンラインの他のチュートリアルやヘルプリクエストはすべて、テキストフィールドなどの特定のものに焦点を当てているようです。

うまくいけば、私が抱えていたのと同じ問題を抱えている誰もがこれを見て、私がしたようにこれらの例と機能モジュールを使用してセットアップ作業を行えるようになるでしょう。

Featuresモジュールのこの機能を指摘してくれたtenkenのおかげで、私はそれを使用したことがなく、それが実行されることを知りませんでした。

7
Jason Gray

.installファイルに追加する必要がある新しいコンテンツタイプを作成するこのコード。

hook_install()の追加:

<?php
function your_module_name_install() {
  // use get_t() to get the name of our localization function for translation
  // during install, when t() is not available.
  $t = get_t();

  // Define the node type.
  $node_example = array(
    'type' => 'node_example',
    'name' => $t('Example Node'),
    'base' => 'node_content',
    'description' => $t('This is an example node type with a few fields.'),
    'body_label' => $t('Example Description')
  );

  // Complete the node type definition by setting any defaults not explicitly
  // declared above.
  // http://api.drupal.org/api/function/node_type_set_defaults/7
  $content_type = node_type_set_defaults($node_example);
  node_add_body_field($content_type);

  // Save the content type
  node_type_save($content_type);
}
?>

drupalメッセージを作成し、このイベントをログに書き込む必要があります:

<?php
function your_module_name_install() {
  $t = get_t();
  $node_example = array(
    'type' => 'node_example',
    'name' => $t('Example Node'),
    'base' => 'node_content',
    'description' => $t('This is an example node type with a few fields.'),
    'body_label' => $t('Example Description')
  );
  $content_type = node_type_set_defaults($node_example);
  node_add_body_field($content_type);
// Check if we create content type or update.
  $status = node_type_save($content_type);
// Replacement rule for the messages.
  $t_args = array('%name' => $content_type->name);
  if ($status == SAVED_UPDATED) { // update case
    drupal_set_message($t('The content type %name has been updated.', $t_args));
  } 
  elseif ($status == SAVED_NEW) { // create case
    drupal_set_message($t('The content type %name has been added.', $t_args));
    watchdog('node', 'Added content type %name.', $t_args, WATCHDOG_NOTICE, l($t('view'), 'admin/structure/types')); 
  }
}
?>

コンテンツタイプを削除するためにhook_uninstall()を提供

<?php
function your_module_name_uninstall() {
  // Gather all the example content that might have been created while this
  // module was enabled.  Simple selects still use db_query().
  // http://api.drupal.org/api/function/db_query/7
  $sql = 'SELECT nid FROM {node} n WHERE n.type = :type';
  $result = db_query($sql, array(':type' => 'node_example'));
  $nids = array();
  foreach ($result as $row) {
    $nids[] = $row->nid;
  }
  // Delete all the nodes at once
  // http://api.drupal.org/api/function/node_delete_multiple/7
  node_delete_multiple($nids);
  // Delete our content type
  // http://api.drupal.org/api/function/node_type_delete/7
  node_type_delete('node_example');
}
?>
4
Nitesh Sethia

この投稿は少し古くなっていますが、それが役に立てば、この記事は非常に明確であることがわかりました。新しいコンテンツタイプを作成する方法を手順を追って説明します。

チュートリアルへのリンク

<?php

/**
 * Implements hook_install().
 */
function book_install()
{

    $t = get_t();

    // Step 1 - Define the custom content type

    $content_type = array(

        'type'          => 'book',
        'name'          => $t('Book'),
        'description'   => $t('Create a new book'),
        'title_label'   => $t('Book title'),
        'base'          => 'node_content',
        'custom'        => TRUE,

    );

    $node_type = node_type_set_defaults($content_type);

    node_type_save($node_type);

    // Step 2 - Create new fields

    $fields = array(

        // Author’s name

        'book_author_name'  => array(

            'field_name'    => 'book_author_name',
            'type'          => 'text',
            'cardinality'   => 1,

        ),

        // Description

        'book_description'  => array(

            'field_name'    => 'book_description',
            'type'          => 'text_long',
            'cardinality'   => 1,

        ),

    );

    foreach( $fields as $field ) {

        field_create_field($field);

    }

    // Step 3 - Attach fields to content type

    $instances = array(

        // Author’s name

        'book_author_name'  => array(

            'field_name'   => 'book_author_name',
            'label'        => $t('Author Name'),
            'required'     => TRUE,
            'widget'       => array(
                'type'  => 'text_textfield'
            ),

        ),

        // Description

        'book_description'  => array(

            'field_name'   => 'book_description',
            'label'        => $t('Description'),
            'required'     => TRUE,
            'widget'       => array(
                'type'  => 'text_textarea'
            ),

        ),

    );

    foreach( $instances as $instance ) { // Loop through our instances

        $instance['entity_type']   = 'node';
        $instance['bundle']        = 'book'; // Attach the instance to our content type

        field_create_instance($instance);

    }

}
1
Shlomi Nissan