hook_field_extra_fields: oculto por defecto

8

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.

marcvangend
fuente

Respuestas:

5

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);
Pasqualle
fuente
Esto no funcionó para mí, no estoy seguro de por qué tan claramente funcionó para las personas que lo votaron. La respuesta de aklump fue la única solución que funcionó para mí ...
Felix Eve
3

_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;
  }
}
kiamlaluno
fuente
Tal vez mi pregunta no fue lo suficientemente clara. Me lo quiero mostrar el campo adicional en la forma (como admin / estructura / tipos / gestionar / artículo / pantalla / lleno) pero quiero que el cuadro de selección formateador que se establece en <hidden>al principio.
marcvangend
2
@marcvangend Entonces no es posible con hook_field_extra_fields(). Sin embargo, puede modificar el campo de formulario o el formateador utilizado por el campo.
kiamlaluno
OK gracias. No estoy seguro de si alterar el formulario será fácil, porque, por supuesto, solo quiero establecer el formateador en oculto cuando la configuración no se ha establecido explícitamente ... Voy a tocar un poco más cuando tenga más tiempo.
marcvangend
2

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);
  }
}
aklump
fuente
1
Este código funciona Puede ejecutarlo de la siguiente manera: my_module_hide_extra_fields (array ('facebook_like_button', 'contact_link'), 'node', node_type_get_types ());
batigolix
-1

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

Trevor McKeown
fuente
No logré que este código funcionara. $ view_modes no se declararon correctamente (lo arreglé en el fragmento anterior), y la variable $ bundle no se estableció
batigolix