function field_ui_display_overview_form

Form constructor for the field display settings for a given view mode.

See also

field_ui_display_overview_multistep_submit()

field_ui_display_overview_form_submit()

Related topics

1 string reference to 'field_ui_display_overview_form'
field_ui_menu in modules/field_ui/field_ui.module
Implements hook_menu().

File

modules/field_ui/field_ui.admin.inc, line 893

Code

function field_ui_display_overview_form($form, &$form_state, $entity_type, $bundle, $view_mode) {
    $bundle = field_extract_bundle($entity_type, $bundle);
    field_ui_inactive_message($entity_type, $bundle);
    $admin_path = _field_ui_bundle_admin_path($entity_type, $bundle);
    // Gather type information.
    $instances = field_info_instances($entity_type, $bundle);
    $field_types = field_info_field_types();
    $extra_fields = field_info_extra_fields($entity_type, $bundle, 'display');
    $form_state += array(
        'formatter_settings_edit' => NULL,
    );
    $form += array(
        '#entity_type' => $entity_type,
        '#bundle' => $bundle,
        '#view_mode' => $view_mode,
        '#fields' => array_keys($instances),
        '#extra' => array_keys($extra_fields),
    );
    if (empty($instances) && empty($extra_fields)) {
        drupal_set_message(t('There are no fields yet added. You can add new fields on the <a href="@link">Manage fields</a> page.', array(
            '@link' => url($admin_path . '/fields'),
        )), 'warning');
        return $form;
    }
    $table = array(
        '#type' => 'field_ui_table',
        '#tree' => TRUE,
        '#header' => array(
            t('Field'),
            t('Weight'),
            t('Parent'),
            t('Label'),
            array(
                'data' => t('Format'),
                'colspan' => 3,
            ),
        ),
        '#regions' => array(
            'visible' => array(
                'message' => t('No field is displayed.'),
            ),
            'hidden' => array(
                'title' => t('Hidden'),
                'message' => t('No field is hidden.'),
            ),
        ),
        '#parent_options' => array(),
        '#attributes' => array(
            'class' => array(
                'field-ui-overview',
            ),
            'id' => 'field-display-overview',
        ),
        // Add Ajax wrapper.
'#prefix' => '<div id="field-display-overview-wrapper">',
        '#suffix' => '</div>',
    );
    $field_label_options = array(
        'above' => t('Above'),
        'inline' => t('Inline'),
        'hidden' => '<' . t('Hidden') . '>',
    );
    $extra_visibility_options = array(
        'visible' => t('Visible'),
        'hidden' => t('Hidden'),
    );
    // Field rows.
    foreach ($instances as $name => $instance) {
        $field = field_info_field($instance['field_name']);
        $display = $instance['display'][$view_mode];
        $table[$name] = array(
            '#attributes' => array(
                'class' => array(
                    'draggable',
                    'tabledrag-leaf',
                ),
            ),
            '#row_type' => 'field',
            '#region_callback' => 'field_ui_display_overview_row_region',
            '#js_settings' => array(
                'rowHandler' => 'field',
                'defaultFormatter' => $field_types[$field['type']]['default_formatter'],
            ),
            'human_name' => array(
                '#markup' => check_plain($instance['label']),
            ),
            'weight' => array(
                '#type' => 'textfield',
                '#title' => t('Weight for @title', array(
                    '@title' => $instance['label'],
                )),
                '#title_display' => 'invisible',
                '#default_value' => $display['weight'],
                '#size' => 3,
                '#attributes' => array(
                    'class' => array(
                        'field-weight',
                    ),
                ),
            ),
            'parent_wrapper' => array(
                'parent' => array(
                    '#type' => 'select',
                    '#title' => t('Label display for @title', array(
                        '@title' => $instance['label'],
                    )),
                    '#title_display' => 'invisible',
                    '#options' => $table['#parent_options'],
                    '#empty_value' => '',
                    '#attributes' => array(
                        'class' => array(
                            'field-parent',
                        ),
                    ),
                    '#parents' => array(
                        'fields',
                        $name,
                        'parent',
                    ),
                ),
                'hidden_name' => array(
                    '#type' => 'hidden',
                    '#default_value' => $name,
                    '#attributes' => array(
                        'class' => array(
                            'field-name',
                        ),
                    ),
                ),
            ),
            'label' => array(
                '#type' => 'select',
                '#title' => t('Label display for @title', array(
                    '@title' => $instance['label'],
                )),
                '#title_display' => 'invisible',
                '#options' => $field_label_options,
                '#default_value' => $display['label'],
            ),
        );
        $formatter_options = field_ui_formatter_options($field['type']);
        $formatter_options['hidden'] = '<' . t('Hidden') . '>';
        $table[$name]['format'] = array(
            'type' => array(
                '#type' => 'select',
                '#title' => t('Formatter for @title', array(
                    '@title' => $instance['label'],
                )),
                '#title_display' => 'invisible',
                '#options' => $formatter_options,
                '#default_value' => $display['type'],
                '#parents' => array(
                    'fields',
                    $name,
                    'type',
                ),
                '#attributes' => array(
                    'class' => array(
                        'field-formatter-type',
                    ),
                ),
            ),
            'settings_edit_form' => array(),
        );
        // Formatter settings.
        // Check the currently selected formatter, and merge persisted values for
        // formatter settings.
        if (isset($form_state['values']['fields'][$name]['type'])) {
            $formatter_type = $form_state['values']['fields'][$name]['type'];
        }
        else {
            $formatter_type = $display['type'];
        }
        if (isset($form_state['formatter_settings'][$name])) {
            $settings = $form_state['formatter_settings'][$name];
        }
        else {
            $settings = $display['settings'];
        }
        $settings += field_info_formatter_settings($formatter_type);
        $instance['display'][$view_mode]['type'] = $formatter_type;
        $formatter = field_info_formatter_types($formatter_type);
        // For hidden fields, $formatter will be NULL, but we expect an array later.
        // To maintain BC, but avoid PHP 7.4 Notices, ensure $formatter is an array
        // with a 'module' element.
        $formatter['module'] = isset($formatter['module']) ? $formatter['module'] : '';
        $instance['display'][$view_mode]['module'] = $formatter['module'];
        $instance['display'][$view_mode]['settings'] = $settings;
        // Base button element for the various formatter settings actions.
        $base_button = array(
            '#submit' => array(
                'field_ui_display_overview_multistep_submit',
            ),
            '#ajax' => array(
                'callback' => 'field_ui_display_overview_multistep_js',
                'wrapper' => 'field-display-overview-wrapper',
                'effect' => 'fade',
            ),
            '#field_name' => $name,
        );
        if ($form_state['formatter_settings_edit'] == $name) {
            // We are currently editing this field's formatter settings. Display the
            // settings form and submit buttons.
            $table[$name]['format']['settings_edit_form'] = array();
            $settings_form = array();
            $function = $formatter['module'] . '_field_formatter_settings_form';
            if (function_exists($function)) {
                $settings_form = $function($field, $instance, $view_mode, $form, $form_state);
            }
            if ($settings_form) {
                $table[$name]['format']['#cell_attributes'] = array(
                    'colspan' => 3,
                );
                $table[$name]['format']['settings_edit_form'] = array(
                    '#type' => 'container',
                    '#attributes' => array(
                        'class' => array(
                            'field-formatter-settings-edit-form',
                        ),
                    ),
                    '#parents' => array(
                        'fields',
                        $name,
                        'settings_edit_form',
                    ),
                    'label' => array(
                        '#markup' => t('Format settings:') . ' <span class="formatter-name">' . $formatter['label'] . '</span>',
                    ),
                    'settings' => $settings_form,
                    'actions' => array(
                        '#type' => 'actions',
                        'save_settings' => $base_button + array(
                            '#type' => 'submit',
                            '#name' => $name . '_formatter_settings_update',
                            '#value' => t('Update'),
                            '#op' => 'update',
                        ),
                        'cancel_settings' => $base_button + array(
                            '#type' => 'submit',
                            '#name' => $name . '_formatter_settings_cancel',
                            '#value' => t('Cancel'),
                            '#op' => 'cancel',
                            // Do not check errors for the 'Cancel' button, but make sure we
                            // get the value of the 'formatter type' select.
'#limit_validation_errors' => array(
                                array(
                                    'fields',
                                    $name,
                                    'type',
                                ),
                            ),
                        ),
                    ),
                );
                $table[$name]['#attributes']['class'][] = 'field-formatter-settings-editing';
            }
        }
        else {
            // Display a summary of the current formatter settings.
            $summary = module_invoke($formatter['module'], 'field_formatter_settings_summary', $field, $instance, $view_mode);
            $table[$name]['settings_summary'] = array();
            $table[$name]['settings_edit'] = array();
            if ($summary) {
                $table[$name]['settings_summary'] = array(
                    '#markup' => '<div class="field-formatter-summary">' . $summary . '</div>',
                    '#cell_attributes' => array(
                        'class' => array(
                            'field-formatter-summary-cell',
                        ),
                    ),
                );
                $table[$name]['settings_edit'] = $base_button + array(
                    '#type' => 'image_button',
                    '#name' => $name . '_formatter_settings_edit',
                    '#src' => 'misc/configure.png',
                    '#attributes' => array(
                        'class' => array(
                            'field-formatter-settings-edit',
                        ),
                        'alt' => t('Edit'),
                    ),
                    '#op' => 'edit',
                    // Do not check errors for the 'Edit' button, but make sure we get
                    // the value of the 'formatter type' select.
'#limit_validation_errors' => array(
                        array(
                            'fields',
                            $name,
                            'type',
                        ),
                    ),
                    '#prefix' => '<div class="field-formatter-settings-edit-wrapper">',
                    '#suffix' => '</div>',
                );
            }
        }
    }
    // Non-field elements.
    foreach ($extra_fields as $name => $extra_field) {
        $display = $extra_field['display'][$view_mode];
        $table[$name] = array(
            '#attributes' => array(
                'class' => array(
                    'draggable',
                    'tabledrag-leaf',
                ),
            ),
            '#row_type' => 'extra_field',
            '#region_callback' => 'field_ui_display_overview_row_region',
            '#js_settings' => array(
                'rowHandler' => 'field',
            ),
            'human_name' => array(
                '#markup' => check_plain($extra_field['label']),
            ),
            'weight' => array(
                '#type' => 'textfield',
                '#title' => t('Weight for @title', array(
                    '@title' => $extra_field['label'],
                )),
                '#title_display' => 'invisible',
                '#default_value' => $display['weight'],
                '#size' => 3,
                '#attributes' => array(
                    'class' => array(
                        'field-weight',
                    ),
                ),
            ),
            'parent_wrapper' => array(
                'parent' => array(
                    '#type' => 'select',
                    '#title' => t('Parents for @title', array(
                        '@title' => $extra_field['label'],
                    )),
                    '#title_display' => 'invisible',
                    '#options' => $table['#parent_options'],
                    '#empty_value' => '',
                    '#attributes' => array(
                        'class' => array(
                            'field-parent',
                        ),
                    ),
                    '#parents' => array(
                        'fields',
                        $name,
                        'parent',
                    ),
                ),
                'hidden_name' => array(
                    '#type' => 'hidden',
                    '#default_value' => $name,
                    '#attributes' => array(
                        'class' => array(
                            'field-name',
                        ),
                    ),
                ),
            ),
            'empty_cell' => array(
                '#markup' => '&nbsp;',
            ),
            'format' => array(
                'type' => array(
                    '#type' => 'select',
                    '#title' => t('Visibility for @title', array(
                        '@title' => $extra_field['label'],
                    )),
                    '#title_display' => 'invisible',
                    '#options' => $extra_visibility_options,
                    '#default_value' => $display['visible'] ? 'visible' : 'hidden',
                    '#parents' => array(
                        'fields',
                        $name,
                        'type',
                    ),
                    '#attributes' => array(
                        'class' => array(
                            'field-formatter-type',
                        ),
                    ),
                ),
            ),
            'settings_summary' => array(),
            'settings_edit' => array(),
        );
    }
    $form['fields'] = $table;
    // Custom display settings.
    if ($view_mode == 'default') {
        $form['modes'] = array(
            '#type' => 'fieldset',
            '#title' => t('Custom display settings'),
            '#collapsible' => TRUE,
            '#collapsed' => TRUE,
        );
        // Collect options and default values for the 'Custom display settings'
        // checkboxes.
        $options = array();
        $default = array();
        $entity_info = entity_get_info($entity_type);
        $view_modes = $entity_info['view modes'];
        $view_mode_settings = field_view_mode_settings($entity_type, $bundle);
        foreach ($view_modes as $view_mode_name => $view_mode_info) {
            $options[$view_mode_name] = $view_mode_info['label'];
            if (!empty($view_mode_settings[$view_mode_name]['custom_settings'])) {
                $default[] = $view_mode_name;
            }
        }
        $form['modes']['view_modes_custom'] = array(
            '#type' => 'checkboxes',
            '#title' => t('Use custom display settings for the following view modes'),
            '#options' => $options,
            '#default_value' => $default,
        );
    }
    // In overviews involving nested rows from contributed modules (i.e
    // field_group), the 'format type' selects can trigger a series of changes in
    // child rows. The #ajax behavior is therefore not attached directly to the
    // selects, but triggered by the client-side script through a hidden #ajax
    // 'Refresh' button. A hidden 'refresh_rows' input tracks the name of
    // affected rows.
    $form['refresh_rows'] = array(
        '#type' => 'hidden',
    );
    $form['refresh'] = array(
        '#type' => 'submit',
        '#value' => t('Refresh'),
        '#op' => 'refresh_table',
        '#submit' => array(
            'field_ui_display_overview_multistep_submit',
        ),
        '#ajax' => array(
            'callback' => 'field_ui_display_overview_multistep_js',
            'wrapper' => 'field-display-overview-wrapper',
            'effect' => 'fade',
            // The button stays hidden, so we hide the Ajax spinner too. Ad-hoc
            // spinners will be added manually by the client-side script.
'progress' => 'none',
        ),
    );
    $form['actions'] = array(
        '#type' => 'actions',
    );
    $form['actions']['submit'] = array(
        '#type' => 'submit',
        '#value' => t('Save'),
    );
    $form['#attached']['js'][] = drupal_get_path('module', 'field_ui') . '/field_ui.js';
    $form['#attached']['css'][] = drupal_get_path('module', 'field_ui') . '/field_ui.css';
    // Add tabledrag behavior.
    $form['#attached']['drupal_add_tabledrag'][] = array(
        'field-display-overview',
        'order',
        'sibling',
        'field-weight',
    );
    $form['#attached']['drupal_add_tabledrag'][] = array(
        'field-display-overview',
        'match',
        'parent',
        'field-parent',
        'field-parent',
        'field-name',
    );
    return $form;
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.