Al implementar hook_field_extra_fields () , ¿puedo ocultar el campo adicional de forma predeterminada?
A veces es más amigable ofrecer los campos adicionales como una opción, en lugar de mostrarlos inmediatamente después de habilitar un módulo.
Al implementar hook_field_extra_fields () , ¿puedo ocultar el campo adicional de forma predeterminada?
A veces es más amigable ofrecer los campos adicionales como una opción, en lugar de mostrarlos inmediatamente después de habilitar un módulo.
Respuestas:
En _field_info_prepare_extra_fields()
los campos adicionales se configuran como visibles de forma predeterminada, pero la configuración del campo adicional se almacena en la variable field_bundle_settings que puede cambiar en el módulo hook_install()
como:
$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 () , la devolución de llamada previa al procesamiento utilizada por field_attach_form () y field_attach_view () , contiene el siguiente código:
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'];
}
}
}
Implementando hook_field_extra_fields_display_alter () , puede alterar la configuración de visibilidad, pero eso haría que el campo no sea visible todo el tiempo que se muestre el formulario. Si no desea mostrar el campo cuando se carga el formulario por primera vez, y mostrarlo cuando, por ejemplo, se selecciona otro campo de formulario o se cambia su valor, debe usar algún código 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>
al principio.
hook_field_extra_fields()
. Sin embargo, puede modificar el campo de formulario o el formateador utilizado por el campo.
Hay un parche para agregar esta capacidad al núcleo de drupal.
Si desea ver esto, por favor revíselo y envíe sus comentarios.
En el enlace de instalación de su módulo, puede hacer una llamada a una función similar a esta y ocultará de forma predeterminada sus campos adicionales.
/**
* 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);
}
}
Un ejemplo mucho más simple. Para Drupal 7 Cree example_module.install en el directorio 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);
}
}
Documentación para hook_install https://api.drupal.org/api/drupal/modules%21system%21system.api.php/function/hook_install/7
En su archivo example_module.module agregue
/**
* 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;
}
Documentación para hook_field_extra_fields https://api.drupal.org/api/drupal/modules%21field%21field.api.php/function/hook_field_extra_fields/7