function views_ui_edit_form_get_bucket

Add information about a section to a display.

1 call to views_ui_edit_form_get_bucket()
views_ui_get_display_tab_details in includes/admin.inc
Helper function to get the display details section of the edit UI.

File

includes/admin.inc, line 2347

Code

function views_ui_edit_form_get_bucket($type, $view, $display) {
    $build = array(
        '#theme_wrappers' => array(
            'views_ui_display_tab_bucket',
        ),
    );
    $types = views_object_types();
    $build['#overridden'] = FALSE;
    $build['#defaulted'] = FALSE;
    if (module_exists('advanced_help')) {
        $build['#item_help_icon'] = array(
            '#theme' => 'advanced_help_topic',
            '#module' => 'views',
            '#topic' => $type,
        );
    }
    $build['#name'] = $build['#title'] = $types[$type]['title'];
    // Different types now have different rearrange forms, so we use this switch
    // to get the right one.
    switch ($type) {
        case 'filter':
            $rearrange_url = "admin/structure/views/nojs/rearrange-{$type}/{$view->name}/{$display->id}/{$type}";
            $rearrange_text = t('And/Or, Rearrange');
            // @todo Add another class to have another symbol for filter rearrange.
            $class = 'icon compact rearrange';
            break;
        case 'field':
            // Fetch the style plugin info so we know whether to list fields or not.
            $style_plugin = $display->handler
                ->get_plugin();
            $uses_fields = $style_plugin && $style_plugin->uses_fields();
            if (!$uses_fields) {
                $build['fields'][] = array(
                    '#markup' => t('The selected style or row format does not utilize fields.'),
                    '#theme_wrappers' => array(
                        'views_container',
                    ),
                    '#attributes' => array(
                        'class' => array(
                            'views-display-setting',
                        ),
                    ),
                );
                return $build;
            }
        default:
            $rearrange_url = "admin/structure/views/nojs/rearrange/{$view->name}/{$display->id}/{$type}";
            $rearrange_text = t('Rearrange');
            $class = 'icon compact rearrange';
    }
    // Create an array of actions to pass to theme_links.
    $actions = array();
    $count_handlers = count($display->handler
        ->get_handlers($type));
    $actions['add'] = array(
        'title' => t('Add'),
        'href' => "admin/structure/views/nojs/add-item/{$view->name}/{$display->id}/{$type}",
        'attributes' => array(
            'class' => array(
                'icon compact add',
                'views-ajax-link',
            ),
            'title' => t('Add'),
            'id' => 'views-add-' . $type,
        ),
        'html' => TRUE,
    );
    if ($count_handlers > 0) {
        $actions['rearrange'] = array(
            'title' => $rearrange_text,
            'href' => $rearrange_url,
            'attributes' => array(
                'class' => array(
                    $class,
                    'views-ajax-link',
                ),
                'title' => t('Rearrange'),
                'id' => 'views-rearrange-' . $type,
            ),
            'html' => TRUE,
        );
    }
    // Render the array of links.
    $build['#actions'] = theme('links__ctools_dropbutton', array(
        'links' => $actions,
        'attributes' => array(
            'class' => array(
                'inline',
                'links',
                'actions',
                'horizontal',
                'right',
            ),
        ),
        'class' => array(
            'views-ui-settings-bucket-operations',
        ),
    ));
    if (!$display->handler
        ->is_default_display()) {
        if (!$display->handler
            ->is_defaulted($types[$type]['plural'])) {
            $build['#overridden'] = TRUE;
        }
        else {
            $build['#defaulted'] = TRUE;
        }
    }
    // If there's an options form for the bucket, link to it.
    if (!empty($types[$type]['options'])) {
        $build['#title'] = l($build['#title'], "admin/structure/views/nojs/config-type/{$view->name}/{$display->id}/{$type}", array(
            'attributes' => array(
                'class' => array(
                    'views-ajax-link',
                ),
                'id' => 'views-title-' . $type,
            ),
        ));
    }
    static $relationships = NULL;
    if (!isset($relationships)) {
        // Get relationship labels.
        $relationships = array();
        // @todo get_handlers()
        $handlers = $display->handler
            ->get_option('relationships');
        if ($handlers) {
            foreach ($handlers as $id => $info) {
                $handler = $display->handler
                    ->get_handler('relationship', $id);
                $relationships[$id] = $handler->label();
            }
        }
    }
    // Filters can now be grouped so we do a little bit extra.
    $groups = array();
    $grouping = FALSE;
    if ($type == 'filter') {
        $group_info = $view->display_handler
            ->get_option('filter_groups');
        // If there is only one group but it is using the "OR" filter, we still
        // treat it as a group for display purposes, since we want to display the
        // "OR" label next to items within the group.
        if (!empty($group_info['groups']) && (count($group_info['groups']) > 1 || current($group_info['groups']) == 'OR')) {
            $grouping = TRUE;
            $groups = array(
                0 => array(),
            );
        }
    }
    $build['fields'] = array();
    foreach ($display->handler
        ->get_option($types[$type]['plural']) as $id => $field) {
        // Build the option link for this handler ("Node: ID = article").
        $build['fields'][$id] = array();
        $build['fields'][$id]['#theme'] = 'views_ui_display_tab_setting';
        $handler = $display->handler
            ->get_handler($type, $id);
        if (empty($handler)) {
            $build['fields'][$id]['#class'][] = 'broken';
            $field_name = t('Broken/missing handler: @table > @field', array(
                '@table' => $field['table'],
                '@field' => $field['field'],
            ));
            $build['fields'][$id]['#link'] = l($field_name, "admin/structure/views/nojs/config-item/{$view->name}/{$display->id}/{$type}/{$id}", array(
                'attributes' => array(
                    'class' => array(
                        'views-ajax-link',
                    ),
                ),
                'html' => TRUE,
            ));
            continue;
        }
        $field_name = check_plain($handler->ui_name(TRUE));
        if (!empty($field['relationship']) && !empty($relationships[$field['relationship']])) {
            $field_name = '(' . $relationships[$field['relationship']] . ') ' . $field_name;
        }
        $description = filter_xss_admin($handler->admin_summary());
        $link_text = $field_name . (empty($description) ? '' : " ({$description})");
        $link_attributes = array(
            'class' => array(
                'views-ajax-link',
            ),
        );
        if (!empty($field['exclude'])) {
            $link_attributes['class'][] = 'views-field-excluded';
        }
        $build['fields'][$id]['#link'] = l($link_text, "admin/structure/views/nojs/config-item/{$view->name}/{$display->id}/{$type}/{$id}", array(
            'attributes' => $link_attributes,
            'html' => TRUE,
        ));
        $build['fields'][$id]['#class'][] = drupal_clean_css_identifier($display->id . '-' . $type . '-' . $id);
        if (!empty($view->changed_sections[$display->id . '-' . $type . '-' . $id])) {
            // @todo #changed is no longer being used?
            $build['fields'][$id]['#changed'] = TRUE;
        }
        if ($display->handler
            ->use_group_by() && $handler->use_group_by()) {
            $build['fields'][$id]['#settings_links'][] = l('<span class="label">' . t('Aggregation settings') . '</span>', "admin/structure/views/nojs/config-item-group/{$view->name}/{$display->id}/{$type}/{$id}", array(
                'attributes' => array(
                    'class' => 'views-button-configure views-ajax-link',
                    'title' => t('Aggregation settings'),
                ),
                'html' => TRUE,
            ));
        }
        if ($handler->has_extra_options()) {
            $build['fields'][$id]['#settings_links'][] = l('<span class="label">' . t('Settings') . '</span>', "admin/structure/views/nojs/config-item-extra/{$view->name}/{$display->id}/{$type}/{$id}", array(
                'attributes' => array(
                    'class' => array(
                        'views-button-configure',
                        'views-ajax-link',
                    ),
                    'title' => t('Settings'),
                ),
                'html' => TRUE,
            ));
        }
        if ($grouping) {
            $gid = $handler->options['group'];
            // Show in default group if the group does not exist.
            if (empty($group_info['groups'][$gid])) {
                $gid = 0;
            }
            $groups[$gid][] = $id;
        }
    }
    // If using grouping, re-order fields so that they show up properly in the
    // list.
    if ($type == 'filter' && $grouping) {
        $store = $build['fields'];
        $build['fields'] = array();
        foreach ($groups as $gid => $contents) {
            // Display an operator between each group.
            if (!empty($build['fields'])) {
                $build['fields'][] = array(
                    '#theme' => 'views_ui_display_tab_setting',
                    '#class' => array(
                        'views-group-text',
                    ),
                    '#link' => $group_info['operator'] == 'OR' ? t('OR') : t('AND'),
                );
            }
            // Display an operator between each pair of filters within the group.
            $keys = array_keys($contents);
            $last = end($keys);
            foreach ($contents as $key => $pid) {
                if ($key != $last) {
                    $store[$pid]['#link'] .= '&nbsp;&nbsp;' . ($group_info['groups'][$gid] == 'OR' ? t('OR') : t('AND'));
                }
                $build['fields'][$pid] = $store[$pid];
            }
        }
    }
    return $build;
}