Lập trình tạo một loại nội dung với trường tệp trong một mô-đun tùy chỉnh


9

Tôi đang viết một mô-đun tùy chỉnh, điều mà tôi đã làm trước đây, nhưng đây là lần đầu tiên tôi cố gắng tạo một loại nội dung với các trường. Tôi đã triển khai hook_node_info và Loại nội dung đang hiển thị trong danh sách các loại Nội dung trong danh sách thả xuống từ admin_menu, tuy nhiên, khi tôi duyệt đến admin/structure/typesnó không được liệt kê.

Tôi đã triển khai hook_install và lấy một số mã tôi tìm thấy trong một câu hỏi SO khác. Tôi có mã in ra một số thông tin gỡ lỗi vào nhật ký lỗi của mình và nó LOOKS giống như tất cả đều hoạt động, nhưng khi tôi duyệt đến Kiểu nội dung cấu trúc thì nó không hiển thị trường tôi đã thêm.

Đây là móc:

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

Tôi có thể thấy một bảng được gọi field_data_field_mymod_myfiletrong cơ sở dữ liệu, vì vậy tôi biết phần đầu tiên hoạt động. Tuy nhiên, cái bàn trống rỗng.

Nhật ký lỗi hiển thị field_create_instance()phương thức trả về điều này:

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

Tại sao trường của tôi không hiển thị trên loại nội dung này?


1
bạn không thích tính năng? Tôi thấy dễ dàng nhất để tạo Loại nội dung bằng FieldUI sau đó xuất Tính năng sang "Tính năng" (mô-đun) tùy chỉnh. ... nó chỉ tạo ra các mảng được sử dụng hook_info mà bạn có ở đây - và các mảng cho các định nghĩa trường. Bạn có thể kiểm tra chéo công việc của bạn theo cách đó.
tenken

Câu trả lời:


7

Đây không phải là quá nhiều câu trả lời vì nó là một bản mở rộng cho câu trả lời trước.

Tôi thấy hai liên kết này rất hữu ích trong việc tìm ra những gì hệ thống cần cho các trường tùy chỉnh được thêm vào loại nút mô-đun tùy chỉnh của bạn.

Tốt nhất: http://www.sitepoint.com/creating-a-new-drupal-node-type/

Thông tin bổ sung tốt: http://public-action.org/content/drupal-7-field-api-drupal-7-adding-custom-content-type-custom-fields-field-api

Vấn đề tôi gặp phải là những cái này (và mọi ví dụ khác tôi có thể tìm thấy trực tuyến) là những ví dụ rất cụ thể mà không có đủ tài liệu để giúp tôi tìm ra giải pháp cho trường hợp sử dụng của riêng tôi.

Điều đã giúp là nhận xét của tenken cho OP về việc sử dụng mô-đun Tính năng để nhận các mảng cho các trường tùy chỉnh.

Vì vậy, tôi đã tải xuống mô-đun Tính năng và kích hoạt nó: https://drupal.org/project/features

Sau đó, tôi đã tạo các trường trên loại nội dung của mình, sử dụng giao diện quản trị viên trong Drupal như bạn thường làm, mà tôi muốn mô-đun tạo. Sau đó, tôi duyệt đến Cấu trúc> Tính năng> Tạo tính năng và đặt tên giả (tôi đã sử dụng "kiểm tra") cho tính năng và sau đó trong khu vực thành phần, nhấp vào "Trường hợp thực địa" và kiểm tra các hộp cho các trường tùy chỉnh. Các trường đều được đặt tên giống như nút- [tên máy kiểu nút của bạn] - [tên trường], vì vậy trong trường hợp của tôi vì tôi muốn một trường hình ảnh, đó là nút-novel_section-field_image.

Sau khi chọn các trường tùy chỉnh cho loại nút của tôi, tôi chỉ cần nhấp vào "Tải xuống tính năng" và lưu tệp .tar vào máy tính để bàn của tôi, mở nó, mở thư mục "test" rồi xem test.features.field_base.inc và kiểm tra. features.field_instance.inc để lấy các mảng tôi cần cho các trường của tôi.

Sau đó, tôi chỉ sử dụng cấu trúc được phác thảo bởi liên kết đầu tiên mà tôi đã đăng và sau đó nó hoạt động hoàn hảo. Cho tôi.

Tôi không thể tìm thấy bất kỳ tài liệu nào về các cấu trúc mảng cần thiết cho những thứ như trường hình ảnh và trường tham chiếu phân loại và dường như tất cả các hướng dẫn và yêu cầu trợ giúp trực tuyến khác đều tập trung vào những thứ cụ thể như trường văn bản.

Hy vọng rằng bất cứ ai gặp rắc rối tương tự tôi gặp phải sẽ thấy điều này và có thể làm cho thiết lập của họ hoạt động bằng cách sử dụng các ví dụ này và mô-đun Tính năng như tôi đã làm.

Cảm ơn tenken đã chỉ ra chức năng này của mô-đun Tính năng, tôi chưa bao giờ sử dụng nó và không biết nó sẽ làm điều đó.


4

Mã này sẽ được tạo loại nội dung mới sẽ thêm vào tệp .install.

Thêm 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);
}
?>

Bạn nên tạo thông điệp drupal và viết sự kiện này vào nhật ký:

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

Cung cấp hook_uninstall () để xóa loại nội dung của bạn :

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

Cảm ơn bạn đã phản hồi rất chi tiết, nhưng làm cách nào để thêm trường Tệp vào loại nội dung sau khi được tạo?
Kenny Wyland

Tôi đã sử dụng mã của bạn ở trên và nó nói loại nội dung đã được thêm, nhưng nó không hiển thịadmin/structure/types
Kenny Wyland

1
Để làm việc này, bạn cần triển khai hook_form () trong mô-đun của mình nếu không, nếu bạn nhìn vào bảng node_type trong cơ sở dữ liệu, bạn sẽ thấy rằng kiểu vừa tạo của bạn bị vô hiệu hóa. Việc triển khai hook_form () dường như kích hoạt nó (tại sao lại như vậy, tôi không biết và nó không có ý nghĩa gì nhiều). Điều này giải quyết bình luận thứ hai của bạn bằng cách này.
dùng5013

1

Bài đăng này hơi lỗi thời, nhưng nếu có ích, tôi đã thấy bài viết này rất rõ ràng. Nó chỉ cho bạn cách tạo một loại nội dung mới từng bước.

Liên kết đến hướng dẫn

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

    }

}

Vui lòng bao gồm một trích dẫn có liên quan trong câu trả lời của bạn
Pierre.Vriens
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.