hook_field_extra_fields()を実装するときに、追加のフィールドをデフォルトで非表示にできますか?
モジュールが有効になった直後にフィールドを表示するのではなく、オプションとして追加フィールドを提供する方が便利な場合があります。
hook_field_extra_fields()を実装するときに、追加のフィールドをデフォルトで非表示にできますか?
モジュールが有効になった直後にフィールドを表示するのではなく、オプションとして追加フィールドを提供する方が便利な場合があります。
回答:
で_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);
_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>
最初に。
hook_field_extra_fields()
です。ただし、フォームフィールドを変更したり、フィールドで使用されるフォーマッターを変更したりできます。
drupalコアにこの機能を追加するパッチがあります。
これを見たい場合は、レビューしてフィードバックを送信してください。
モジュールのインストールフックで、これと同様の関数を呼び出すことができ、デフォルトで追加のフィールドを一括で非表示にします。
/**
* 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);
}
}
とても簡単な例です。Drupal 7の場合、example_moduleディレクトリにexample_module.installを作成します。
/**
* 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