*
  • Global properties
  • : Key-value pairs that stay the same every time render is called, and are * passed to an instance in the constructor. *
  • Aggregated properties
  • : Global properties that are created automatically from * all attached data points. *
  • Local properties
  • : Key-value pairs that only apply to a single data point and * are passed to the render-function. * */ class Tooltip { /** * The default format string used * when no other format is specified * * @var string */ private $defaultFormat; /** * All aggregated points * * @var array */ private $points = array(); /** * Contains all static replacements * * @var array */ private $data = array( 'sum' => 0 ); /** * Used to format the displayed tooltip. * * @var string */ protected $tooltipFormat; /** * Create a new tooltip with the specified default format string * * Allows you to set the global data for this tooltip, that is displayed every * time render is called. * * @param array $data Map of global properties * @param string $format The default format string */ public function __construct( $data = array(), $format = '{title}: {value} {label}' ) { $this->data = array_merge($this->data, $data); $this->defaultFormat = $format; } /** * Add a single data point to update the aggregated properties for this tooltip * * @param $point array Contains the (x,y) values of the data set */ public function addDataPoint($point) { // set x-value if (!isset($this->data['title'])) { $this->data['title'] = $point[0]; } // aggregate y-values $y = (int)$point[1]; if (isset($point[2])) { // load original value in case value already aggregated $y = (int)$point[2]; } if (!isset($this->data['min']) || $this->data['min'] > $y) { $this->data['min'] = $y; } if (!isset($this->data['max']) || $this->data['max'] < $y) { $this->data['max'] = $y; } $this->data['sum'] += $y; $this->points[] = $y; } /** * Format the tooltip for a certain data point * * @param array $order Which data set to render * @param array $data The local data for this tooltip * @param string $format Use a custom format string for this data set * * @return mixed|string The tooltip value */ public function render($order, $data = array(), $format = null) { if (isset($format)) { $str = $format; } else { $str = $this->defaultFormat; } $data['value'] = $this->points[$order]; foreach (array_merge($this->data, $data) as $key => $value) { $str = str_replace('{' . $key . '}', $value, $str); } return $str; } /** * Format the tooltip for a certain data point but remove all * occurring html tags * * This is useful for rendering clean tooltips on client without JavaScript * * @param array $order Which data set to render * @param array $data The local data for this tooltip * @param string $format Use a custom format string for this data set * * @return mixed|string The tooltip value, without any HTML tags */ public function renderNoHtml($order, $data, $format) { return strip_tags($this->render($order, $data, $format)); } }