it-swarm-eu.dev

hook_field_extra_fields: ve výchozím nastavení skryté

Při implementaci hook_field_extra_fields () , mohu ve výchozím nastavení skrýt doplňkové pole?

Někdy je přátelštější nabídnout další pole jako možnost, namísto zobrazení bezprostředně po aktivaci modulu.

8
marcvangend

Ve funkci _field_info_prepare_extra_fields() jsou výchozí pole nastavena na viditelnou, ale nastavení dalších polí jsou uložena v proměnné field_bundle_settings, kterou můžete změnit v hook_install() modulu:

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

_ field_extra_fields_pre_render () , zpětné volání před vykreslením používané field_attach_form () a field_attach_view () , obsahuje následující kód:

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

Implementace hook_field_extra_fields_display_alter () , můžete změnit nastavení viditelnosti, ale to by způsobilo, že pole nebude viditelné po celou dobu zobrazení formuláře. Pokud nechcete, aby se pole zobrazovalo při prvním načtení formuláře a ukázalo se, když je například vybráno jiné pole formuláře nebo je změněna jeho hodnota, musíte použít nějaký kód JavaScript.

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

V instalačním háku vašeho modulu můžete zavolat na funkci podobnou tomuto a ve výchozím nastavení bude hromadně skrývat vaše další pole.

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

K dispozici je oprava, kterou lze tuto schopnost přidat do jádra drupal).

Pokud to chcete vidět, přečtěte si jej a poskytněte zpětnou vazbu.

http://drupal.org/node/1256368#comment-7201552

2
rooby