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.
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:
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);
_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;
}
}
<hidden>
pada awalnya.
hook_field_extra_fields()
. Anda bisa mengubah bidang formulir, atau mengubah formatter yang digunakan oleh bidang tersebut.
Ada tambalan untuk menambahkan kemampuan ini ke drupal core.
Jika Anda ingin melihat ini masuk silakan tinjau dan berikan umpan balik.
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);
}
}
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