icons
11 years ago
markers
10 years ago
GoogleChart.php
11 years ago
GoogleChartApi.php
11 years ago
GoogleChartAxis.php
11 years ago
GoogleChartData.php
11 years ago
GoogleChartIcon.php
11 years ago
GoogleChartMarker.php
11 years ago
LICENSE
11 years ago
GoogleChartApi.php
265 lines
| 1 | <?php |
| 2 | |
| 3 | /** @file |
| 4 | * This file is part of Google Chart PHP library. |
| 5 | * |
| 6 | * Copyright (c) 2010 Rémi Lanvin <remi@cloudconnected.fr> |
| 7 | * |
| 8 | * Licensed under the MIT license. |
| 9 | * |
| 10 | * For the full copyright and license information, please view the LICENSE file. |
| 11 | */ |
| 12 | |
| 13 | /** |
| 14 | * Basic feature to query the API. |
| 15 | * |
| 16 | * This class implement basic features to query Google Chart API using GET or |
| 17 | * POST, as well as a simple way to set/get parameters. |
| 18 | * |
| 19 | * Every object that behave like a chart (regular charts, freestanding icons), |
| 20 | * must inherit from this class. |
| 21 | * |
| 22 | * @internal |
| 23 | */ |
| 24 | class GoogleChartApi |
| 25 | { |
| 26 | /** |
| 27 | * Google Chart API base url. |
| 28 | */ |
| 29 | const BASE_URL = 'http://chart.apis.google.com/chart'; |
| 30 | |
| 31 | // HTTPS url = https://chart.googleapis.com/chart |
| 32 | |
| 33 | /** |
| 34 | * GET method |
| 35 | */ |
| 36 | const GET = 0; |
| 37 | |
| 38 | /** |
| 39 | * POST method |
| 40 | */ |
| 41 | const POST = 1; |
| 42 | |
| 43 | /** |
| 44 | * An array to store every additional parameters for the final request. |
| 45 | * Everything written in this array will be added to the final request without |
| 46 | * processing. It can be used to override any parameter. |
| 47 | */ |
| 48 | protected $parameters = array(); |
| 49 | |
| 50 | /** |
| 51 | * GET or POST |
| 52 | */ |
| 53 | protected $query_method = self::POST; |
| 54 | |
| 55 | /** |
| 56 | * Set a parameter. |
| 57 | * |
| 58 | * @param $name (string) |
| 59 | * @param $value (mixed) |
| 60 | */ |
| 61 | public function __set($name, $value) |
| 62 | { |
| 63 | $this->parameters[$name] = $value; |
| 64 | } |
| 65 | |
| 66 | /** |
| 67 | * Return a parameter value. |
| 68 | * |
| 69 | * @param $name (string) |
| 70 | * @return mixed |
| 71 | */ |
| 72 | public function __get($name) |
| 73 | { |
| 74 | return isset($this->parameters[$name]) ? $this->parameters[$name] : null; |
| 75 | } |
| 76 | |
| 77 | /** |
| 78 | * Unset a parameter. |
| 79 | * |
| 80 | * @param $name (string) |
| 81 | */ |
| 82 | public function __unset($name) |
| 83 | { |
| 84 | unset($this->parameters[$name]); |
| 85 | } |
| 86 | |
| 87 | /** |
| 88 | * Compute the whole query as an array. |
| 89 | * |
| 90 | * This function here does nothing (only returns the parameters array). |
| 91 | * It has to be overrided by child classes in order to add some logic. |
| 92 | * |
| 93 | * @internal |
| 94 | */ |
| 95 | protected function computeQuery() |
| 96 | { |
| 97 | return $this->parameters; |
| 98 | } |
| 99 | |
| 100 | |
| 101 | /** |
| 102 | * @name Function to query Google Chart API |
| 103 | */ |
| 104 | //@{ |
| 105 | |
| 106 | /** |
| 107 | * Set whether you want the class to use GET or POST for querying the API. |
| 108 | * |
| 109 | * Default method is POST. |
| 110 | * |
| 111 | * @param $method One of the following: |
| 112 | * - GoogleChart::GET |
| 113 | * - GoogleChart::POST |
| 114 | * @return $this |
| 115 | */ |
| 116 | public function setQueryMethod($method) |
| 117 | { |
| 118 | if ( $method !== self::POST && $method !== self::GET ) |
| 119 | throw new Exception(sprintf( |
| 120 | 'Query method must be either GoogleChart::POST or GoogleChart::GET, "%s" given.', |
| 121 | $method |
| 122 | )); |
| 123 | |
| 124 | $this->query_method = $method; |
| 125 | return $this; |
| 126 | } |
| 127 | |
| 128 | /** |
| 129 | * Returns the full URL. |
| 130 | * |
| 131 | * Use this method if you need to link Google's URL directly, or if you |
| 132 | * prefer to use your own library to GET the chart. |
| 133 | * |
| 134 | * @return string |
| 135 | */ |
| 136 | public function getUrl($escape_amp = true) |
| 137 | { |
| 138 | $q = $this->computeQuery(); |
| 139 | $url = self::BASE_URL.'?'.http_build_query($q, '', $escape_amp? '&' : '&'); |
| 140 | return $url; |
| 141 | } |
| 142 | |
| 143 | /** |
| 144 | * Returns the query parameters as an array. |
| 145 | * |
| 146 | * Use this method if you want to do the POST yourself, or for troubleshooting |
| 147 | * a chart. |
| 148 | * |
| 149 | * @return array |
| 150 | */ |
| 151 | public function getQuery() |
| 152 | { |
| 153 | return $this->computeQuery(); |
| 154 | } |
| 155 | |
| 156 | /** |
| 157 | * Return an HTML img tag with Google's URL. |
| 158 | * |
| 159 | * Use this for troubleshooting or rapid application development. |
| 160 | * |
| 161 | * @return string |
| 162 | */ |
| 163 | public function toHtml() |
| 164 | { |
| 165 | $str = sprintf( |
| 166 | '<img src="%s" alt="" />', |
| 167 | $this->getUrl() |
| 168 | ); |
| 169 | return $str; |
| 170 | } |
| 171 | |
| 172 | /** |
| 173 | * Query Google Chart and returns the image. |
| 174 | * |
| 175 | * @see setQueryMethod |
| 176 | * |
| 177 | * @return binary image |
| 178 | */ |
| 179 | public function getImage() |
| 180 | { |
| 181 | $image = null; |
| 182 | |
| 183 | switch ( $this->query_method ) { |
| 184 | case self::GET: |
| 185 | $url = $this->getUrl(false); |
| 186 | $image = file_get_contents($url); |
| 187 | break; |
| 188 | case self::POST: |
| 189 | $image = self::post($this->computeQuery()); |
| 190 | break; |
| 191 | } |
| 192 | |
| 193 | return $image; |
| 194 | } |
| 195 | |
| 196 | /** |
| 197 | * Returns the image as a GD resource. |
| 198 | * @return ressource or false |
| 199 | * @since 0.6 |
| 200 | */ |
| 201 | public function getImageGD() |
| 202 | { |
| 203 | return imagecreatefromstring($this->getImage()); |
| 204 | } |
| 205 | |
| 206 | /** |
| 207 | * Shortcut for getImage(). |
| 208 | */ |
| 209 | public function __toString() |
| 210 | { |
| 211 | try { |
| 212 | return (string) $this->getImage(); |
| 213 | } catch (Exception $e) { |
| 214 | trigger_error($e->getMessage(), E_USER_ERROR); |
| 215 | } |
| 216 | } |
| 217 | //@} |
| 218 | |
| 219 | /** |
| 220 | * Performs a POST. |
| 221 | */ |
| 222 | static public function post(array $q = array()) |
| 223 | { |
| 224 | $context = stream_context_create(array( |
| 225 | 'http' => array( |
| 226 | 'method' => 'POST', |
| 227 | 'header' => 'Content-type: application/x-www-form-urlencoded', |
| 228 | 'content' => http_build_query($q, '', '&') |
| 229 | ) |
| 230 | )); |
| 231 | |
| 232 | return file_get_contents(self::BASE_URL, false, $context); |
| 233 | } |
| 234 | |
| 235 | /** |
| 236 | * Check if a color is valid RRGGBB format. |
| 237 | * |
| 238 | * @param $color (string) |
| 239 | * @return bool |
| 240 | */ |
| 241 | static public function validColor($color) |
| 242 | { |
| 243 | return preg_match('/^[0-9A-F]{6}$/i', $color); |
| 244 | } |
| 245 | |
| 246 | /* -------------------------------------------------------------------------- |
| 247 | * Debug |
| 248 | * -------------------------------------------------------------------------- */ |
| 249 | |
| 250 | public function getValidationUrl($escape_amp = true) |
| 251 | { |
| 252 | $q = $this->computeQuery(); |
| 253 | $q['chof'] = 'validate'; |
| 254 | $url = self::BASE_URL.'?'.http_build_query($q, '', $escape_amp?'&':'&'); |
| 255 | return $url; |
| 256 | } |
| 257 | |
| 258 | public function validate() |
| 259 | { |
| 260 | $q = $this->computeQuery(); |
| 261 | $q['chof'] = 'validate'; |
| 262 | return self::post($q); |
| 263 | } |
| 264 | } |
| 265 |