You are here

analyze.inc in Views (for Drupal 7) 6.3

Same filename and directory in other branches
  1. 6.2 includes/analyze.inc
  2. 7.3 includes/analyze.inc

Contains the view analyze tool code.

This tool is a small plugin manager to perform analysis on a view and report results to the user. This tool is meant to let modules that provide data to Views also help users properly use that data by detecting invalid configurations. Views itself comes with only a small amount of analysis tools, but more could easily be added either by modules or as patches to Views itself.

File

includes/analyze.inc
View source
<?php

/**
 * @file
 * Contains the view analyze tool code.
 *
 * This tool is a small plugin manager to perform analysis on a view and
 * report results to the user. This tool is meant to let modules that
 * provide data to Views also help users properly use that data by
 * detecting invalid configurations. Views itself comes with only a
 * small amount of analysis tools, but more could easily be added either
 * by modules or as patches to Views itself.
 */

/**
 * Analyze a review and return the results.
 *
 * @return
 *   An array of analyze results organized into arrays keyed by 'ok',
 *   'warning' and 'error'.
 */
function views_analyze_view(&$view) {
  $view
    ->init_display();
  $messages = module_invoke_all('views_analyze', $view);
  return $messages;
}

/**
 * Format the analyze result into a message string.
 *
 * This is based upon the format of drupal_set_message which uses separate
 * boxes for "ok", "warning" and "error".
 */
function views_analyze_format_result($view, $messages) {
  if (empty($messages)) {
    $messages = array(
      views_ui_analysis(t('View analysis can find nothing to report.'), 'ok'),
    );
  }
  $types = array(
    'ok' => array(),
    'warning' => array(),
    'error' => array(),
  );
  foreach ($messages as $message) {
    if (empty($types[$message['type']])) {
      $types[$message['type']] = array();
    }
    $types[$message['type']][] = $message['message'];
  }
  $output = '';
  foreach ($types as $type => $messages) {
    $message = '';
    if (count($messages) > 1) {
      $message = theme('item_list', $messages);
    }
    else {
      if ($messages) {
        $message = array_shift($messages);
      }
    }
    if ($message) {
      $output .= "<div class=\"{$type}\">{$message}</div>";
    }
  }
  return $output;
}

/**
 * Format an analysis message.
 *
 * This tool should be called by any module responding to the analyze hook
 * to properly format the message. It is usually used in the form:
 * @code
 *   $ret[] = views_ui_analysis(t('This is the message'), 'ok');
 * @endcode
 *
 * The 'ok' status should be used to provide information about things
 * that are acceptable. In general analysis isn't interested in 'ok'
 * messages, but instead the 'warning', which is a category for items
 * that may be broken unless the user knows what he or she is doing,
 * and 'error' for items that are definitely broken are much more useful.
 *
 * @param $messages
 *   The message to report.
 * @param $type
 *   The type of message. This should be "ok", "warning" or "error". Other
 *   values can be used but how they are treated by the output routine
 *   is undefined.
 */
function views_ui_analysis($message, $type = 'error') {
  return array(
    'message' => $message,
    'type' => $type,
  );
}

/**
 * Implementation of hook_views_analyze().
 *
 * This is the basic views analysis that checks for very minimal problems.
 * There are other analysis tools in core specific sections, such as
 * node.views.inc as well.
 */
function views_ui_views_analyze($view) {
  $ret = array();

  // Check for something other than the default display:
  if (count($view->display) < 2) {
    $ret[] = views_ui_analysis(t('This view has only a default display and therefore will not be placed anywhere on your site; perhaps you want to add a page or a block display.'), 'warning');
  }
  foreach ($view->display as $display_id => $display) {
    if (empty($display->handler) || !empty($display->handler->broken)) {
      $ret[] = views_ui_analysis(t('Display plugin @plugin is not available.', array(
        '@plugin' => $display->display_plugin,
      )), 'error');
    }
    $plugin = $display->handler
      ->get_plugin('style');
    if ($plugin) {
      $plugin
        ->init($view, $display);
      if ($validate_messages = $plugin
        ->validate()) {
        foreach ($validate_messages as $validate_message) {
          $ret[] = views_ui_analysis(t('Style plugin @plugin: @message', array(
            '@plugin' => $plugin_name,
            '@message' => $validate_message,
          )));
        }
      }
    }
    else {
      $ret[] = views_ui_analysis(t('Style plugin @plugin is not available.', array(
        '@plugin' => $plugin_name,
      )), 'error');
    }
    foreach (views_object_types() as $type => $info) {
      $handlers = $display->handler
        ->get_handlers($type);
      if ($handlers) {
        foreach ($handlers as $id => $handler) {
          if ($validate_messages = $handler
            ->validate()) {
            foreach ($validate_messages as $message) {
              $ret[] = views_ui_analysis("{$display_id}: {$id}: {$message}", 'error');
            }
          }
          if ($handler
            ->broken()) {
            $ret[] = views_ui_analysis(t('@type handler @table.@field is not available.', array(
              '@type' => $info['stitle'],
              '@table' => $handler->table,
              '@field' => $handler->field,
            )), 'error');
          }
        }
      }
    }
  }
  return $ret;
}

Functions

Namesort descending Description
views_analyze_format_result Format the analyze result into a message string.
views_analyze_view Analyze a review and return the results.
views_ui_analysis Format an analysis message.
views_ui_views_analyze Implementation of hook_views_analyze().