1 ajax.inc | views_ajax() |
Menu callback to load a view via AJAX.
Related topics
File
- core/
modules/ views/ includes/ ajax.inc, line 16 - Handles the server side AJAX interactions of Views.
Code
function views_ajax() {
if (isset($_REQUEST['view_name']) && isset($_REQUEST['view_display_id'])) {
$name = $_REQUEST['view_name'];
$display_id = $_REQUEST['view_display_id'];
$args = isset($_REQUEST['view_args']) && $_REQUEST['view_args'] !== '' ? explode('/', $_REQUEST['view_args']) : array();
$path = isset($_REQUEST['view_path']) ? rawurldecode($_REQUEST['view_path']) : NULL;
$dom_id = isset($_REQUEST['view_dom_id']) ? preg_replace('/[^a-zA-Z0-9_-]+/', '-', $_REQUEST['view_dom_id']) : NULL;
$pager_element = isset($_REQUEST['pager_element']) ? intval($_REQUEST['pager_element']) : NULL;
$commands = array();
// Remove all of this stuff from $_GET so it doesn't end up in pagers and tablesort URLs.
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') as $key) {
if (isset($_GET[$key])) {
unset($_GET[$key]);
}
if (isset($_REQUEST[$key])) {
unset($_REQUEST[$key]);
}
if (isset($_POST[$key])) {
unset($_POST[$key]);
}
}
// Load the view.
$view = views_get_view($name);
if ($view && $view->access($display_id) && $view->set_display($display_id) && $view->display_handler->use_ajax()) {
// Fix 'q' for paging.
if (!empty($path)) {
$_GET['q'] = $path;
}
// Add all $_POST data, because AJAX is always a post and many things,
// such as tablesorts, exposed filters and paging assume $_GET.
$_GET = $_POST + $_GET;
// Overwrite the destination.
// @see backdrop_get_destination()
$origin_destination = $path;
$query = backdrop_http_build_query(backdrop_get_query_parameters());
if ($query != '') {
$origin_destination .= '?' . $query;
}
$destination = &backdrop_static('backdrop_get_destination');
$destination = array('destination' => $origin_destination);
// Override the display's pager_element with the one actually used.
if (isset($pager_element)) {
$commands[] = views_ajax_command_scroll_top('.view-dom-id-' . $dom_id);
$view->display[$display_id]->handler->set_option('pager_element', $pager_element);
}
// Reuse the same DOM id so it matches that in Backdrop.settings.
$view->dom_id = $dom_id;
$commands[] = ajax_command_replace('.view-dom-id-' . $dom_id, $view->preview($display_id, $args));
}
backdrop_alter('views_ajax_data', $commands, $view);
return array('#type' => 'ajax', '#commands' => $commands);
}
}