2015-08-17 17:00:26 -07:00
< ? php
namespace Drupal\views ;
use Drupal\Core\Extension\ModuleHandlerInterface ;
/**
* 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 .
*/
class Analyzer {
/**
* A module handler that invokes the 'views_analyze' hook .
*
* @ var \Drupal\Core\Extension\ModuleHandlerInterface
*/
protected $moduleHandler ;
/**
* Constructs an Analyzer object .
*
* @ param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
* The module handler that invokes the 'views_analyze' hook .
*/
public function __construct ( ModuleHandlerInterface $module_handler ) {
$this -> moduleHandler = $module_handler ;
}
/**
* Analyzes a review and return the results .
*
* @ param \Drupal\views\ViewExecutable $view
* The view to analyze .
*
* @ return array
* An array of analyze results organized into arrays keyed by 'ok' ,
* 'warning' and 'error' .
*/
public function getMessages ( ViewExecutable $view ) {
$view -> initDisplay ();
2017-04-13 15:53:35 +01:00
$messages = $this -> moduleHandler -> invokeAll ( 'views_analyze' , [ $view ]);
2015-08-17 17:00:26 -07:00
return $messages ;
}
/**
* Formats 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 " .
*/
public function formatMessages ( array $messages ) {
if ( empty ( $messages )) {
2017-04-13 15:53:35 +01:00
$messages = [ static :: formatMessage ( t ( 'View analysis can find nothing to report.' ), 'ok' )];
2015-08-17 17:00:26 -07:00
}
2017-04-13 15:53:35 +01:00
$types = [ 'ok' => [], 'warning' => [], 'error' => []];
2015-08-17 17:00:26 -07:00
foreach ( $messages as $message ) {
if ( empty ( $types [ $message [ 'type' ]])) {
2017-04-13 15:53:35 +01:00
$types [ $message [ 'type' ]] = [];
2015-08-17 17:00:26 -07:00
}
$types [ $message [ 'type' ]][] = $message [ 'message' ];
}
$output = '' ;
foreach ( $types as $type => $messages ) {
$type .= ' messages' ;
$message = '' ;
if ( count ( $messages ) > 1 ) {
2017-04-13 15:53:35 +01:00
$item_list = [
2015-08-17 17:00:26 -07:00
'#theme' => 'item_list' ,
'#items' => $messages ,
2017-04-13 15:53:35 +01:00
];
2015-08-17 17:00:26 -07:00
$message = drupal_render ( $item_list );
}
elseif ( $messages ) {
$message = array_shift ( $messages );
}
if ( $message ) {
$output .= " <div class= \" $type\ " > $message </ div > " ;
}
}
return $output ;
}
/**
* Formats 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 [] = Analyzer :: formatMessage ( 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 string $message
* @ param string $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 .
*
* @ return array
* A single formatted message , consisting of a key message and a key type .
*/
2017-04-13 15:53:35 +01:00
public static function formatMessage ( $message , $type = 'error' ) {
return [ 'message' => $message , 'type' => $type ];
2015-08-17 17:00:26 -07:00
}
}