You are here

views_maintenance.admin.inc in Views Maintenance 6

Same filename and directory in other branches
  1. 7 views_maintenance.admin.inc

Provides administrative UI for Views Maintenance.

File

views_maintenance.admin.inc
View source
<?php

/**
 * @file
 * Provides administrative UI for Views Maintenance.
 */

/**
 * Sorts by status, the order is "broken", "ok", "maybe", "unused".
 *
 * Callback for usort() within views_maintenance_page().
 *
 * @param array $a
 * @param array $b
 */
function _views_maintenance_use_cases_sort_by_status($a, $b) {
  return _views_maintenance_compare_by_order($a['status'], $b['status']);
}

/**
 * Returns view status based on its displays statuses.
 *
 * @param array $displays_statuses
 *   Flat array containing statuses from most important use case of each
 *   view display.
 *
 * @return string
 *   Status of view. Value is one of:
 *   - "broken"
 *   - "ok"
 *   - "has-maybe"
 *   - "has-unused"
 *   - "unused".
 */
function _views_maintenance_view_status($displays_statuses = array()) {

  // Check "broken" status existence.
  if (array_search('broken', $displays_statuses) !== FALSE) {
    return 'broken';
  }

  // Move 'default' display status from array
  $default_status = $displays_statuses['default'];
  unset($displays_statuses['default']);
  if (empty($displays_statuses)) {

    // Default display is the only display in view, use its status for view
    // status.
    switch ($default_status) {
      case 'ok':
        return 'ok';
      case 'maybe':
        return 'has-maybe';
      default:

        // unused
        return 'unused';
    }
  }
  $counts = array_count_values($displays_statuses);
  if (!empty($counts['unused'])) {

    // View has unused displays.
    if (empty($counts['ok']) && empty($counts['maybe']) && $default_status == 'unused') {

      // View contains only unused displays.
      return 'unused';
    }
    else {

      // View has unused displays among others.
      return 'has-unused';
    }
  }
  elseif (!empty($counts['maybe'])) {

    // View doesn't have unused displays, but has "maybe" non-default displays.
    // Default display status is ignored here.
    return 'has-maybe';
  }
  else {

    // All non-default displays have "ok" status, ignore default display status.
    return 'ok';
  }
}

/**
 * Returns array of administration links for view passed.
 *
 * Most of code copied from template_preprocess_views_ui_list_views(). Don't
 * need to check access for links, because views maintenance menu item already
 * has permissions check.
 *
 * @param object $view
 *
 * @return array
 */
function _views_maintenance_view_admin_links($view) {
  static $tokens = array();

  // Fill tokens static cache.
  if (empty($tokens)) {
    $tokens['enable'] = drupal_get_token('views-enable');
    $tokens['disable'] = drupal_get_token('views-disable');
  }
  $links = array(
    l(t('Edit'), "admin/build/views/edit/{$view->name}"),
    l(t('Export'), "admin/build/views/export/{$view->name}"),
  );

  // Add Delete/Revert/Enable/Disable link.
  if ($view->type != t('Default')) {
    $text = $view->type == t('Overridden') ? t('Revert') : t('Delete');
    $links[] = l($text, "admin/build/views/delete/{$view->name}", array(
      'query' => array(
        'cancel' => 'admin/build/views/maintenance',
      ),
    ));
  }
  else {
    if (empty($view->disabled)) {
      $links[] = l(t('Disable'), "admin/build/views/disable/{$view->name}", array(
        'query' => drupal_get_destination() . '&token=' . $tokens['disable'],
      ));
    }
    else {
      $links[] = l(t('Enable'), "admin/build/views/enable/{$view->name}", array(
        'query' => drupal_get_destination() . '&token=' . $tokens['enable'],
      ));
    }
  }
  return $links;
}

/**
 * Page callback for views maintenance page.
 *
 * @return string
 */
function views_maintenance_page() {
  $views = views_get_all_views();

  // Filter-out disabled views from list.
  foreach ($views as $view_id => $view) {
    if (!empty($view->disabled)) {

      // Exclude disabled views
      $view
        ->destroy();
      unset($views[$view_id]);
      continue;
    }
  }
  $views_info = array();
  if (!empty($views)) {

    // Include necessary files. But first of all include views/includes/handlers.inc,
    // because hook_views_api() implementations for core modules are there and
    // after we call module_implements('views_api') implementations static cache
    // will miss those implementations and all core handlers will be broken.
    views_include('base');
    views_include('handlers');
    views_module_include('views_maintenance.inc');

    // Run hooks to get status from all modules
    $views_use_cases = module_invoke_all('views_maintenance_use_cases', $views);

    // Init order for sorting use cases by level of importance.
    _views_maintenance_compare_by_order(NULL, NULL, array(
      'broken',
      'ok',
      'maybe',
      'unused',
    ));

    // Build views info.
    views_include('admin');
    $base_tables = views_fetch_base_tables();
    foreach ($views as $view_id => $view) {
      $displays_info = array();
      $displays_statuses = array();
      foreach ($view->display as $display_id => $display) {
        if (!empty($views_use_cases[$view_id][$display_id])) {

          // At least one use case was returned, sort use cases by status. This
          // brings use case with most important status to the first position.
          // Order was initialized earlier.
          $display_use_cases = $views_use_cases[$view_id][$display_id];
          usort($display_use_cases, '_views_maintenance_use_cases_sort_by_status');
        }
        else {

          // No use cases were returned for this display, use default use case
          // with "unused" status and without description.
          $display_use_cases = array(
            array(
              'status' => 'unused',
            ),
          );
        }

        // Save first use case status, it is used for determining view status.
        $first = reset(array_keys($display_use_cases));
        $displays_statuses[$display_id] = $display_use_cases[$first]['status'];

        // Build display info.
        $displays_info[$display_id] = array(
          'name' => $display->display_title,
          'type' => $display->handler->definition['title'],
          'use_cases' => $display_use_cases,
        );
      }

      // Determine view status based on most important status of each display.
      $view_status = _views_maintenance_view_status($displays_statuses);
      $views_info[$view_id] = array(
        'name' => $view->name,
        'type' => !empty($base_tables[$view->base_table]['title']) ? $base_tables[$view->base_table]['title'] : t('Broken'),
        'storage' => $view->type,
        'status' => $view_status,
        'links' => _views_maintenance_view_admin_links($view),
        'description' => $view->description,
        'displays' => $displays_info,
      );
    }
  }
  return theme('views_maintenance_views_table', $views_info);
}

Functions

Namesort descending Description
views_maintenance_page Page callback for views maintenance page.
_views_maintenance_use_cases_sort_by_status Sorts by status, the order is "broken", "ok", "maybe", "unused".
_views_maintenance_view_admin_links Returns array of administration links for view passed.
_views_maintenance_view_status Returns view status based on its displays statuses.