Gán các trường theo chương trình cho nút tùy chỉnh được xác định bởi mô-đun tùy chỉnh


7

Cố gắng chuyển đổi một mô-đun từ Drupal 6 sang Drupal 7, định nghĩa loại nút riêng của nó trong hook_node_info.

Mặc dù hook_node_info định nghĩa has_title và has_body thành TRUE, làm thế nào tôi có thể khiến các trường này xuất hiện trên biểu mẫu nút? Trước đây, tôi đã sử dụng 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;
}

Trong D6, điều này làm việc tốt cho tôi. Trong Drupal 7, hook_form đã thay đổi và tôi không hoàn toàn làm theo tài liệu của nó.

Làm cách nào tôi có thể sử dụng Trường Thân và Tiêu đề trong lõi và gán chúng cho loại nút này khi mô-đun được kích hoạt?

Hơn nữa, làm cách nào tôi có thể xác định loại Trường mới để bắt chước Phần thân (Văn bản dài có tóm tắt) theo thứ tôi chọn?

Câu trả lời:


4

Để thêm trường cơ thể vào một loại nội dung, bạn sử dụng node_add_body_field () . Để thêm một trường không phải là trường cơ thể, bạn sử dụng trường_create_field () , nếu trường không tồn tại và field_create_instance () để gán một thể hiện của trường cho một thực thể (ví dụ: nút hoặc đối tượng người dùng).

Ví dụ về cách sử dụng các hàm đó, bạn có thể xem standard_install () , đây là móc cài đặt của cấu hình chuẩn, có chứa đoạn mã sau:

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

Mã này đang thêm trường thuật ngữ phân loại vào loại nội dung "Điều".


1

Đây là một tài liệu tuyệt vời về Chuyển đổi mô-đun của bạn từ Drupal 6.x sang 7.x

Trong đó có các tiểu bang

các trường hợp trường cơ thể nút hiện được xử lý độc quyền bởi API trường

Khi xác định loại nút hoặc tạo một nút bằng node_type_save (), các khóa 'has_body' và 'body_label' đã không được chấp nhận.

Để thêm một trường cơ thể, thay vào đó, bạn có thể gọi node_add_body_field ($ type); sẽ thêm trường hợp trường vào loại nút đó. Xem blog.install và forum.install để biết ví dụ.

Kiểm tra forum.install & blog.install

Vì vậy, nơi bạn muốn làm điều này là trong mymodule.install và bên trong mymodule_install () hoặc mymodule_enable ().



để bắt chước một trường như phần thân, lấy mã từ node_add_body_field và đặt vào đó một hàm riêng
iStryker

Không có API trường đơn giản để tạo và gán trường cho loại nút?
Kevin

Tôi không nghĩ có một cách đơn giản hơn, chẳng hạn như bên trong mymodule_form (). Drupal 7 sử dụng các trường hợp trường và theo hiểu biết của tôi, chúng phải được thêm vào cơ sở dữ liệu trước khi bạn có thể sử dụng chúng. Đó là lý do tại sao diễn đàn và mô-đun blog sử dụng hook_install () & hook_enable (). Lưu ý bên lề: Bạn có thể thêm chúng sau đó vào loại bằng cách sử dụng field_create_instance () & field_create_field () trong một chức năng riêng tư, nhưng tại sao bạn lại như vậy.
iStryker
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.