hook_field_extra_fields: caché par défaut

8

Lors de l'implémentation de hook_field_extra_fields () , puis-je masquer le champ supplémentaire par défaut?

Parfois, il est plus convivial de proposer les champs supplémentaires en option, au lieu de les afficher immédiatement après l'activation d'un module.

marcvangend
la source

Réponses:

5

Dans _field_info_prepare_extra_fields()les champs supplémentaires sont définis comme visibles par défaut, mais les paramètres de champ supplémentaires sont stockés dans la variable field_bundle_settings que vous pouvez modifier dans votre module hook_install()comme:

$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
la source
Cela n'a pas fonctionné pour moi - je ne sais pas pourquoi cela a clairement fonctionné pour les personnes qui l'ont voté. La réponse d'Aklump a été la seule solution qui a fonctionné pour moi ..
Felix Eve
3

_field_extra_fields_pre_render () , le rappel de pré-rendu utilisé par field_attach_form () et field_attach_view () , contient le code suivant:

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

En implémentant hook_field_extra_fields_display_alter () , vous pouvez modifier le paramètre de visibilité, mais cela rendrait le champ non visible tout le temps que le formulaire est affiché. Si vous ne souhaitez pas afficher le champ lors du premier chargement du formulaire et l'afficher lorsque, par exemple, un autre champ de formulaire est sélectionné ou sa valeur est modifiée, vous devez utiliser du code 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
la source
Peut-être que ma question n'était pas assez claire. Je ne veux montrer le champ supplémentaire sur la forme (comme admin / Structure / types / gérer / article / affichage / plein) , mais je veux la boîte de sélection formatter à régler à <hidden>d'abord.
marcvangend
2
@marcvangend Alors ce n'est pas possible avec hook_field_extra_fields(). Vous pouvez cependant modifier le champ de formulaire ou modifier le formateur utilisé par le champ.
kiamlaluno
OK merci. Je ne sais pas si la modification du formulaire sera facile, car bien sûr, je veux uniquement mettre le formateur sur caché lorsque le paramètre n'a pas été explicitement défini ... J'en jouerai plus quand j'aurai plus de temps.
marcvangend
2

Dans le crochet d'installation de votre module, vous pouvez appeler une fonction similaire à celle-ci et elle masquera vos champs supplémentaires par défaut.

/**
 * 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
la source
1
Ce code fonctionne. Vous pouvez l'exécuter comme suit: my_module_hide_extra_fields (array ('facebook_like_button', 'contact_link'), 'node', node_type_get_types ());
batigolix
-1

Exemple tellement plus simple. Pour Drupal 7 Créez example_module.install sous le répertoire 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);
  }
}

Documentation pour hook_install https://api.drupal.org/api/drupal/modules%21system%21system.api.php/function/hook_install/7

Dans votre fichier example_module.module, ajoutez

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

Documentation pour hook_field_extra_fields https://api.drupal.org/api/drupal/modules%21field%21field.api.php/function/hook_field_extra_fields/7

Trevor McKeown
la source
Je n'ai pas réussi à faire fonctionner ce code. $ view_modes n'a pas été déclaré correctement (j'ai corrigé cela dans l'extrait ci-dessus), et la variable $ bundle n'est pas définie
batigolix