Secara terprogram membuat tipe konten dengan bidang file dalam modul khusus

9

Saya menulis modul khusus, yang telah saya lakukan sebelumnya, tetapi ini adalah pertama kalinya saya mencoba membuat jenis konten dengan bidang. Saya menerapkan hook_node_info dan Tipe Konten muncul di daftar tipe Konten di dropdown dari admin_menu, namun, ketika saya menjelajahinya admin/structure/typestidak terdaftar.

Saya menerapkan hook_install dan mengambil beberapa kode yang saya temukan pada pertanyaan SO lainnya. Saya memiliki kode untuk mencetak beberapa informasi debug ke log kesalahan saya dan sepertinya semuanya berfungsi, tetapi ketika saya telusuri ke Tipe Konten Struktur, kode itu tidak menampilkan bidang yang saya tambahkan.

Di sini adalah kait:

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));
}

Saya bisa melihat tabel yang disebut field_data_field_mymod_myfiledalam database, jadi saya tahu bagian pertama berfungsi. Namun, tabelnya kosong.

Log kesalahan menunjukkan field_create_instance()metode mengembalikan ini:

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

Mengapa bidang saya tidak muncul di tipe konten ini?

Kenny Wyland
sumber
1
apakah kamu tidak suka Fitur? Saya merasa paling mudah untuk membuat Tipe Konten menggunakan FieldUI kemudian mengekspor Fitur ke "Fitur" (modul) kustom. ... itu hanya membuat array menggunakan hook_info yang Anda miliki di sini - dan array untuk definisi bidang. Anda bisa mengecek pekerjaan Anda dengan cara itu.
Tenken

Jawaban:

7

Ini bukan jawaban yang banyak karena merupakan perluasan dari jawaban sebelumnya.

Saya menemukan dua tautan ini sangat membantu dalam mencari tahu apa yang dibutuhkan sistem untuk bidang khusus yang akan ditambahkan ke jenis simpul modul kustom Anda.

Terbaik: http://www.sitepoint.com/creating-a-new-drupal-node-type/

Info tambahan yang bagus: http://public-action.org/content/drupal-7-field-api-drupal-7-adding-custom-content-type-custom-fields-field-api

Masalah yang saya miliki adalah bahwa ini (dan setiap contoh lain yang dapat saya temukan online) adalah contoh yang sangat spesifik tanpa dokumentasi yang cukup untuk membantu saya mencari solusi untuk kasus penggunaan saya sendiri.

Apa yang membantu adalah komentar tenken kepada OP tentang menggunakan modul Fitur untuk mendapatkan array untuk bidang khusus.

Jadi saya mengunduh modul Fitur dan mengaktifkannya: https://drupal.org/project/features

Lalu saya membuat bidang pada tipe konten saya, menggunakan antarmuka admin di Drupal seperti biasanya, yang saya inginkan untuk dibuat modul. Kemudian saya melihat-lihat Struktur> Fitur> Buat fitur dan memasukkan nama palsu (saya menggunakan "test") untuk fitur dan kemudian ke dalam area komponen klik pada "Field Instances" dan centang kotak untuk bidang kustom. Kolom-kolom tersebut semuanya dinamai sesuatu seperti simpul- [nama mesin tipe simpul Anda] - [nama bidang], jadi dalam kasus saya karena saya menginginkan bidang gambar, simpul-novel_section-field_image.

Setelah memilih bidang khusus untuk tipe simpul saya, saya kemudian hanya mengklik "Fitur unduhan" dan menyimpan file .tar ke desktop saya, membukanya, membuka folder "test" lalu melihat test.features.field_base.inc dan uji. features.field_instance.inc untuk mendapatkan array yang saya butuhkan untuk bidang saya.

Lalu saya hanya menggunakan struktur yang digariskan oleh tautan pertama yang saya posting dan setelah itu bekerja dengan sempurna. Untuk saya.

Saya tidak dapat menemukan dokumentasi tentang struktur array yang diperlukan untuk hal-hal seperti bidang gambar dan bidang referensi taksonomi dan sepertinya semua tutorial dan permintaan bantuan online difokuskan pada hal-hal tertentu seperti bidang teks.

Semoga siapa pun yang memiliki masalah yang sama dengan yang saya alami akan melihat ini dan dapat membuat pengaturan mereka bekerja menggunakan contoh-contoh ini dan modul Fitur seperti yang saya lakukan.

Berkat tenken karena menunjukkan fungsi modul Fitur ini, saya tidak pernah menggunakannya dan tidak tahu itu akan melakukannya.

Jason Gray
sumber
4

Kode ini yang akan dibuat jenis konten baru yang harus ditambahkan ke dalam file .install.

Menambahkan 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);
}
?>

Anda harus membuat pesan drupal dan menulis acara ini ke log:

<?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')); 
  }
}
?>

Berikan hook_uninstall () untuk menghapus jenis konten Anda :

<?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');
}
?>
Nitesh Sethia
sumber
Terima kasih atas respons yang sangat terperinci, tetapi bagaimana cara menambahkan bidang File ke jenis konten setelah dibuat?
Kenny Wyland
Saya menggunakan kode Anda di atas dan dikatakan jenis konten telah ditambahkan, tetapi tidak munculadmin/structure/types
Kenny Wyland
1
Agar ini berfungsi, Anda perlu mengimplementasikan hook_form () di modul Anda jika tidak, jika Anda melihat tabel node_type di database, Anda akan melihat bahwa tipe yang baru dibuat dinonaktifkan. Menerapkan hook_form () tampaknya mengaktifkannya (mengapa demikian, saya tidak tahu dan tidak masuk akal). Ngomong-ngomong, ini membahas komentar kedua Anda.
user5013
1

Posting ini sedikit ketinggalan zaman, tetapi jika ini membantu, saya menemukan artikel ini sangat jelas. Ini menunjukkan kepada Anda cara membuat tipe konten baru langkah demi langkah.

Tautan ke tutorial

<?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);

    }

}
Shlomi Nissan
sumber
Harap sertakan kutipan yang relevan dalam jawaban Anda
Pierre.Vriens