hook_field_extra_fields: скрыто по умолчанию

8

При реализации hook_field_extra_fields () я могу сделать дополнительное поле скрытым по умолчанию?

Иногда удобнее предлагать дополнительные поля в качестве опции, а не отображать их сразу после включения модуля.

marcvangend
источник

Ответы:

5

В _field_info_prepare_extra_fields()дополнительных полях по умолчанию установлено видимое, но настройки дополнительных полей хранятся в переменной field_bundle_settings, которую вы можете изменить в вашем модуле hook_install()следующим образом:

$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
источник
Это не сработало для меня - не уверен, почему так же ясно работает для людей, которые проголосовали за это. Ответ Аклумпа был единственным решением, которое сработало для меня ..
Феликс Ева
3

_field_extra_fields_pre_render () , обратный вызов перед рендерингом, используемый field_attach_form () и field_attach_view () , содержит следующий код:

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

Реализуя hook_field_extra_fields_display_alter () , вы можете изменить настройку видимости, но это сделает поле невидимым все время, пока отображается форма. Если вы не хотите показывать поле при первой загрузке формы и показывать его, когда, например, выбрано другое поле формы или изменено его значение, вам необходимо использовать некоторый код JavaScript.

function mymodule_field_extra_fields_display_alter(&$displays, $context) {
  if ($context['entity_type'] == 'taxonomy_term' && $context['view_mode'] == 'full') {
    $displays['description']['visible'] = FALSE;
  }
}
киамлалуно
источник
Может быть, мой вопрос не был достаточно ясен. Я сделать хочу , чтобы показать дополнительное поле в форме (как администратор / структура / типы / управление / статьи / дисплей / полный) , но я хочу форматировщик выберите поле , чтобы быть установлено <hidden>на первом.
marcvangend
2
@marcvangend Тогда это невозможно с hook_field_extra_fields(). Вы можете изменить поле формы или форматер, используемый этим полем.
kiamlaluno
Хорошо, спасибо. Я не уверен, что будет легко изменить форму, потому что, конечно, я хочу установить форматер скрытым, только если этот параметр не был задан явно ... Я возьму с собой еще немного, когда у меня будет больше времени.
marcvangend
2

Существует патч, чтобы добавить эту способность в ядро ​​друпала.

Если вы хотите увидеть это, пожалуйста, просмотрите его и оставьте отзыв.

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

rooby
источник
2

В хуке установки вашего модуля вы можете вызвать функцию, подобную этой, и она по умолчанию скроет ваши дополнительные поля.

/**
 * 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
источник
1
Этот код работает. Вы можете запустить его следующим образом: my_module_hide_extra_fields (array ('facebook_like_button', 'contact_link'), 'node', node_type_get_types ());
Batigolix
-1

Намного проще. Для Drupal 7 Создайте example_module.install в каталоге 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);
  }
}

Документация для hook_install https://api.drupal.org/api/drupal/modules%21system%21system.api.php/function/hook_install/7

В вашем файле example_module.module добавьте

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

Документация для hook_field_extra_fields https://api.drupal.org/api/drupal/modules%21field%21field.api.php/function/hook_field_extra_fields/7

Тревор МакКаун
источник
Мне не удалось заставить этот код работать. $ view_modes werent объявлен правильно (я исправил это во фрагменте выше), и переменная $ bundle не установлена
batigolix