diff options
Diffstat (limited to 'plugins/ImageGraph/StaticGraph.php')
-rw-r--r-- | plugins/ImageGraph/StaticGraph.php | 598 |
1 files changed, 289 insertions, 309 deletions
diff --git a/plugins/ImageGraph/StaticGraph.php b/plugins/ImageGraph/StaticGraph.php index afb8993db8..2d3ee04685 100644 --- a/plugins/ImageGraph/StaticGraph.php +++ b/plugins/ImageGraph/StaticGraph.php @@ -1,10 +1,10 @@ <?php /** * Piwik - Open source web analytics - * + * * @link http://piwik.org * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - * + * * @category Piwik_Plugins * @package Piwik_ImageGraph */ @@ -21,311 +21,291 @@ require_once PIWIK_INCLUDE_PATH . "/libs/pChart2.1.3/class/pData.class.php"; */ abstract class Piwik_ImageGraph_StaticGraph { - const GRAPH_TYPE_BASIC_LINE = "evolution"; - const GRAPH_TYPE_VERTICAL_BAR = "verticalBar"; - const GRAPH_TYPE_HORIZONTAL_BAR = "horizontalBar"; - const GRAPH_TYPE_3D_PIE = "3dPie"; - const GRAPH_TYPE_BASIC_PIE = "pie"; - - static private $availableStaticGraphTypes = array( - self::GRAPH_TYPE_BASIC_LINE => 'Piwik_ImageGraph_StaticGraph_Evolution', - self::GRAPH_TYPE_VERTICAL_BAR => 'Piwik_ImageGraph_StaticGraph_VerticalBar', - self::GRAPH_TYPE_HORIZONTAL_BAR => 'Piwik_ImageGraph_StaticGraph_HorizontalBar', - self::GRAPH_TYPE_BASIC_PIE => 'Piwik_ImageGraph_StaticGraph_Pie', - self::GRAPH_TYPE_3D_PIE => 'Piwik_ImageGraph_StaticGraph_3DPie', - ); - - const ABSCISSA_SERIE_NAME = 'ABSCISSA'; - - private $aliasedGraph; - - /** - * @var pImage - */ - protected $pImage; - protected $pData; - protected $ordinateLabels; - protected $showLegend; - protected $abscissaSeries; - protected $abscissaLogos; - protected $ordinateSeries; - protected $ordinateLogos; - protected $colors; - protected $font; - protected $fontSize; - protected $legendFontSize; - protected $width; - protected $height; - protected $forceSkippedLabels = false; - - abstract protected function getDefaultColors(); - - abstract public function renderGraph(); - - /** - * Return the StaticGraph according to the static graph type $graphType - * - * @throws exception If the static graph type is unknown - * @param string $graphType - * @return Piwik_ImageGraph_StaticGraph - */ - public static function factory($graphType) - { - if (isset(self::$availableStaticGraphTypes[$graphType])) - { - - $className = self::$availableStaticGraphTypes[$graphType]; - Piwik_Loader::loadClass($className); - return new $className; - } - else - { - throw new Exception( - Piwik_TranslateException( - 'General_ExceptionInvalidStaticGraphType', - array($graphType, implode(', ', self::getAvailableStaticGraphTypes())) - ) - ); - } - } - - public static function getAvailableStaticGraphTypes() - { - return array_keys(self::$availableStaticGraphTypes); - } - - /** - * Save rendering to disk - * - * @param string $filename without path - * @return string path of file - */ - public function sendToDisk($filename) - { - $filePath = self::getOutputPath($filename); - $this->pImage->Render($filePath); - return $filePath; - } - - /** - * @return rendered static graph - */ - public function getRenderedImage() - { - return $this->pImage->Picture; - } - - /** - * Output rendering to browser - */ - public function sendToBrowser() - { - $this->pImage->stroke(); - } - - public function setWidth($width) - { - $this->width = $width; - } - - public function setHeight($height) - { - $this->height = $height; - } - - public function setFontSize($fontSize) - { - if(!is_numeric($fontSize)) - { - $fontSize = Piwik_ImageGraph_API::DEFAULT_FONT_SIZE; - } - $this->fontSize = $fontSize; - } - - public function setLegendFontSize($legendFontSize) - { - $this->legendFontSize = $legendFontSize; - } - - public function setFont($font) - { - $this->font = $font; - } - - public function setOrdinateSeries($ordinateSeries) - { - $this->ordinateSeries = $ordinateSeries; - } - - public function setOrdinateLogos($ordinateLogos) - { - $this->ordinateLogos = $ordinateLogos; - } - - public function setAbscissaLogos($abscissaLogos) - { - $this->abscissaLogos = $abscissaLogos; - } - - public function setAbscissaSeries($abscissaSeries) - { - $this->abscissaSeries = $abscissaSeries; - } - - public function setShowLegend($showLegend) - { - $this->showLegend = $showLegend; - } - - public function setForceSkippedLabels($forceSkippedLabels) - { - $this->forceSkippedLabels = $forceSkippedLabels; - } - - public function setOrdinateLabels($ordinateLabels) - { - $this->ordinateLabels = $ordinateLabels; - } - - public function setAliasedGraph($aliasedGraph) - { - $this->aliasedGraph = $aliasedGraph; - } - - public function setColors($colors) - { - $i = 0; - foreach($this->getDefaultColors() as $colorKey => $defaultColor) - { - if(isset($colors[$i]) && $this->hex2rgb($colors[$i])) - { - $hexColor = $colors[$i]; - } - else - { - $hexColor = $defaultColor; - } - - $this->colors[$colorKey] = $this->hex2rgb($hexColor); - $i++; - } - } - - /** - * Return $filename with temp directory and delete file - * - * @static - * @param $filename - * @return string path of file in temp directory - */ - protected static function getOutputPath($filename) - { - $outputFilename = PIWIK_USER_PATH . '/tmp/assets/' . $filename; - @chmod($outputFilename, 0600); - @unlink($outputFilename); - return $outputFilename; - } - - protected function initpData() - { - $this->pData = new pData(); - - foreach($this->ordinateSeries as $column => $data) - { - $this->pData->addPoints($data, $column); - $this->pData->setSerieDescription($column,$this->ordinateLabels[$column]); - if(isset($this->ordinateLogos[$column])) - { - $ordinateLogo = $this->ordinateLogos[$column]; - $this->pData->setSeriePicture($column, $ordinateLogo); - } - } - - $this->pData->addPoints($this->abscissaSeries, self::ABSCISSA_SERIE_NAME); - $this->pData->setAbscissa(self::ABSCISSA_SERIE_NAME); - } - - protected function initpImage() - { - $this->pImage = new pImage($this->width, $this->height, $this->pData); - $this->pImage->Antialias = $this->aliasedGraph; - - $this->pImage->setFontProperties( - array( - "FontName" => $this->font, - "FontSize" => $this->fontSize - ) - ); - } - - protected function getTextWidthHeight($text, $fontSize = false) - { - if(!$fontSize) - { - $fontSize = $this->fontSize; - } - - if(!$this->pImage) - { - $this->initpImage(); - } - - // could not find a way to get pixel perfect width & height info using imageftbbox - $textInfo = $this->pImage->drawText( - 0, 0, $text, - array( - 'Alpha'=>0, - 'FontSize'=>$fontSize, - 'FontName' => $this->font - ) - ); - - return array($textInfo[1]["X"] + 1, $textInfo[0]["Y"]-$textInfo[2]["Y"]); - } - - protected function getMaximumTextWidthHeight($values) - { - if(array_values($values) === $values) - { - $values = array('' => $values); - } - - $maxWidth = 0; - $maxHeight = 0; - foreach($values as $column => $data) - { - foreach($data as $value) - { - list($valueWidth, $valueHeight) = $this->getTextWidthHeight($value); - - if($valueWidth > $maxWidth) - { - $maxWidth = $valueWidth; - } - - if($valueHeight > $maxHeight) - { - $maxHeight = $valueHeight; - } - } - } - - return array($maxWidth, $maxHeight); - } - - private static function hex2rgb($hexColor) - { - if(preg_match('/([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/', $hexColor, $matches)) - { - return array( - 'R' => hexdec($matches[1]), - 'G' => hexdec($matches[2]), - 'B' => hexdec($matches[3]) - ); - } - else - { - return false; - } - } + const GRAPH_TYPE_BASIC_LINE = "evolution"; + const GRAPH_TYPE_VERTICAL_BAR = "verticalBar"; + const GRAPH_TYPE_HORIZONTAL_BAR = "horizontalBar"; + const GRAPH_TYPE_3D_PIE = "3dPie"; + const GRAPH_TYPE_BASIC_PIE = "pie"; + + static private $availableStaticGraphTypes = array( + self::GRAPH_TYPE_BASIC_LINE => 'Piwik_ImageGraph_StaticGraph_Evolution', + self::GRAPH_TYPE_VERTICAL_BAR => 'Piwik_ImageGraph_StaticGraph_VerticalBar', + self::GRAPH_TYPE_HORIZONTAL_BAR => 'Piwik_ImageGraph_StaticGraph_HorizontalBar', + self::GRAPH_TYPE_BASIC_PIE => 'Piwik_ImageGraph_StaticGraph_Pie', + self::GRAPH_TYPE_3D_PIE => 'Piwik_ImageGraph_StaticGraph_3DPie', + ); + + const ABSCISSA_SERIE_NAME = 'ABSCISSA'; + + private $aliasedGraph; + + /** + * @var pImage + */ + protected $pImage; + protected $pData; + protected $ordinateLabels; + protected $showLegend; + protected $abscissaSeries; + protected $abscissaLogos; + protected $ordinateSeries; + protected $ordinateLogos; + protected $colors; + protected $font; + protected $fontSize; + protected $legendFontSize; + protected $width; + protected $height; + protected $forceSkippedLabels = false; + + abstract protected function getDefaultColors(); + + abstract public function renderGraph(); + + /** + * Return the StaticGraph according to the static graph type $graphType + * + * @throws exception If the static graph type is unknown + * @param string $graphType + * @return Piwik_ImageGraph_StaticGraph + */ + public static function factory($graphType) + { + if (isset(self::$availableStaticGraphTypes[$graphType])) { + + $className = self::$availableStaticGraphTypes[$graphType]; + Piwik_Loader::loadClass($className); + return new $className; + } else { + throw new Exception( + Piwik_TranslateException( + 'General_ExceptionInvalidStaticGraphType', + array($graphType, implode(', ', self::getAvailableStaticGraphTypes())) + ) + ); + } + } + + public static function getAvailableStaticGraphTypes() + { + return array_keys(self::$availableStaticGraphTypes); + } + + /** + * Save rendering to disk + * + * @param string $filename without path + * @return string path of file + */ + public function sendToDisk($filename) + { + $filePath = self::getOutputPath($filename); + $this->pImage->Render($filePath); + return $filePath; + } + + /** + * @return rendered static graph + */ + public function getRenderedImage() + { + return $this->pImage->Picture; + } + + /** + * Output rendering to browser + */ + public function sendToBrowser() + { + $this->pImage->stroke(); + } + + public function setWidth($width) + { + $this->width = $width; + } + + public function setHeight($height) + { + $this->height = $height; + } + + public function setFontSize($fontSize) + { + if (!is_numeric($fontSize)) { + $fontSize = Piwik_ImageGraph_API::DEFAULT_FONT_SIZE; + } + $this->fontSize = $fontSize; + } + + public function setLegendFontSize($legendFontSize) + { + $this->legendFontSize = $legendFontSize; + } + + public function setFont($font) + { + $this->font = $font; + } + + public function setOrdinateSeries($ordinateSeries) + { + $this->ordinateSeries = $ordinateSeries; + } + + public function setOrdinateLogos($ordinateLogos) + { + $this->ordinateLogos = $ordinateLogos; + } + + public function setAbscissaLogos($abscissaLogos) + { + $this->abscissaLogos = $abscissaLogos; + } + + public function setAbscissaSeries($abscissaSeries) + { + $this->abscissaSeries = $abscissaSeries; + } + + public function setShowLegend($showLegend) + { + $this->showLegend = $showLegend; + } + + public function setForceSkippedLabels($forceSkippedLabels) + { + $this->forceSkippedLabels = $forceSkippedLabels; + } + + public function setOrdinateLabels($ordinateLabels) + { + $this->ordinateLabels = $ordinateLabels; + } + + public function setAliasedGraph($aliasedGraph) + { + $this->aliasedGraph = $aliasedGraph; + } + + public function setColors($colors) + { + $i = 0; + foreach ($this->getDefaultColors() as $colorKey => $defaultColor) { + if (isset($colors[$i]) && $this->hex2rgb($colors[$i])) { + $hexColor = $colors[$i]; + } else { + $hexColor = $defaultColor; + } + + $this->colors[$colorKey] = $this->hex2rgb($hexColor); + $i++; + } + } + + /** + * Return $filename with temp directory and delete file + * + * @static + * @param $filename + * @return string path of file in temp directory + */ + protected static function getOutputPath($filename) + { + $outputFilename = PIWIK_USER_PATH . '/tmp/assets/' . $filename; + @chmod($outputFilename, 0600); + @unlink($outputFilename); + return $outputFilename; + } + + protected function initpData() + { + $this->pData = new pData(); + + foreach ($this->ordinateSeries as $column => $data) { + $this->pData->addPoints($data, $column); + $this->pData->setSerieDescription($column, $this->ordinateLabels[$column]); + if (isset($this->ordinateLogos[$column])) { + $ordinateLogo = $this->ordinateLogos[$column]; + $this->pData->setSeriePicture($column, $ordinateLogo); + } + } + + $this->pData->addPoints($this->abscissaSeries, self::ABSCISSA_SERIE_NAME); + $this->pData->setAbscissa(self::ABSCISSA_SERIE_NAME); + } + + protected function initpImage() + { + $this->pImage = new pImage($this->width, $this->height, $this->pData); + $this->pImage->Antialias = $this->aliasedGraph; + + $this->pImage->setFontProperties( + array( + "FontName" => $this->font, + "FontSize" => $this->fontSize + ) + ); + } + + protected function getTextWidthHeight($text, $fontSize = false) + { + if (!$fontSize) { + $fontSize = $this->fontSize; + } + + if (!$this->pImage) { + $this->initpImage(); + } + + // could not find a way to get pixel perfect width & height info using imageftbbox + $textInfo = $this->pImage->drawText( + 0, 0, $text, + array( + 'Alpha' => 0, + 'FontSize' => $fontSize, + 'FontName' => $this->font + ) + ); + + return array($textInfo[1]["X"] + 1, $textInfo[0]["Y"] - $textInfo[2]["Y"]); + } + + protected function getMaximumTextWidthHeight($values) + { + if (array_values($values) === $values) { + $values = array('' => $values); + } + + $maxWidth = 0; + $maxHeight = 0; + foreach ($values as $column => $data) { + foreach ($data as $value) { + list($valueWidth, $valueHeight) = $this->getTextWidthHeight($value); + + if ($valueWidth > $maxWidth) { + $maxWidth = $valueWidth; + } + + if ($valueHeight > $maxHeight) { + $maxHeight = $valueHeight; + } + } + } + + return array($maxWidth, $maxHeight); + } + + private static function hex2rgb($hexColor) + { + if (preg_match('/([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/', $hexColor, $matches)) { + return array( + 'R' => hexdec($matches[1]), + 'G' => hexdec($matches[2]), + 'B' => hexdec($matches[3]) + ); + } else { + return false; + } + } }
\ No newline at end of file |