hook_field_extra_fields: bị ẩn theo mặc định


8

Khi triển khai hook_field_extra_fields () , tôi có thể làm cho trường bổ sung bị ẩn theo mặc định không?

Đôi khi, cung cấp các trường bổ sung dưới dạng tùy chọn, thay vì hiển thị ngay lập tức sau khi mô-đun được bật.

Câu trả lời:


5

Trong _field_info_prepare_extra_fields()các trường bổ sung được đặt thành hiển thị theo mặc định, nhưng các cài đặt trường bổ sung được lưu trữ trong biến field_bundle_sinstall mà bạn có thể thay đổi trong mô-đun của mình hook_install()như sau:

$entity_type = 'node';
$bundle = 'article';
$field_name = 'my_extra_field';
$view_mode = 'teaser';

$field_bundle_setting = variable_get('field_bundle_settings', array());
$field_bundle_setting[$entity_type][$bundle]['extra_fields']['display'][$field_name][$view_mode]['visible'] = FALSE;
variable_set('field_bundle_settings', $field_bundle_setting);

Điều này không làm việc cho tôi - không chắc tại sao lại làm việc rõ ràng cho những người ủng hộ nó. Câu trả lời của aklump là giải pháp duy nhất hiệu quả với tôi ..
Felix Eve

3

_field_extra_fields_pre numnder () , cuộc gọi lại kết xuất trước được sử dụng bởi field_attach_form ()field_attach_view () , chứa mã sau:

  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'];
      }
    }
  }

Việc triển khai hook_field_extra_fields_display_alter () , bạn có thể thay đổi cài đặt hiển thị, nhưng điều đó sẽ khiến trường không hiển thị trong suốt thời gian biểu mẫu được hiển thị. Nếu bạn muốn không hiển thị trường khi biểu mẫu được tải lần đầu tiên và hiển thị nó khi, ví dụ, trường biểu mẫu khác được chọn hoặc giá trị của nó bị thay đổi, thì bạn cần sử dụng một số mã JavaScript.

function mymodule_field_extra_fields_display_alter(&$displays, $context) {
  if ($context['entity_type'] == 'taxonomy_term' && $context['view_mode'] == 'full') {
    $displays['description']['visible'] = FALSE;
  }
}

Có lẽ câu hỏi của tôi không đủ rõ ràng. Tôi làm muốn hiển thị các trường bổ sung về hình thức (như admin / cấu trúc / loại / quản lý / bài viết / màn hình / full) nhưng tôi muốn formatter chọn hộp được thiết lập để <hidden>lần đầu tiên.
marcvangend

2
@marcvangend Vậy thì không thể hook_field_extra_fields(). Tuy nhiên, bạn có thể thay đổi trường biểu mẫu hoặc thay đổi trình định dạng được sử dụng bởi trường.
kiamlaluno

Được rồi cảm ơn. Tôi không chắc việc thay đổi biểu mẫu sẽ dễ dàng, vì tất nhiên tôi chỉ muốn đặt bộ định dạng thành ẩn khi cài đặt chưa được đặt rõ ràng ... Tôi sẽ tìm hiểu thêm khi tôi có nhiều thời gian hơn.
marcvangend


2

Trong hook cài đặt của mô-đun của bạn, bạn có thể thực hiện cuộc gọi đến một chức năng tương tự như chức năng này và nó sẽ ẩn hàng loạt các trường thừa của bạn theo mặc định.

/**
 * Sets default visibility of extra fields in all active view modes on entity bundles.
 *
 * This will not overwrite visibility that already exists in the variable.
 *
 * @param  array $extra_field_names An array of extra fields
 * @param  string $entity_type       The name of the entity type. Defaults to 'node'.
 * @param  array $bundles           An array of bundle objects or names.
 */
function my_module_hide_extra_fields($extra_field_names, $entity_type = 'node', $bundles = NULL) {
  $entity_info = entity_get_info($entity_type);
  if ($bundles === NULL) {
    $bundles = array_keys($entity_info['bundles']);
  }

  foreach ($bundles as $bundle) {
    if (!is_string($bundle)) {
      $bundle = $bundle->type;
    }
    $settings = field_bundle_settings($entity_type, $bundle);

    $active_modes = array('default');
    foreach ($settings['view_modes'] as $mode => $mode_settings) {
      if ($mode_settings['custom_settings']) {
        $active_modes[] = $mode;
      }
    }
    foreach ($extra_field_names as $field_name) {
      foreach ($active_modes as $mode) {
        if (empty($settings['extra_fields']['display'][$field_name][$mode])
          || !array_key_exists('visible', $settings['extra_fields']['display'][$field_name][$mode])) {
          $settings['extra_fields']['display'][$field_name][$mode]['visible'] = FALSE;
          $settings['extra_fields']['display'][$field_name][$mode] += array(
            'weight' => 0, 
          );
        }
      }
    }
    field_bundle_settings($entity_type, $bundle, $settings);
  }
}

1
Mã này hoạt động. Bạn có thể chạy nó như sau: my_module_ leather_extra_fields (mảng ('facebook_like_button', 'contact_link'), 'node', node_type_get_types ());
batigolix

-1

Vì vậy, ví dụ đơn giản hơn nhiều. Đối với Drupal 7 Tạo example_module.install trong thư mục example_module

/**
 * hook_install
 */

function example_module_install() {
  $field_machine_name = 'new_extra_field';
  $entity_types = array('node', 'taxonomy_term', 'user'); 
  foreach ($entity_types as $type) {
    $info = entity_get_info($type);
    $settings = field_bundle_settings($type, $bundle);
    $view_modes = array_merge(array('default'), array_keys($info['view modes']));
    foreach($view_modes as $view_mode) {
      $settings['extra_fields']['display'][$field_machine_name][$view_mode] = array(
        'visible' => FALSE,
        'weight'  => 0,
      );
    }
    field_bundle_settings($type, $bundle, $settings);
  }
}

Tài liệu cho hook_install https://api.drupal.org/api/drupal/modules%21system%21system.api.php/feft/hook_install/7

Trong tệp example_module.module của bạn thêm

 /**
  * Implementation of hook_field_extra_fields
  *
  */
 function example_module_field_extra_fields() {
   $extra = array();
   $field_machine_name = 'new_extra_field';
   $entity_types = array('node', 'taxonomy_term', 'user'); 
   foreach ($entity_types as $type) {
     $info = entity_get_info($type);
     foreach(array_keys($info["bundles"]) as $bundle) {
       $extra[$type][$bundle]['display'][$field_machine_name] = array(
         'label' => t('New extra field that will show up in manage display'),
         'description' => 'A description for the extra field',
         'weight' => 5,
        );
     }
   }
   return $extra; 
 }

Tài liệu cho hook_field_extra_fields https://api.drupal.org/api/drupal/modules%21field%21field.api.php/feft/hook_field_extra_fields/7


Tôi đã không quản lý để làm cho mã này làm việc. $ view_modes werent đã khai báo chính xác (tôi đã sửa trong đoạn trích ở trên) và biến $ bundle không được đặt
batigolix
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.