function views_ui_preview

Same name in other branches
  1. 6.x-3.x includes/admin.inc \views_ui_preview()

Returns the results of the live preview.

1 call to views_ui_preview()
views_ui_build_preview in includes/admin.inc
1 string reference to 'views_ui_preview'
views_ui_menu in ./views_ui.module
Implements hook_menu().

File

includes/admin.inc, line 115

Code

function views_ui_preview($view, $display_id, $args = array()) {
    $temp_args = func_get_args();
    // When this function is invoked as a page callback, each Views argument is
    // passed separately.
    if (!is_array($args)) {
        $args = array_slice($temp_args, 2);
    }
    // Save $_GET['q'] so it can be restored before returning from this function.
    $q = $_GET['q'];
    // Determine where the query and performance statistics should be output.
    $show_query = variable_get('views_ui_show_sql_query', FALSE);
    $show_info = variable_get('views_ui_show_preview_information', FALSE);
    $show_location = variable_get('views_ui_show_sql_query_where', 'above');
    $show_stats = variable_get('views_ui_show_performance_statistics', FALSE);
    if ($show_stats) {
        $show_stats = variable_get('views_ui_show_sql_query_where', 'above');
    }
    $combined = $show_query && $show_stats;
    $rows = array(
        'query' => array(),
        'statistics' => array(),
    );
    $output = '';
    $errors = $view->validate();
    if ($errors === TRUE) {
        $view->ajax = TRUE;
        $view->live_preview = TRUE;
        $view->views_ui_context = TRUE;
        // AJAX happens via $_POST but everything expects exposed data to be in
        // GET. Copy stuff but remove ajax-framework specific keys. If we're
        // clicking on links in a preview, though, we could actually still have
        // some in $_GET, so we use $_REQUEST to ensure we get it all.
        $exposed_input = $_REQUEST;
        foreach (array(
            'view_name',
            'view_display_id',
            'view_args',
            'view_path',
            'view_dom_id',
            'pager_element',
            'view_base_path',
            'ajax_html_ids',
            'ajax_page_state',
            'form_id',
            'form_build_id',
            'form_token',
        ) as $key) {
            if (isset($exposed_input[$key])) {
                unset($exposed_input[$key]);
            }
        }
        $view->set_exposed_input($exposed_input);
        if (!$view->set_display($display_id)) {
            return t('Invalid display id @display', array(
                '@display' => $display_id,
            ));
        }
        $view->set_arguments($args);
        // Store the current view URL for later use.
        if ($view->display_handler
            ->get_option('path')) {
            $path = $view->get_url();
        }
        // Make view links come back to preview.
        $view->override_path = 'admin/structure/views/nojs/preview/' . $view->name . '/' . $display_id;
        // Also override $_GET['q'] so we get the pager.
        $original_path = current_path();
        $_GET['q'] = $view->override_path;
        if ($args) {
            $_GET['q'] .= '/' . implode('/', $args);
        }
        // Suppress contextual links of entities within the result set during a
        // Preview.
        // @todo We'll want to add contextual links specific to editing the View, so
        //   the suppression may need to be moved deeper into the Preview pipeline.
        views_ui_contextual_links_suppress_push();
        $preview = $view->preview($display_id, $args);
        views_ui_contextual_links_suppress_pop();
        // Reset variables.
        unset($view->override_path);
        $_GET['q'] = $original_path;
        // Prepare the query information and statistics to show either above or
        // below the view preview.
        if ($show_info || $show_query || $show_stats) {
            // Get information from the preview for display.
            if (!empty($view->build_info['query'])) {
                if ($show_query) {
                    $query = $view->build_info['query'];
                    // Only the SQL default class has a method getArguments.
                    $quoted = array();
                    if ($view->query instanceof views_plugin_query_default) {
                        $quoted = $query->getArguments();
                        $connection = Database::getConnection();
                        foreach ($quoted as $key => $val) {
                            if (is_array($val)) {
                                $quoted[$key] = implode(', ', array_map(array(
                                    $connection,
                                    'quote',
                                ), $val));
                            }
                            else {
                                $quoted[$key] = $connection->quote($val);
                            }
                        }
                    }
                    $rows['query'][] = array(
                        '<strong>' . t('Query') . '</strong>',
                        '<pre>' . check_plain(strtr($query, $quoted)) . '</pre>',
                    );
                    if (!empty($view->additional_queries)) {
                        $queries = '<strong>' . t('These queries were run during view rendering:') . '</strong>';
                        foreach ($view->additional_queries as $query) {
                            if ($queries) {
                                $queries .= "\n";
                            }
                            $queries .= t('[@time ms]', array(
                                '@time' => intval($query[1] * 100000) / 100,
                            )) . ' ' . $query[0];
                        }
                        $rows['query'][] = array(
                            '<strong>' . t('Other queries') . '</strong>',
                            '<pre>' . $queries . '</pre>',
                        );
                    }
                }
                if ($show_info) {
                    $rows['query'][] = array(
                        '<strong>' . t('Title') . '</strong>',
                        filter_xss_admin($view->get_title()),
                    );
                    if (isset($path)) {
                        $path = l($path, $path);
                    }
                    else {
                        $path = t('This display has no path.');
                    }
                    $rows['query'][] = array(
                        '<strong>' . t('Path') . '</strong>',
                        $path,
                    );
                }
                if ($show_stats) {
                    $rows['statistics'][] = array(
                        '<strong>' . t('Query build time') . '</strong>',
                        t('@time ms', array(
                            '@time' => intval($view->build_time * 100000) / 100,
                        )),
                    );
                    $rows['statistics'][] = array(
                        '<strong>' . t('Query execute time') . '</strong>',
                        t('@time ms', array(
                            '@time' => intval($view->execute_time * 100000) / 100,
                        )),
                    );
                    $rows['statistics'][] = array(
                        '<strong>' . t('View render time') . '</strong>',
                        t('@time ms', array(
                            '@time' => intval($view->render_time * 100000) / 100,
                        )),
                    );
                }
                drupal_alter('views_preview_info', $rows, $view);
            }
            else {
                // No query was run. Display that information in place of either the
                // query or the performance statistics, whichever comes first.
                if ($combined || $show_location === 'above') {
                    $rows['query'] = array(
                        array(
                            '<strong>' . t('Query') . '</strong>',
                            t('No query was run'),
                        ),
                    );
                }
                else {
                    $rows['statistics'] = array(
                        array(
                            '<strong>' . t('Query') . '</strong>',
                            t('No query was run'),
                        ),
                    );
                }
            }
        }
    }
    else {
        foreach ($errors as $error) {
            drupal_set_message($error, 'error');
        }
        $preview = t('Unable to preview due to validation errors.');
    }
    // Assemble the preview, the query info, and the query statistics in the
    // requested order.
    if ($show_location === 'above') {
        if ($combined) {
            $output .= '<div class="views-query-info">' . theme('table', array(
                'rows' => array_merge($rows['query'], $rows['statistics']),
            )) . '</div>';
        }
        else {
            $output .= '<div class="views-query-info">' . theme('table', array(
                'rows' => $rows['query'],
            )) . '</div>';
        }
    }
    elseif ($show_stats === 'above') {
        $output .= '<div class="views-query-info">' . theme('table', array(
            'rows' => $rows['statistics'],
        )) . '</div>';
    }
    $output .= $preview;
    if ($show_location === 'below') {
        if ($combined) {
            $output .= '<div class="views-query-info">' . theme('table', array(
                'rows' => array_merge($rows['query'], $rows['statistics']),
            )) . '</div>';
        }
        else {
            $output .= '<div class="views-query-info">' . theme('table', array(
                'rows' => $rows['query'],
            )) . '</div>';
        }
    }
    elseif ($show_stats === 'below') {
        $output .= '<div class="views-query-info">' . theme('table', array(
            'rows' => $rows['statistics'],
        )) . '</div>';
    }
    $_GET['q'] = $q;
    return $output;
}