summaryrefslogtreecommitdiffstats
path: root/models/Photo.php
diff options
context:
space:
mode:
authorMichael Francis <edude03@gmail.com>2011-05-28 13:28:16 -0400
committerMichael Francis <edude03@gmail.com>2011-05-28 13:28:16 -0400
commit2389d66da849798f8d4ec5f10e3b07c11da49185 (patch)
treee22556d12982395b469a23420c662662e3e064cc /models/Photo.php
downloadotakuhub-2389d66da849798f8d4ec5f10e3b07c11da49185.tar.xz
Initial Commit
Diffstat (limited to 'models/Photo.php')
-rw-r--r--models/Photo.php62
1 files changed, 62 insertions, 0 deletions
diff --git a/models/Photo.php b/models/Photo.php
new file mode 100644
index 0000000..364b9fa
--- /dev/null
+++ b/models/Photo.php
@@ -0,0 +1,62 @@
+<?php
+
+namespace app\models;
+
+class Photo extends \lithium\data\Model {
+
+ //Tells lithium to store it in mongo as a file (gridFS)
+ protected $_meta = array('source' => 'fs.files');
+ public $validates = array();
+
+
+ /**
+ * Generate a cached version under webroot
+ * @param string $id The image id as in mongodb
+ * @param array $options Possible values are
+ * width
+ * height
+ * @return mixed
+ */
+ public static function version($id, $options = array()) {
+ if (!$id)
+ return false;
+ // This is the same as Photo::first($id) when called from inside itself
+ $self = static::first($id);
+ return ($self) ? $self->generateVersion($options) : false;
+ }
+
+ /**
+ * Generate a cached version under webroot
+ * @param Document $self The document from the db
+ * @param array $options Possible values are
+ * @return mixed
+ */
+ public function generateVersion($self, $options = array()) {
+ // This is quite naive, it would fail at .jpeg for example. Be more elaborate on production code!
+ $type = substr($self->file->file['filename'], -3);
+ $path = LITHIUM_APP_PATH . "/webroot/image/{$self->_id}";
+ $originalPath = $path . "." . $type;
+
+ // Always create the original variant if it doesnt exist yet. It is needed for resize
+ if (!file_exists($originalPath))
+ file_put_contents($originalPath, $self->file->getBytes());
+
+ if (isset($options['width']) && isset($options['height'])) {
+ $width = (int) $options['width'];
+ $height = (int) $options['height'];
+
+ $path .= "_{$width}x{$height}.{$type}";
+
+ // This requires imagemagick and access to system calls.
+ // It is possible to use gd but it is a much worse alternative so please dont.
+ $convertCommand = "convert $originalPath -resize {$width}x{$height}\> $path";
+ shell_exec($convertCommand);
+ // Return data of the resized version
+ return file_get_contents($path);
+ }
+ // If no width/height were set, just return data of the original
+ return $self->file->getBytes();
+ }
+}
+
+?> \ No newline at end of file