Project

General

Profile

1
<?php
2
/**
3
 * PhpThumb Base Class Definition File
4
 * 
5
 * This file contains the definition for the ThumbBase object
6
 * 
7
 * PHP Version 5 with GD 2.0+
8
 * PhpThumb : PHP Thumb Library <http://phpthumb.gxdlabs.com>
9
 * Copyright (c) 2009, Ian Selby/Gen X Design
10
 * 
11
 * Author(s): Ian Selby <ian@gen-x-design.com>
12
 * 
13
 * Licensed under the MIT License
14
 * Redistributions of files must retain the above copyright notice.
15
 * 
16
 * @author Ian Selby <ian@gen-x-design.com>
17
 * @copyright Copyright (c) 2009 Gen X Design
18
 * @link http://phpthumb.gxdlabs.com
19
 * @license http://www.opensource.org/licenses/mit-license.php The MIT License
20
 * @version 3.0
21
 * @package PhpThumb
22
 * @filesource
23
 */
24

    
25
/**
26
 * ThumbBase Class Definition
27
 * 
28
 * This is the base class that all implementations must extend.  It contains the 
29
 * core variables and functionality common to all implementations, as well as the functions that 
30
 * allow plugins to augment those classes.
31
 * 
32
 * @package PhpThumb
33
 * @subpackage Core
34
 */
