hook_field_extra_fields: disembunyikan secara default


8

Saat menerapkan hook_field_extra_fields () , dapatkah saya membuat bidang ekstra disembunyikan secara default?

Terkadang lebih ramah untuk menawarkan bidang tambahan sebagai opsi, alih-alih menampilkannya segera setelah modul diaktifkan.

Jawaban:


5

Di _field_info_prepare_extra_fields()bidang tambahan diatur ke terlihat secara default, tetapi pengaturan bidang tambahan disimpan dalam variabel field_bundle_settings yang dapat Anda ubah di modul Anda hook_install()seperti:

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

Ini tidak berhasil untuk saya - tidak yakin mengapa jelas bekerja untuk orang-orang yang mengangkatnya. jawaban aklump adalah satu-satunya solusi yang bekerja untuk saya ..
Felix Eve

3

_field_extra_fields_pre_render () , panggilan balik pra-render yang digunakan oleh field_attach_form () dan field_attach_view () , berisi kode berikut:

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

Menerapkan hook_field_extra_fields_display_alter () , Anda dapat mengubah pengaturan visibilitas, tetapi itu akan membuat bidang tidak terlihat sepanjang waktu formulir ditampilkan. Jika Anda ingin tidak menampilkan bidang saat formulir dimuat pertama kali, dan menunjukkannya ketika, misalnya, bidang formulir lain dipilih atau nilainya diubah, maka Anda perlu menggunakan beberapa kode JavaScript.

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

Mungkin pertanyaan saya tidak cukup jelas. Saya lakukan ingin menunjukkan bidang tambahan pada bentuk (seperti admin / struktur / jenis / mengelola / tulisan / display / penuh) tapi saya ingin formatter pilih kotak untuk diatur ke <hidden>pada awalnya.
marcvangend

2
@marcvangend Maka tidak mungkin dengan hook_field_extra_fields(). Anda bisa mengubah bidang formulir, atau mengubah formatter yang digunakan oleh bidang tersebut.
kiamlaluno

Ok terima kasih. Saya tidak yakin apakah mengubah formulir akan mudah, karena tentu saja saya hanya ingin mengatur formatter untuk disembunyikan ketika pengaturan belum diatur secara eksplisit ... Saya akan bermain-main lagi ketika saya memiliki lebih banyak waktu.
marcvangend


2

Di kait instal modul Anda, Anda dapat membuat panggilan ke fungsi yang sama dengan ini dan itu akan secara massal menyembunyikan bidang tambahan Anda secara default.

/**
 * 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
Kode ini berfungsi. Anda dapat menjalankannya sebagai berikut: my_module_hide_extra_fields (array ('facebook_like_button', 'contact_link'), 'node', node_type_get_types ());
batigolix

-1

Contoh yang jauh lebih sederhana. Untuk Drupal 7 Buat example_module.install di bawah direktori 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);
  }
}

Dokumentasi untuk hook_install https://api.drupal.org/api/drupal/modules%21system%21system.api.php/function/hook_install/7

Dalam file example_module.module Anda, tambahkan

 /**
  * 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; 
 }

Dokumentasi untuk hook_field_extra_fields https://api.drupal.org/api/drupal/modules%21field%21field.api.php/fungsi/hook_field_extra_fields/7


Saya tidak berhasil membuat kode ini berfungsi. $ view_modes tidak dinyatakan dengan benar (saya memperbaikinya dalam cuplikan di atas), dan variabel $ bundle tidak disetel
batigolix
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.