Skip to content
Extraits de code Groupes Projets
API.php 16,7 ko
Newer Older
  • Learn to ignore specific revisions
  • mattpiwik's avatar
    mattpiwik a validé
    <?php
    /**
     * Piwik - Open source web analytics
     * 
     * @link http://piwik.org
     * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
    
    mattpiwik's avatar
    mattpiwik a validé
     * @version $Id$
    
    mattpiwik's avatar
    mattpiwik a validé
     *
    
    mattpiwik's avatar
    mattpiwik a validé
     * @category Piwik_Plugins
     * @package Piwik_ImageGraph
     */
    
    /**
    
     * The ImageGraph.get API call lets you generate beautiful static PNG Graphs for any existing Piwik report.
     * Supported graph types are: line plot, 2D/3D pie chart and vertical bar chart.
    
    mattpiwik's avatar
    mattpiwik a validé
     *
    
    mattpiwik's avatar
    mattpiwik a validé
     * A few notes about some of the parameters available:<br/>
    
     * - $graphType defines the type of graph plotted, accepted values are: 'evolution', 'verticalBar', 'pie' and '3dPie'<br/>
    
    mattpiwik's avatar
    mattpiwik a validé
     * - $colors accepts a comma delimited list of colors that will overwrite the default Piwik colors <br/>
    
     * - you can also customize the width, height, font size, metric being plotted (in case the data contains multiple columns/metrics).
    
    mattpiwik's avatar
    mattpiwik a validé
     *
    
     * See also <a href='http://piwik.org/docs/analytics-api/metadata/#toc-static-image-graphs'>How to embed static Image Graphs?</a> for more information.
    
    mattpiwik's avatar
    mattpiwik a validé
     *
    
    mattpiwik's avatar
    mattpiwik a validé
     * @package Piwik_ImageGraph
    
    mattpiwik's avatar
    mattpiwik a validé
     */
    
    mattpiwik's avatar
    mattpiwik a validé
    class Piwik_ImageGraph_API
    {
    
    	const FILENAME_KEY = 'filename';
    	const TRUNCATE_KEY = 'truncate';
    	const WIDTH_KEY = 'width';
    	const HEIGHT_KEY = 'height';
    
    mattpiwik's avatar
    mattpiwik a validé
    	const MAX_WIDTH = 1900;
    	const MAX_HEIGHT = 1024;
    
    
    	static private $DEFAULT_PARAMETERS = array(
    		Piwik_ImageGraph_StaticGraph::GRAPH_TYPE_BASIC_LINE => array(
    			self::FILENAME_KEY => 'BasicLine',
    			self::TRUNCATE_KEY => 6,
    			self::WIDTH_KEY => 1044,
    			self::HEIGHT_KEY => 290,
    		),
    		Piwik_ImageGraph_StaticGraph::GRAPH_TYPE_VERTICAL_BAR => array(
    			self::FILENAME_KEY => 'BasicBar',
    			self::TRUNCATE_KEY => 6,
    			self::WIDTH_KEY => 1044,
    			self::HEIGHT_KEY => 290,
    		),
    		Piwik_ImageGraph_StaticGraph::GRAPH_TYPE_HORIZONTAL_BAR => array(
    			self::FILENAME_KEY => 'HorizontalBar',
    			self::TRUNCATE_KEY => null, // horizontal bar graphs are dynamically truncated
    			self::WIDTH_KEY => 800,
    			self::HEIGHT_KEY => 290,
    		),
    		Piwik_ImageGraph_StaticGraph::GRAPH_TYPE_3D_PIE => array(
    			self::FILENAME_KEY => '3DPie',
    			self::TRUNCATE_KEY => 5,
    			self::WIDTH_KEY => 1044,
    			self::HEIGHT_KEY => 290,
    		),
    		Piwik_ImageGraph_StaticGraph::GRAPH_TYPE_BASIC_PIE => array(
    			self::FILENAME_KEY => 'BasicPie',
    			self::TRUNCATE_KEY => 5,
    			self::WIDTH_KEY => 1044,
    			self::HEIGHT_KEY => 290,
    		),
    	);
    
    	static private $DEFAULT_GRAPH_TYPE_OVERRIDE = array(
    
    JulienMoumne's avatar
    JulienMoumne a validé
    		'UserSettings_getPlugin' => array(
    			false // override if !$isMultiplePeriod
    				=> Piwik_ImageGraph_StaticGraph::GRAPH_TYPE_HORIZONTAL_BAR,
    		),
    		'Referers_getRefererType' => array(
    			false // override if !$isMultiplePeriod
    				=> Piwik_ImageGraph_StaticGraph::GRAPH_TYPE_HORIZONTAL_BAR,
    		),
    
    	);
    
    	const GRAPH_OUTPUT_INLINE = 0;
    	const GRAPH_OUTPUT_FILE = 1;
    	const GRAPH_OUTPUT_PHP = 2;
    
    	const DEFAULT_ORDINATE_METRIC = 'nb_visits';
    	const FONT_DIR = '/plugins/ImageGraph/fonts/';
    	const DEFAULT_FONT = 'tahoma.ttf';
    	const UNICODE_FONT = 'unifont.ttf';
    	const DEFAULT_FONT_SIZE = 9;
    
    
    JulienMoumne's avatar
    JulienMoumne a validé
    	// number of row evolutions to plot when no labels are specified, can be overridden using &filter_limit
    	const DEFAULT_NB_ROW_EVOLUTIONS = 5;
    	const MAX_NB_ROW_LABELS = 10;
    
    
    mattpiwik's avatar
    mattpiwik a validé
    	static private $instance = null;
    
    	/**
    	 * @return Piwik_ImageGraph_API
    	 */
    	static public function getInstance()
    	{
    		if (self::$instance == null)
    
    mattpiwik's avatar
    mattpiwik a validé
    			$c = __CLASS__;
    			self::$instance = new $c();
    		}
    		return self::$instance;
    	}
    
    	public function get($idSite, $period, $date, $apiModule, $apiAction, $graphType = false,
    
    JulienMoumne's avatar
    JulienMoumne a validé
    						$outputType = Piwik_ImageGraph_API::GRAPH_OUTPUT_INLINE, $columns = false, $labels = false, $showLegend = true,
    
    mattpiwik's avatar
    mattpiwik a validé
    						$width = false, $height = false, $fontSize = Piwik_ImageGraph_API::DEFAULT_FONT_SIZE, $aliasedGraph = true,
    
    						$idGoal = false, $colors = false, $idSubtable = false)
    
    mattpiwik's avatar
    mattpiwik a validé
    	{
    
    JulienMoumne's avatar
    JulienMoumne a validé
    		Piwik::checkUserHasViewAccess($idSite);
    
    
    mattpiwik's avatar
    mattpiwik a validé
    		// Health check - should we also test for GD2 only?
    
    mattpiwik's avatar
    mattpiwik a validé
    		if(!Piwik::isGdExtensionEnabled())
    
    mattpiwik's avatar
    mattpiwik a validé
    		{
    
    			throw new Exception('Error: To create graphs in Piwik, please enable GD php extension (with Freetype support) in php.ini, and restart your web server.');
    
    mattpiwik's avatar
    mattpiwik a validé
    		}
    
    mattpiwik's avatar
    mattpiwik a validé
    		$useUnicodeFont = array(
    
    mattpiwik's avatar
    mattpiwik a validé
    			'am', 'ar', 'el', 'fa' , 'fi', 'he', 'ja', 'ka', 'ko', 'te', 'th', 'zh-cn', 'zh-tw',
    
    mattpiwik's avatar
    mattpiwik a validé
    		);
    
    mattpiwik's avatar
    mattpiwik a validé
    		$languageLoaded = Piwik_Translate::getInstance()->getLanguageLoaded();
    
    mattpiwik's avatar
    mattpiwik a validé
    		$font = self::getFontPath(self::DEFAULT_FONT);
    		if(in_array($languageLoaded, $useUnicodeFont))
    		{
    			$unicodeFontPath = self::getFontPath(self::UNICODE_FONT);
    			$font = file_exists($unicodeFontPath) ? $unicodeFontPath : $font;
    		}
    
    		// save original GET to reset after processing. Important for API-in-API-call
    		$savedGET = $_GET;
    
    
    mattpiwik's avatar
    mattpiwik a validé
    		try
    		{
    
    mattpiwik's avatar
    mattpiwik a validé
    			$apiParameters = array();
    			if(!empty($idGoal)) {
    				$apiParameters = array( 'idGoal' => $idGoal);
    			}
    			// Fetch the metadata for given api-action
    
    			$metadata = Piwik_API_API::getInstance()->getMetadata(
    				$idSite, $apiModule, $apiAction, $apiParameters, $languageLoaded, $period, $date,
    				$hideMetricsDoc = false, $showSubtableReports = true);
    
    mattpiwik's avatar
    mattpiwik a validé
    			{
    
    				throw new Exception('Invalid API Module and/or API Action');
    
    mattpiwik's avatar
    mattpiwik a validé
    			}
    
    
    			$metadata = $metadata[0];
    			$reportHasDimension = !empty($metadata['dimension']);
    			$constantRowsCount = !empty($metadata['constantRowsCount']);
    
    
    JulienMoumne's avatar
    JulienMoumne a validé
    			$isMultiplePeriod = Piwik_Archive::isMultiplePeriod($date, $period);
    
    JulienMoumne's avatar
    JulienMoumne a validé
    			if(!$reportHasDimension && !$isMultiplePeriod)
    
    JulienMoumne's avatar
    JulienMoumne a validé
    			{
    				throw new Exception('The graph cannot be drawn for this combination of \'date\' and \'period\' parameters.');
    			}
    
    
    mattpiwik's avatar
    mattpiwik a validé
    			{
    
    JulienMoumne's avatar
    JulienMoumne a validé
    				if($isMultiplePeriod)
    				{
    					$graphType = Piwik_ImageGraph_StaticGraph::GRAPH_TYPE_BASIC_LINE;
    				}
    				else
    
    mattpiwik's avatar
    mattpiwik a validé
    				{
    
    mattpiwik's avatar
    mattpiwik a validé
    					{
    
    						$graphType = Piwik_ImageGraph_StaticGraph::GRAPH_TYPE_VERTICAL_BAR;
    
    mattpiwik's avatar
    mattpiwik a validé
    					}
    					else
    					{
    
    						$graphType = Piwik_ImageGraph_StaticGraph::GRAPH_TYPE_HORIZONTAL_BAR;
    
    mattpiwik's avatar
    mattpiwik a validé
    					}
    				}
    
    
    				$reportUniqueId = $metadata['uniqueId'];
    
    JulienMoumne's avatar
    JulienMoumne a validé
    				if(isset(self::$DEFAULT_GRAPH_TYPE_OVERRIDE[$reportUniqueId][$isMultiplePeriod]))
    
    JulienMoumne's avatar
    JulienMoumne a validé
    					$graphType = self::$DEFAULT_GRAPH_TYPE_OVERRIDE[$reportUniqueId][$isMultiplePeriod];
    
    mattpiwik's avatar
    mattpiwik a validé
    			}
    
    mattpiwik's avatar
    mattpiwik a validé
    			{
    
    				$availableGraphTypes = Piwik_ImageGraph_StaticGraph::getAvailableStaticGraphTypes();
    				if (!in_array($graphType, $availableGraphTypes))
    				{
    					throw new Exception(
    						Piwik_TranslateException(
    							'General_ExceptionInvalidStaticGraphType',
    							array($graphType, implode(', ', $availableGraphTypes))
    						)
    					);
    				}
    
    mattpiwik's avatar
    mattpiwik a validé
    			}
    
    mattpiwik's avatar
    mattpiwik a validé
    			$width = (int)$width;
    			$height = (int)$height;
    
    mattpiwik's avatar
    mattpiwik a validé
    			{
    
    				$width = self::$DEFAULT_PARAMETERS[$graphType][self::WIDTH_KEY];
    
    mattpiwik's avatar
    mattpiwik a validé
    			}
    
    mattpiwik's avatar
    mattpiwik a validé
    			{
    
    				$height = self::$DEFAULT_PARAMETERS[$graphType][self::HEIGHT_KEY];
    
    mattpiwik's avatar
    mattpiwik a validé
    			}
    
    JulienMoumne's avatar
    JulienMoumne a validé
    
    
    			// Cap width and height to a safe amount
    			$width = min($width, self::MAX_WIDTH);
    			$height = min($height, self::MAX_HEIGHT);
    
    
    			$reportColumns = array_merge(
    				!empty($metadata['metrics']) ? $metadata['metrics'] : array(),
    				!empty($metadata['processedMetrics']) ? $metadata['processedMetrics'] : array(),
    				!empty($metadata['metricsGoal']) ? $metadata['metricsGoal'] : array(),
    				!empty($metadata['processedMetricsGoal']) ? $metadata['processedMetricsGoal'] : array()
    			);
    
    
    JulienMoumne's avatar
    JulienMoumne a validé
    			$ordinateColumns = array();
    			if(empty($columns))
    
    mattpiwik's avatar
    mattpiwik a validé
    			{
    
    JulienMoumne's avatar
    JulienMoumne a validé
    				$ordinateColumns[] =
    					empty($reportColumns[self::DEFAULT_ORDINATE_METRIC]) ? key($metadata['metrics']) : self::DEFAULT_ORDINATE_METRIC;
    			}
    			else
    			{
    				$ordinateColumns = explode(',', $columns);
    				foreach($ordinateColumns as $column)
    
    mattpiwik's avatar
    mattpiwik a validé
    				{
    
    JulienMoumne's avatar
    JulienMoumne a validé
    					if(empty($reportColumns[$column]))
    					{
    
    JulienMoumne's avatar
     
    JulienMoumne a validé
    						throw new Exception(
    							Piwik_Translate(
    								'ImageGraph_ColumnOrdinateMissing',
    								array($column, implode(',',array_keys($reportColumns)))
    							)
    						);
    
    JulienMoumne's avatar
    JulienMoumne a validé
    					}
    
    mattpiwik's avatar
    mattpiwik a validé
    				}
    			}
    
    JulienMoumne's avatar
    JulienMoumne a validé
    
    			$ordinateLabels = array();
    			foreach($ordinateColumns as $column)
    
    JulienMoumne's avatar
    JulienMoumne a validé
    				$ordinateLabels[$column] = $reportColumns[$column];
    
    
    			// sort and truncate filters
    			$defaultFilterTruncate = self::$DEFAULT_PARAMETERS[$graphType][self::TRUNCATE_KEY];
    			switch($graphType)
    
    mattpiwik's avatar
    mattpiwik a validé
    			{
    
    				case Piwik_ImageGraph_StaticGraph::GRAPH_TYPE_3D_PIE:
    				case Piwik_ImageGraph_StaticGraph::GRAPH_TYPE_BASIC_PIE:
    
    
    JulienMoumne's avatar
    JulienMoumne a validé
    					if(count($ordinateColumns) > 1)
    					{
    						// pChart doesn't support multiple series on pie charts
    		            	throw new Exception("Pie charts do not currently support multiple series");
    					}
    
    					$_GET['filter_sort_column'] = reset($ordinateColumns);
    
    					$this->setFilterTruncate($defaultFilterTruncate);
    					break;
    
    				case Piwik_ImageGraph_StaticGraph::GRAPH_TYPE_VERTICAL_BAR:
    				case Piwik_ImageGraph_StaticGraph::GRAPH_TYPE_BASIC_LINE:
    
    
    JulienMoumne's avatar
    JulienMoumne a validé
    					if(!$isMultiplePeriod && !$constantRowsCount)
    
    					{
    						$this->setFilterTruncate($defaultFilterTruncate);
    					}
    					break;
    			}
    
    
    JulienMoumne's avatar
    JulienMoumne a validé
    			$ordinateLogos = array();
    
    
    JulienMoumne's avatar
    JulienMoumne a validé
    			// row evolutions
    			if($isMultiplePeriod && $reportHasDimension)
    			{
    				$plottedMetric = reset($ordinateColumns);
    
    				// when no labels are specified, getRowEvolution returns the top N=filter_limit row evolutions
    				// rows are sorted using filter_sort_column (see Piwik_API_DataTableGenericFilter for more info)
    				if(!$labels)
    				{
    					$savedFilterSortColumnValue = Piwik_Common::getRequestVar('filter_sort_column', '');
    					$_GET['filter_sort_column'] = $plottedMetric;
    
    					$savedFilterLimitValue = Piwik_Common::getRequestVar('filter_limit', -1, 'int');
    					if($savedFilterLimitValue == -1 || $savedFilterLimitValue > self::MAX_NB_ROW_LABELS)
    					{
    						$_GET['filter_limit'] = self::DEFAULT_NB_ROW_EVOLUTIONS;
    					}
    				}
    
    				$processedReport = Piwik_API_API::getInstance()->getRowEvolution(
    					$idSite,
    					$period,
    					$date,
    					$apiModule,
    					$apiAction,
    					$labels,
    					$segment = false,
    					$plottedMetric,
    					$languageLoaded,
    					$idGoal,
    					$plottedMetric
    				);
    
    
    JulienMoumne's avatar
     
    JulienMoumne a validé
    				//@review this test will need to be updated after evaluating the @review comment in API/API.php
    				if(!$processedReport)
    				{
    					throw new Exception(Piwik_Translate('General_NoDataForGraph'));
    				}
    
    
    JulienMoumne's avatar
    JulienMoumne a validé
    				// restoring generic filter parameters
    				if(!$labels)
    				{
    					$_GET['filter_sort_column'] = $savedFilterSortColumnValue;
    					if($savedFilterLimitValue != -1)
    					{
    						$_GET['filter_limit'] = $savedFilterLimitValue;
    					}
    				}
    
    				// retrieve metric names & labels
    				$metrics = $processedReport['metadata']['metrics'];
    				$ordinateLabels = array();
    
    				// getRowEvolution returned more than one label
    				if(!array_key_exists($plottedMetric, $metrics))
    				{
    					$ordinateColumns = array();
    					$i = 0;
    					foreach($metrics as $metric => $info)
    					{
    						$ordinateColumn = $plottedMetric . '_' . $i++;
    						$ordinateColumns[] = $metric;
    						$ordinateLabels[$ordinateColumn] = $info['name'];
    
    JulienMoumne's avatar
    JulienMoumne a validé
    
    						if(isset($info['logo']))
    						{
    							$ordinateLogo = $info['logo'];
    
    							// @review pChart does not support gifs in graph legends, would it be possible to convert all plugin pictures (cookie.gif, flash.gif, ..) to png files?
    							if(!strstr($ordinateLogo, '.gif'))
    							{
    
    JulienMoumne's avatar
    JulienMoumne a validé
    								$absoluteLogoPath = self::getAbsoluteLogoPath($ordinateLogo);
    								if(file_exists($absoluteLogoPath))
    								{
    									$ordinateLogos[$ordinateColumn] = $absoluteLogoPath;
    								}
    
    JulienMoumne's avatar
    JulienMoumne a validé
    					}
    				}
    				else
    				{
    					$ordinateLabels[$plottedMetric] = $processedReport['label'] . ' (' . $metrics[$plottedMetric]['name'] . ')';
    				}
    			}
    			else
    			{
    				$processedReport = Piwik_API_API::getInstance()->getProcessedReport(
    					$idSite,
    					$period,
    					$date,
    					$apiModule,
    					$apiAction,
    					$segment = false,
    					$apiParameters = false,
    					$idGoal,
    					$languageLoaded,
    					$showTimer = true,
    					$hideMetricsDoc = false,
    					$idSubtable
    				);
    			}
    
    			// prepare abscissa and ordinate series
    
    JulienMoumne's avatar
    JulienMoumne a validé
    			$abscissaSeries = array();
    
    JulienMoumne's avatar
    JulienMoumne a validé
    			$abscissaLogos = array();
    
    JulienMoumne's avatar
    JulienMoumne a validé
    			$ordinateSeries = array();
    
    			$reportData = $processedReport['reportData'];
    
    JulienMoumne's avatar
    JulienMoumne a validé
    			$hasData = false;
    
    JulienMoumne's avatar
    JulienMoumne a validé
    			$hasNonZeroValue = false;
    
    JulienMoumne's avatar
    JulienMoumne a validé
    			if(!$isMultiplePeriod)
    
    			{
    				$reportMetadata = $processedReport['reportMetadata']->getRows();
    
    				$i = 0;
    
    JulienMoumne's avatar
    JulienMoumne a validé
    				// $reportData instanceof Piwik_DataTable
    
    				foreach($reportData->getRows() as $row) // Piwik_DataTable_Row[]
    
    mattpiwik's avatar
    mattpiwik a validé
    				{
    
    					// $row instanceof Piwik_DataTable_Row
    					$rowData = $row->getColumns(); // Associative Array
    
    JulienMoumne's avatar
    JulienMoumne a validé
    					$abscissaSeries[] = Piwik_Common::unsanitizeInputValue($rowData['label']);
    
    JulienMoumne's avatar
    JulienMoumne a validé
    
    
    JulienMoumne's avatar
    JulienMoumne a validé
    					foreach($ordinateColumns as $column)
    
    JulienMoumne's avatar
    JulienMoumne a validé
    					{
    
    JulienMoumne's avatar
    JulienMoumne a validé
    						$parsedOrdinateValue = $this->parseOrdinateValue($rowData[$column]);
    						$hasData = true;
    
    JulienMoumne's avatar
    JulienMoumne a validé
    
    
    JulienMoumne's avatar
    JulienMoumne a validé
    						if($parsedOrdinateValue != 0)
    						{
    							$hasNonZeroValue = true;
    						}
    						$ordinateSeries[$column][] = $parsedOrdinateValue;
    					}
    
    JulienMoumne's avatar
    JulienMoumne a validé
    
    
    mattpiwik's avatar
    mattpiwik a validé
    					{
    
    						$rowMetadata = $reportMetadata[$i]->getColumns();
    						if(isset($rowMetadata['logo']))
    
    mattpiwik's avatar
    mattpiwik a validé
    						{
    
    JulienMoumne's avatar
    JulienMoumne a validé
    							$absoluteLogoPath = self::getAbsoluteLogoPath($rowMetadata['logo']);
    							if(file_exists($absoluteLogoPath))
    							{
    								$abscissaLogos[$i] = $absoluteLogoPath;
    							}
    
    mattpiwik's avatar
    mattpiwik a validé
    						}
    					}
    
    mattpiwik's avatar
    mattpiwik a validé
    				}
    			}
    
    JulienMoumne's avatar
    JulienMoumne a validé
    			else // if the report has no dimension we have multiple reports each with only one row within the reportData
    
    mattpiwik's avatar
    mattpiwik a validé
    			{
    
    JulienMoumne's avatar
    JulienMoumne a validé
    				// $reportData instanceof Piwik_DataTable_Array
    				$periodsMetadata = array_values($reportData->metadata);
    
    				// $periodsData instanceof Piwik_DataTable_Simple[]
    				$periodsData = array_values($reportData->getArray());
    				$periodsCount = count($periodsMetadata);
    
    				for ($i = 0 ; $i < $periodsCount ; $i++)
    
    mattpiwik's avatar
    mattpiwik a validé
    				{
    
    JulienMoumne's avatar
    JulienMoumne a validé
    					// $periodsData[$i] instanceof Piwik_DataTable_Simple
    					// $rows instanceof Piwik_DataTable_Row[]
    					$rows = $periodsData[$i]->getRows();
    
    JulienMoumne's avatar
    JulienMoumne a validé
    					if(array_key_exists(0, $rows))
    					{
    						$rowData = $rows[0]->getColumns(); // associative Array
    
    JulienMoumne's avatar
    JulienMoumne a validé
    
    
    JulienMoumne's avatar
    JulienMoumne a validé
    						foreach($ordinateColumns as $column)
    
    JulienMoumne's avatar
    JulienMoumne a validé
    						{
    
    JulienMoumne's avatar
    JulienMoumne a validé
    							$ordinateValue = $rowData[$column];
    							$parsedOrdinateValue = $this->parseOrdinateValue($ordinateValue);
    
    							$hasData = true;
    
    							if(!empty($parsedOrdinateValue))
    							{
    								$hasNonZeroValue = true;
    							}
    
    							$ordinateSeries[$column][] = $parsedOrdinateValue;
    
    JulienMoumne's avatar
    JulienMoumne a validé
    						}
    
    JulienMoumne's avatar
    JulienMoumne a validé
    
    
    JulienMoumne's avatar
    JulienMoumne a validé
    					}
    					else
    					{
    
    JulienMoumne's avatar
    JulienMoumne a validé
    						foreach($ordinateColumns as $column)
    						{
    							$ordinateSeries[$column][] = 0;
    						}
    
    JulienMoumne's avatar
    JulienMoumne a validé
    					}
    
    					$rowId = $periodsMetadata[$i]['period']->getLocalizedShortString();
    
    JulienMoumne's avatar
    JulienMoumne a validé
    					$abscissaSeries[] = Piwik_Common::unsanitizeInputValue($rowId);
    
    mattpiwik's avatar
    mattpiwik a validé
    				}
    			}
    
    JulienMoumne's avatar
    JulienMoumne a validé
    
    
    JulienMoumne's avatar
    JulienMoumne a validé
    			if(!$hasData || !$hasNonZeroValue)
    
    mattpiwik's avatar
    mattpiwik a validé
    			{
    
    				throw new Exception(Piwik_Translate('General_NoDataForGraph'));
    
    mattpiwik's avatar
    mattpiwik a validé
    			}
    
    mattpiwik's avatar
    mattpiwik a validé
    			//Setup the graph
    
    			$graph = Piwik_ImageGraph_StaticGraph::factory($graphType);
    			$graph->setWidth($width);
    			$graph->setHeight($height);
    			$graph->setFont($font);
    			$graph->setFontSize($fontSize);
    
    JulienMoumne's avatar
    JulienMoumne a validé
    			$graph->setOrdinateLabels($ordinateLabels);
    			$graph->setShowLegend($showLegend);
    
    			$graph->setAliasedGraph($aliasedGraph);
    
    JulienMoumne's avatar
    JulienMoumne a validé
    			$graph->setAbscissaSeries($abscissaSeries);
    
    JulienMoumne's avatar
    JulienMoumne a validé
    			$graph->setAbscissaLogos($abscissaLogos);
    
    JulienMoumne's avatar
    JulienMoumne a validé
    			$graph->setOrdinateSeries($ordinateSeries);
    
    			$graph->setOrdinateLogos($ordinateLogos);
    			$graph->setColors(!empty($colors) ? explode(',', $colors) : array());
    
    JulienMoumne's avatar
    JulienMoumne a validé
    			if($period == 'day')
    			{
    				$graph->setForceSkippedLabels(6);
    			}
    
    mattpiwik's avatar
    mattpiwik a validé
    		} catch (Exception $e) {
    
    
    			$graph = new Piwik_ImageGraph_StaticGraph_Exception();
    
    JulienMoumne's avatar
    JulienMoumne a validé
    			$graph->setWidth($width);
    			$graph->setHeight($height);
    
    			$graph->setFont($font);
    			$graph->setFontSize($fontSize);
    			$graph->setException($e);
    			$graph->renderGraph();
    
    mattpiwik's avatar
    mattpiwik a validé
    		}
    
    mattpiwik's avatar
    mattpiwik a validé
    		switch($outputType)
    		{
    			case self::GRAPH_OUTPUT_FILE:
    
    JulienMoumne's avatar
    JulienMoumne a validé
    				if($idGoal != '')
    				{
    					$idGoal = '_' . $idGoal;
    				}
    
    JulienMoumne's avatar
    JulienMoumne a validé
    				$fileName = self::$DEFAULT_PARAMETERS[$graphType][self::FILENAME_KEY] . '_' . $apiModule . '_' . $apiAction . $idGoal . ' ' . str_replace(',', '-', $date) . ' ' . $idSite . '.png';
    
    				$fileName = str_replace(array(' ','/'), '_', $fileName);
    
    
    mattpiwik's avatar
    mattpiwik a validé
    				if(!Piwik_Common::isValidFilename($fileName))
    				{
    
    					throw new Exception('Error: Image graph filename ' . $fileName . ' is not valid.');
    
    mattpiwik's avatar
    mattpiwik a validé
    				}
    
    JulienMoumne's avatar
    JulienMoumne a validé
    
    			case self::GRAPH_OUTPUT_PHP:
    
    				return $graph->getRenderedImage();
    
    JulienMoumne's avatar
    JulienMoumne a validé
    
    
    mattpiwik's avatar
    mattpiwik a validé
    			case self::GRAPH_OUTPUT_INLINE:
    			default:
    
    mattpiwik's avatar
    mattpiwik a validé
    				exit;
    
    mattpiwik's avatar
    mattpiwik a validé
    		}
    	}
    
    
    	private function setFilterTruncate($default)
    
    		$_GET['filter_truncate'] = Piwik_Common::getRequestVar('filter_truncate', $default, 'int');
    
    	private static function parseOrdinateValue($ordinateValue)
    
    mattpiwik's avatar
    mattpiwik a validé
    	{
    
    		$ordinateValue = @str_replace(',', '.', $ordinateValue);
    
    		// convert hh:mm:ss formatted time values to number of seconds
    		if(preg_match('/([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})/', $ordinateValue, $matches))
    
    mattpiwik's avatar
    mattpiwik a validé
    		{
    
    			$hour = $matches[1];
    			$min = $matches[2];
    			$sec = $matches[3];
    
    			$ordinateValue = ($hour * 3600) + ($min * 60) + $sec;
    
    mattpiwik's avatar
    mattpiwik a validé
    		}
    
    		// OK, only numbers from here please (strip out currency sign)
    		$ordinateValue = preg_replace('/[^0-9.]/', '', $ordinateValue);
    
    mattpiwik's avatar
    mattpiwik a validé
    	}
    
    
    	private static function getFontPath($font)
    	{
    		return PIWIK_INCLUDE_PATH . self::FONT_DIR . $font;
    	}
    
    JulienMoumne's avatar
    JulienMoumne a validé
    
    	protected static function getAbsoluteLogoPath($relativeLogoPath)
    	{
    		return PIWIK_INCLUDE_PATH . '/' . $relativeLogoPath;
    	}