Tôi nên sử dụng hook_field_extra_fields () như thế nào?


6

Tôi mới phát hiện ra hook_field_extra_fields(), nhưng tài liệu không thực sự cho tôi biết cách sử dụng nó.

Trường hợp đầu ra ngoài trường được tạo ra?

Tôi đã cố gắng hết sức để hiểu các mô-đun Node và Poll, nhưng tôi không thể tìm ra nó. Tôi cũng đã cố gắng để thêm một định dạng trường tùy chỉnh.

Câu trả lời:


6

hook_field_extra_fields()được gọi bởi _field_extra_fields_pre numnder () , đây là một hàm kết xuất trước được sử dụng bởi field_attach_form ()field_attach_view () .

/**
 * Pre-render callback to adjust weights and visibility of non-field elements.
 */
function _field_extra_fields_pre_render($elements) {
  $entity_type = $elements['#entity_type'];
  $bundle = $elements['#bundle'];

  if (isset($elements['#type']) && $elements['#type'] == 'form') {
    $extra_fields = field_info_extra_fields($entity_type, $bundle, 'form');
    foreach ($extra_fields as $name => $settings) {
      if (isset($elements[$name])) {
        $elements[$name]['#weight'] = $settings['weight'];
      }
    }
  }
  elseif (isset($elements['#view_mode'])) {
    $view_mode = $elements['#view_mode'];
    $extra_fields = field_extra_fields_get_display($entity_type, $bundle, $view_mode);
    foreach ($extra_fields as $name => $settings) {
      if (isset($elements[$name])) {
        $elements[$name]['#weight'] = $settings['weight'];
        // Visibility: make sure we do not accidentally show a hidden element.
        $elements[$name]['#access'] = isset($elements[$name]['#access']) ? ($elements[$name]['#access'] && $settings['visible']) : $settings['visible'];
      }
    }
  }

  return $elements;
}

Sử dụng các chức năng đó, bạn không nên gọi hook trực tiếp. Những chức năng này đã được sử dụng cho các thực thể mà Drupal biết; nếu bạn đang triển khai một trường cho các nút, tất cả những gì bạn cần làm là thực hiện hook.

Một ví dụ về hook_field_extra_fields()việc thực hiện là mollom_field_extra_fields () .

function mollom_field_extra_fields() {
  $extras = array();
  $forms = array_flip(db_query('SELECT form_id FROM {mollom_form}')->fetchCol());
  foreach (mollom_form_list() as $form_id => $info) {
    // @todo Technically, an 'entity' does not need to be a Entity/Field API
//   kind of entity. Ideally of course, developers should use fieldable
//   entities, but contributed/custom code may not. It is not clear whether
//   registering extra fields for non-existing entities/bundles can break
//   anything, so leaving it this way for now.
    if (isset($info['entity']) && isset($forms[$form_id])) {
      // If the entity type does not implement bundles, then entity_get_info()
      // assumes a single bundle named after the entity.
      $entity_type = $info['entity'];
      $bundle = (isset($info['bundle']) ? $info['bundle'] : $entity_type);

      $extras[$entity_type][$bundle]['form']['mollom'] = array(
        'label' => t('Mollom'), 
        'description' => t('Mollom CAPTCHA or privacy policy link'), 
        'weight' => 99,
      );
    }
  }
  return $extras;
}

Tác dụng của mã đó là cho phép người dùng quản trị viên thay đổi thứ tự các trường được hiển thị khi thực thể được hiển thị hoặc hiển thị trong biểu mẫu chỉnh sửa, khi thực thể được chỉnh sửa. Các UI Dòng mô-đun tiếp xúc với một giao diện người dùng cho phép người sử dụng với sự cho phép đúng (thường là người quản trị) để sắp xếp những sai lĩnh vực.


Cảm ơn bạn rất nhiều vì lời giải thích, nhưng tôi chưa hiểu nơi đầu ra của trường thêm (hoặc phần tử biểu mẫu) được xây dựng. (Bằng cách nơi , tôi có nghĩa là móc / chức năng / bất cứ điều gì trong mã nguồn). Trong trường hợp của tôi, tôi đã có một số dữ liệu tùy ý, lỏng lẻo tương quan với các nút, tăng vọt trong hệ thống phụ khác, mà tôi muốn để lộ như trường để chế độ hiển thị . Tôi nghĩ những lĩnh vực phụ là con đường để đi? Hoặc là tôi sai?
Philipp Melab

hook_field_extra_fields()được sử dụng để cho phép người dùng quản trị viên thay đổi thứ tự các trường được hiển thị hoặc hiển thị trong biểu mẫu chỉnh sửa. Thông thường, bất kỳ trường thực hiện mô-đun nào cũng thực hiện hook đó.
kiamlaluno

Bây giờ tôi đã nhận nó! Tôi đã tìm kiếm một số móc hiển thị cho trường thêm của tôi. Nhưng tôi chỉ đơn giản là phải thêm nó trong hook_entity_view_alter hoặc tương tự, phải không? Cảm ơn bạn đã đưa tôi đi đúng hướng!
Philipp Melab

_field_extra_fields_pre_render()là một chức năng kết xuất trước, có nghĩa là nó thay đổi mảng biểu mẫu ngay trước khi nó được kết xuất; nếu trường của bạn không được triển khai bằng API trường, bạn chỉ cần thêm nó vào biểu mẫu chỉnh sửa nút, như bạn thường làm. Nếu đó là một trường được triển khai bằng API trường, thì bạn không cần phải làm gì thêm; trường sẽ được thêm vào nút nếu bạn triển khai tất cả các chức năng được yêu cầu từ API trường.
kiamlaluno

17

Đây là một ví dụ đơn giản chỉ ra cách thêm một trường bổ sung vào UI UI và cung cấp một ví dụ về một cách chèn trường vào một nút.

/**
 * Implements hook_field_extra_fields().
 */
function MODULE_field_extra_fields() {
  $extra['node']['article']['display']['extended_submitted_by'] = array(
    'label' => t('Extended Submitted By'),
    'description' => t('Provides Jumper Menu for Version Selection'),
    'weight' => 0,
  );
  return $extra;
}

/**
 * Implements hook_node_view().
 */
function MODULE_node_view($node, $view_mode, $langcode) {
  // Only add if the view mode is for a full view, although we 
  // could control this via the Field UI too using 'hidden'.
  if ($view_mode == 'full' && $node->type == 'article') {
    $node->content['extended_submitted_by'] = array(
      '#markup' => '<p>This is inserted unless hidden in the field ui.</p>',
    );
  }
}

Đây là câu trả lời đúng.
ЕЕннн
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.