35
abstract class ThumbBase 
36
{
37
	/**
38
	 * All imported objects
39
	 * 
40
	 * An array of imported plugin objects
41
	 * 
42
	 * @var array
43
	 */
44
	protected $imported;
45
	/**
46
	 * All imported object functions
47
	 * 
48
	 * An array of all methods added to this class by imported plugin objects
49
	 * 
50
	 * @var array
51
	 */
52
	protected $importedFunctions;
53
	/**
54
	 * The last error message raised
55
	 * 
56
	 * @var string
57
	 */
58
	protected $errorMessage;
59
	/**
60
	 * Whether or not the current instance has any errors
61
	 * 
62
	 * @var bool
63
	 */
64
	protected $hasError;
65
	/**
66
	 * The name of the file we're manipulating
67
	 * 
68
	 * This must include the path to the file (absolute paths recommended)
69
	 * 
70
	 * @var string
71
	 */
72
	protected $fileName;
73
	/**
74
	 * What the file format is (mime-type)
75
	 * 
76
	 * @var string
77
	 */
78
	protected $format;
79
	/**
80
	 * Whether or not the image is hosted remotely
81
	 * 
82
	 * @var bool
83
	 */
84
	protected $remoteImage;
85
	/**
86
	 * Whether or not the current image is an actual file, or the raw file data
87
	 *
88
	 * By "raw file data" it's meant that we're actually passing the result of something
89
	 * like file_get_contents() or perhaps from a database blob
90
	 * 
91
	 * @var bool
92
	 */
93
	protected $isDataStream;
94
	
95
	/**
96
	 * Class constructor
97
	 * 
98
	 * @return ThumbBase
99
	 */
100
	public function __construct ($fileName, $isDataStream = false)
101
	{
102
		$this->imported				= array();
103
		$this->importedFunctions	= array();
104
		$this->errorMessage			= null;
105
		$this->hasError				= false;
106
		$this->fileName				= $fileName;
107
		$this->remoteImage			= false;
108
		$this->isDataStream			= $isDataStream;
109
		
110
		$this->fileExistsAndReadable();
111
	}
112
	
113
	/**
114
	 * Imports plugins in $registry to the class
115
	 * 
116
	 * @param array $registry
117
	 */
118
	public function importPlugins ($registry)
119
	{
120
		foreach ($registry as $plugin => $meta)
121
		{
122
			$this->imports($plugin);
123
		}
124
	}
125
	
126
	/**
127
	 * Imports a plugin
128
	 * 
129
	 * This is where all the plugins magic happens!  This function "loads" the plugin functions, making them available as 
130
	 * methods on the class.
131
	 * 
132
	 * @param string $object The name of the object to import / "load"
133
	 */
134
	protected function imports ($object)
135
	{
136
		// the new object to import
137
		$newImport 			= new $object();
138
		// the name of the new object (class name)
139
		$importName			= get_class($newImport);
140
		// the new functions to import
141
		$importFunctions 	= get_class_methods($newImport);
142
		
143
		// add the object to the registry
144
		array_push($this->imported, array($importName, $newImport));
145
		
146
		// add the methods to the registry
147
		foreach ($importFunctions as $key => $functionName)
148
		{
149
			$this->importedFunctions[$functionName] = &$newImport;
150
		}
151
	}
152
	
153
	/**
154
	 * Checks to see if $this->fileName exists and is readable
155
	 * 
156
	 */
157
	protected function fileExistsAndReadable ()
158
	{
159
		if ($this->isDataStream === true)
160
		{
161
			return;
162
		}
163
		
164
		if (stristr($this->fileName, 'http://') !== false)
165
		{
166
			$this->remoteImage = true;
167
			return;
168
		}
169
		
170
		if (!file_exists($this->fileName))
171
		{
172
			$this->triggerError('Image file not found: ' . $this->fileName);
173
		}
174
		elseif (!is_readable($this->fileName))
175
		{
176
			$this->triggerError('Image file not readable: ' . $this->fileName);
177
		}
178
	}
179
	
180
	/**
181
	 * Sets $this->errorMessage to $errorMessage and throws an exception
182
	 * 
183
	 * Also sets $this->hasError to true, so even if the exceptions are caught, we don't
184
	 * attempt to proceed with any other functions
185
	 * 
186
	 * @param string $errorMessage
187
	 */
188
	protected function triggerError ($errorMessage)
189
	{
190
		$this->hasError 	= true;
191
		$this->errorMessage	= $errorMessage;
192
		
193
		throw new Exception ($errorMessage);
194
	}
195
	
196
	/**
197
	 * Calls plugin / imported functions
198
	 * 
199
	 * This is also where a fair amount of plugins magaic happens.  This magic method is called whenever an "undefined" class 
200
	 * method is called in code, and we use that to call an imported function. 
201
	 * 
202
	 * You should NEVER EVER EVER invoke this function manually.  The universe will implode if you do... seriously ;)
203
	 * 
204
	 * @param string $method
205
	 * @param array $args
206
	 */
207
	public function __call ($method, $args)
208
	{
209
		if( array_key_exists($method, $this->importedFunctions))
210
		{
211
			$args[] = $this;
212
			return call_user_func_array(array($this->importedFunctions[$method], $method), $args);
213
		}
214
		
215
		throw new BadMethodCallException ('Call to undefined method/class function: ' . $method);
216
	}
217

    
218
    /**
219
     * Returns $imported.
220
     * @see ThumbBase::$imported
221
     * @return array
222
     */
223
    public function getImported ()
224
    {
225
        return $this->imported;
226
    }
227
    
228
    /**
229
     * Returns $importedFunctions.
230
     * @see ThumbBase::$importedFunctions
231
     * @return array
232
     */
233
    public function getImportedFunctions ()
234
    {
235
        return $this->importedFunctions;
236
    }
237
	
238
	/**
239
	 * Returns $errorMessage.
240
	 *
241
	 * @see ThumbBase::$errorMessage
242
	 */
243
	public function getErrorMessage ()
244
	{
245
		return $this->errorMessage;
246
	}
247
	
248
	/**
249
	 * Sets $errorMessage.
250
	 *
251
	 * @param object $errorMessage
252
	 * @see ThumbBase::$errorMessage
253
	 */
254
	public function setErrorMessage ($errorMessage)
255
	{
256
		$this->errorMessage = $errorMessage;
257
	}
258
	
259
	/**
260
	 * Returns $fileName.
261
	 *
262
	 * @see ThumbBase::$fileName
263
	 */
264
	public function getFileName ()
265
	{
266
		return $this->fileName;
267
	}
268
	
269
	/**
270
	 * Sets $fileName.
271
	 *
272
	 * @param object $fileName
273
	 * @see ThumbBase::$fileName
274
	 */
275
	public function setFileName ($fileName)
276
	{
277
		$this->fileName = $fileName;
278
	}
279
	
280
	/**
281
	 * Returns $format.
282
	 *
283
	 * @see ThumbBase::$format
284
	 */
285
	public function getFormat ()
286
	{
287
		return $this->format;
288
	}
289
	
290
	/**
291
	 * Sets $format.
292
	 *
293
	 * @param object $format
294
	 * @see ThumbBase::$format
295
	 */
296
	public function setFormat ($format)
297
	{
298
		$this->format = $format;
299
	}
300
	
301
	/**
302
	 * Returns $hasError.
303
	 *
304
	 * @see ThumbBase::$hasError
305
	 */
306
	public function getHasError ()
307
	{
308
		return $this->hasError;
309
	}
310
	
311
	/**
312
	 * Sets $hasError.
313
	 *
314
	 * @param object $hasError
315
	 * @see ThumbBase::$hasError
316
	 */
317
	public function setHasError ($hasError)
318
	{
319
		$this->hasError = $hasError;
320
	} 
321
	
322

    
323
}
(4-4/5)