You are here

function draggableviews_views_pre_execute in DraggableViews 7

Same name and namespace in other branches
  1. 6.3 draggableviews.module \draggableviews_views_pre_execute()

Implements hook_views_pre_execute().

We use this hook to extend the view window before it gets executed. In hook_pre_render we afterwards check for the correctness and re-execute the view if needed.

File

./draggableviews.module, line 223
Draggableviews module provides a style plugin for views. With this plugin rows become draggable and can be organized in complex structures.

Code

function draggableviews_views_pre_execute(&$view) {
  if ($view->style_plugin->definition['handler'] != 'draggableviews_plugin_style_draggabletable') {

    // This view doesn't use draggable_table style plugin. Nothing to do.
    return;
  }
  if (isset($view->draggableviews_info)) {

    // Don't fall in an infinit recursion when the view gets re-executed.
    return;
  }

  // Get info array.
  $info = _draggableviews_info($view);
  if (!isset($info['order'])) {

    // Nothing to do.
    return;
  }

  // Attach the info array to the view object.
  // We need to use a reference because the info array will change.
  $view->draggableviews_info =& $info;

  // We want the view to execute the count query. New nodes which should be added to the very end will use this value.
  // @todo: Deprecated: If paging is not used the count query will not be executed anyway. the $view->total_rows property is not needed anymore. It has been replaced with 999999999999.
  $view->get_total_rows = TRUE;
  $info['pager'] = $info['view']->query->pager;
  $info['globals'] = array();
  if ($info['needs_pager_modifications']) {

    // Paging is beeing used. We modify some paging settings before the view gets executed.
    // We let views think that the current page is 0, but we also backup the actual value. We
    // will restore it after finishing all operations (see hook_views_pre_render).
    $info['globals']['page'] = isset($_GET['page']) ? $_GET['page'] : NULL;
    $pager_page_array = isset($_GET['page']) ? explode(',', $_GET['page']) : array();
    if (!empty($pager_page_array[$info['pager']->options['id']]) && $pager_page_array[$info['pager']->options['id']] > 0) {
      $info['pager']->current_page = intval($pager_page_array[$info['pager']->options['id']]);
    }
    else {
      $info['pager']->current_page = 0;
    }
    $pager_page_array[$info['pager']->options['id']] = 0;

    // Change the _GET variable.
    $_GET['page'] = implode(',', $pager_page_array);
    if (isset($info['hierarchy'])) {

      // In order to find hidden parents or child nodes we need to load the entire view.
      // To induce that the entire view gets loaded we set to items_per_page to 999999999.
      $info['view']->query->pager->options['items_per_page'] = DRAGGABLEVIEWS_DBQUERY_LIMIT;

      // Permissions checks cannot be done right now because the window probably must be extended
      // even if the user doesn't have permissions.
    }
    else {

      // We just extend the visible window.
      $first_index = $info['pager']->current_page * $info['pager']->options['items_per_page'];
      $last_index = $first_index + $info['pager']->options['items_per_page'] - 1;

      // When we deal with simple lists permission checks must be done right now (differently to hierarchies).
      if (user_access('Allow Reordering') && !$info['locked']) {

        // Add extensions.
        $first_index -= $info['view_window_extensions']['extension_top'];
        $last_index += $info['view_window_extensions']['extension_bottom'];
        if ($first_index < 0) {
          $first_index = 0;
        }
      }
      $info['view']->query->pager->options['items_per_page'] = $last_index - $first_index + 1;
      $info['view']->query->pager->options['offset'] = $first_index + $info['pager']->options['offset'];
    }
  }
}