hook_field_extra_fields: nascosto per impostazione predefinita


8

Quando si implementa hook_field_extra_fields () , posso rendere nascosto il campo extra per impostazione predefinita?

A volte è più semplice offrire i campi extra come opzione, invece di visualizzarli immediatamente dopo l'attivazione di un modulo.

Risposte:


5

Nei _field_info_prepare_extra_fields()campi extra sono impostati come visibili per impostazione predefinita, ma le impostazioni del campo extra sono memorizzate nella variabile field_bundle_settings che è possibile modificare hook_install()come:

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

Questo non ha funzionato per me - non so perché abbia funzionato chiaramente per le persone che lo hanno votato. La risposta di aklump è stata l'unica soluzione che ha funzionato per me ..
Felix Eve

3

_field_extra_fields_pre_render () , il callback pre-rendering utilizzato da field_attach_form () e field_attach_view () , contiene il seguente codice:

  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 () , è possibile modificare l'impostazione di visibilità, ma ciò renderebbe il campo non visibile ogni volta che viene visualizzato il modulo. Se non si desidera mostrare il campo al primo caricamento del modulo e mostrarlo quando, ad esempio, viene selezionato un altro campo del modulo o il suo valore viene modificato, è necessario utilizzare un codice JavaScript.

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

Forse la mia domanda non era abbastanza chiara. Ho fare voglio mostrare il campo in più sul modulo (come admin / struttura / tipo / gestire / article / display / completa), ma voglio il formattatore casella di selezione per essere impostato <hidden>in un primo momento.
marcvangend,

2
@marcvangend Quindi non è possibile con hook_field_extra_fields(). Tuttavia, è possibile modificare il campo modulo o il formatter utilizzato dal campo.
kiamlaluno

Ok grazie. Non sono sicuro che modificare il modulo sia facile, perché ovviamente voglio solo impostare il formatter su nascosto quando l'impostazione non è stata impostata in modo esplicito ... Ne giocherò un po 'di più quando avrò più tempo.
marcvangend,


2

Nel gancio di installazione del modulo è possibile effettuare una chiamata a una funzione simile a questa e per impostazione predefinita verranno nascosti in blocco i campi aggiuntivi.

/**
 * 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
Questo codice funziona. Puoi eseguirlo come segue: my_module_hide_extra_fields (array ('facebook_like_button', 'contact_link'), 'node', node_type_get_types ());
Batigolix,

-1

Esempio molto più semplice. Per Drupal 7 Creare esempio_modulo.install nella directory esempio_modulo

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

Documentazione per hook_install https://api.drupal.org/api/drupal/modules%21system%21system.api.php/function/hook_install/7

Nel file esempio_modulo.module aggiungi

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

Documentazione per hook_field_extra_fields https://api.drupal.org/api/drupal/modules%21field%21field.api.php/function/hook_field_extra_fields/7


Non sono riuscito a far funzionare questo codice. $ view_modes non è stato dichiarato correttamente (l'ho corretto nel frammento sopra) e la variabile $ bundle non è impostata
batigolix
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.