You are here

public function FrxChart::render in Forena Reports 7.3

Same name and namespace in other branches
  1. 6.2 plugins/FrxChart.inc \FrxChart::render()
  2. 7.2 plugins/FrxChart.inc \FrxChart::render()

Overrides FrxRenderer::render

File

renderers/FrxChart.inc, line 10
FrxChart Base class for chart generation implementations. @author davidmetzler

Class

FrxChart
@file FrxChart Base class for chart generation implementations. @author davidmetzler

Code

public function render() {

  // Get data from source
  $output = '';
  $options = array();
  $series = array();
  $seriesx = array();
  $data = array();
  $attributes = $this
    ->mergedAttributes();
  $path = isset($attributes['xpath']) ? $attributes['xpath'] : '*';
  $label = '';
  $links = '';
  $type = $attributes['type'];
  $link = @$attributes['link'];

  // Legacy options.  New charts should be generated using Frx:attribute syntax
  if (isset($attributes['options'])) {
    parse_str($attributes['options'], $options);
    unset($attributes['options']);
    $options = array_merge($attributes, $options);
  }
  else {
    $options = $attributes;
  }
  $series = @$options['series'];
  if (isset($options['seriesx'])) {
    $seriesx = $options['seriesx'];
    unset($options['seriesx']);
  }
  if (isset($options['label'])) {
    $label = $options['label'];
    unset($options['label']);
  }
  foreach ($options as $key => $value) {
    $options[$key] = $this->teng
      ->replace($value, TRUE);
  }
  if (isset($attributes['height'])) {
    $options['height'] = $this->teng
      ->replace($attributes['height']);
  }
  if (isset($attributes['width'])) {
    $options['width'] = $this->teng
      ->replace($attributes['width']);
  }

  // Extract chart series data from xml.
  if ($series) {
    foreach ((array) $series as $i => $d) {
      if ($seriesx) {
        $this->xy_data = TRUE;
        $data[] = $this
          ->xmlToValues($path, $d, $seriesx[$i], TRUE);
      }
      else {
        $data[] = $this
          ->xmlToValues($path, $d, $label, FALSE);
      }
    }
  }
  if ($link) {
    $links = $this
      ->xmlToValues($path, $link, $label);
  }

  // Deal with rare case where attributes are supposed to come from data
  if (@$attributes['color'] && !is_array($attributes['color']) && strpos($attributes['color'], '{') !== FALSE) {
    $options['colors'] = $this
      ->xmlToValues($path, $attributes['color']);
  }

  // Deal with rare case where legend are supposed to come from data
  if (@$attributes['legend_entry'] && !is_array($attributes['legend_entry']) && strpos($attributes['legend_entry'], '{') !== FALSE) {
    $options['legend_entries'] = $this
      ->xmlToValues($path, $attributes['legend_entry']);
  }
  if ($data) {
    if (method_exists($this, 'renderChart')) {
      $output = $this
        ->renderChart($type, $data, $options, $links);
    }
  }
  return $output;
}