hook_field_extra_fields: standardmäßig ausgeblendet

8

Kann ich bei der Implementierung von hook_field_extra_fields () das zusätzliche Feld standardmäßig ausblenden ?

Manchmal ist es freundlicher, die zusätzlichen Felder als Option anzubieten, anstatt sie unmittelbar nach der Aktivierung eines Moduls anzuzeigen.

Marcvangend
quelle

Antworten:

5

In _field_info_prepare_extra_fields()den zusätzlichen Feldern sind diese standardmäßig auf sichtbar gesetzt, aber die zusätzlichen Feldeinstellungen werden in der Variablen field_bundle_settings gespeichert, die Sie hook_install()wie folgt ändern können :

$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
quelle
Das hat bei mir nicht funktioniert - ich bin mir nicht sicher, warum das bei den Leuten, die es befürwortet haben, genauso gut funktioniert hat. Aklumps Antwort war die einzige Lösung, die für mich funktioniert hat.
Felix Eve
3

_field_extra_fields_pre_render () , der von field_attach_form () und field_attach_view () verwendete Pre-Render-Rückruf , enthält den folgenden Code:

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

Die Umsetzung hook_field_extra_fields_display_alter () , können Sie die Sichtbarkeit Einstellung ändern, aber das würde das Feld nicht sichtbar die ganze Zeit das Formular angezeigt wird machen. Wenn Sie das Feld beim ersten Laden des Formulars nicht anzeigen möchten und es beispielsweise anzeigen möchten, wenn ein anderes Formularfeld ausgewählt oder sein Wert geändert wird, müssen Sie JavaScript-Code verwenden.

function mymodule_field_extra_fields_display_alter(&$displays, $context) {
  if ($context['entity_type'] == 'taxonomy_term' && $context['view_mode'] == 'full') {
    $displays['description']['visible'] = FALSE;
  }
}
kiamlaluno
quelle
Vielleicht war meine Frage nicht klar genug. Ich tun möchte auf dem Formular das zusätzliche Feld zeigen (wie admin / Struktur / types / Verwaltung / Artikel / Anzeige / voll) , aber ich mag das Formatierungsauswahlfeld eingestellt wird <hidden>zuerst.
Marcvangend
2
@marcvangend Dann ist es nicht möglich mit hook_field_extra_fields(). Sie können jedoch das Formularfeld oder den vom Feld verwendeten Formatierer ändern.
Kiamlaluno
OK danke. Ich bin mir nicht sicher, ob das Ändern des Formulars einfach sein wird, da ich den Formatierer natürlich nur dann auf "Ausgeblendet" setzen möchte, wenn die Einstellung nicht explizit festgelegt wurde ... Ich werde noch mehr damit herumspielen, wenn ich mehr Zeit habe.
Marcvangend
2

Im Installations-Hook Ihres Moduls können Sie eine ähnliche Funktion aufrufen, die Ihre zusätzlichen Felder standardmäßig in großen Mengen ausblendet.

/**
 * 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
quelle
1
Dieser Code funktioniert. Sie können es wie folgt ausführen: my_module_hide_extra_fields (Array ('facebook_like_button', 'contact_link'), 'node', node_type_get_types ());
Batigolix
-1

So viel einfacheres Beispiel. Für Drupal 7 Erstellen Sie example_module.install im Verzeichnis 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);
  }
}

Dokumentation für hook_install https://api.drupal.org/api/drupal/modules%21system%21system.api.php/function/hook_install/7

Fügen Sie in Ihrer Datei example_module.module hinzu

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

Dokumentation für hook_field_extra_fields https://api.drupal.org/api/drupal/modules%21field%21field.api.php/function/hook_field_extra_fields/7

Trevor McKeown
quelle
Ich habe es nicht geschafft, diesen Code zum Laufen zu bringen. $ view_modes wurden nicht korrekt deklariert (das habe ich im obigen Snippet behoben), und die Variable $ bundle ist nicht gesetzt
batigolix