summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
Diffstat (limited to 'modules')
-rw-r--r--modules/gallery/helpers/album.php17
-rw-r--r--modules/gallery/helpers/gallery_installer.php17
-rw-r--r--modules/gallery/helpers/item.php8
-rw-r--r--modules/gallery/helpers/movie.php17
-rw-r--r--modules/gallery/helpers/photo.php19
-rw-r--r--modules/gallery/models/item.php72
-rw-r--r--modules/gallery/module.info2
-rw-r--r--modules/gallery/tests/Movie_Helper_Test.php14
-rw-r--r--modules/gallery/tests/Photo_Helper_Test.php14
-rw-r--r--modules/gallery/tests/test.flvbin0 -> 88722 bytes
10 files changed, 142 insertions, 38 deletions
diff --git a/modules/gallery/helpers/album.php b/modules/gallery/helpers/album.php
index d46f21ac..78c5062f 100644
--- a/modules/gallery/helpers/album.php
+++ b/modules/gallery/helpers/album.php
@@ -30,9 +30,10 @@ class album_Core {
* @param string $name the name of this new album (it will become the directory name on disk)
* @param integer $title the title of the new album
* @param string $description (optional) the longer description of this album
+ * @param string $slug (optional) the url component for this photo
* @return Item_Model
*/
- static function create($parent, $name, $title, $description=null, $owner_id=null) {
+ static function create($parent, $name, $title, $description=null, $owner_id=null, $slug=null) {
if (!$parent->loaded || !$parent->is_album()) {
throw new Exception("@todo INVALID_PARENT");
}
@@ -47,6 +48,10 @@ class album_Core {
throw new Exception("@todo NAME_CANNOT_END_IN_PERIOD");
}
+ if (empty($slug)) {
+ $slug = item::convert_filename_to_slug($name);
+ }
+
$album = ORM::factory("item");
$album->type = "album";
$album->title = $title;
@@ -55,15 +60,23 @@ class album_Core {
$album->owner_id = $owner_id;
$album->thumb_dirty = 1;
$album->resize_dirty = 1;
+ $album->slug = $slug;
$album->rand_key = ((float)mt_rand()) / (float)mt_getrandmax();
$album->sort_column = "created";
$album->sort_order = "ASC";
+ // Randomize the name or slug if there's a conflict
+ // @todo Improve this. Random numbers are not user friendly
while (ORM::factory("item")
->where("parent_id", $parent->id)
+ ->open_paren()
->where("name", $album->name)
+ ->orwhere("slug", $album->slug)
+ ->close_paren()
->find()->id) {
- $album->name = "{$name}-" . rand();
+ $rand = rand();
+ $album->name = "{$name}-$rand";
+ $album->slug = "{$slug}-$rand";
}
$album = $album->add_to_parent($parent);
diff --git a/modules/gallery/helpers/gallery_installer.php b/modules/gallery/helpers/gallery_installer.php
index 40830bc0..91654afe 100644
--- a/modules/gallery/helpers/gallery_installer.php
+++ b/modules/gallery/helpers/gallery_installer.php
@@ -80,10 +80,12 @@ class gallery_installer {
`parent_id` int(9) NOT NULL,
`rand_key` float default NULL,
`relative_path_cache` varchar(255) default NULL,
+ `relative_url_cache` varchar(255) default NULL,
`resize_dirty` boolean default 1,
`resize_height` int(9) default NULL,
`resize_width` int(9) default NULL,
`right_ptr` int(9) NOT NULL,
+ `slug` varchar(255) default NULL,
`sort_column` varchar(64) default NULL,
`sort_order` char(4) default 'ASC',
`thumb_dirty` boolean default 1,
@@ -260,7 +262,7 @@ class gallery_installer {
module::set_var("gallery", "show_credits", 1);
// @todo this string needs to be picked up by l10n_scanner
module::set_var("gallery", "credits", "Powered by <a href=\"%url\">Gallery %version</a>");
- module::set_version("gallery", 11);
+ module::set_version("gallery", 12);
}
static function upgrade($version) {
@@ -343,7 +345,18 @@ class gallery_installer {
module::set_version("gallery", $version = 11);
}
-}
+
+ if ($version == 11) {
+ $db->query("ALTER TABLE {items} ADD COLUMN `relative_url_cache` varchar(255) DEFAULT NULL");
+ $db->query("ALTER TABLE {items} ADD COLUMN `slug` varchar(255) DEFAULT NULL");
+
+ // This is imperfect since some of the slugs may contain invalid characters, but it'll do
+ // for now because we don't want a lengthy operation here.
+ $db->query("UPDATE {items} SET `slug` = `name`");
+ $db->query("UPDATE {items} SET `relative_url_cache` = `relative_path_cache`");
+ module::set_version("gallery", $version = 12);
+ }
+ }
static function uninstall() {
$db = Database::instance();
diff --git a/modules/gallery/helpers/item.php b/modules/gallery/helpers/item.php
index 8839861f..bf948731 100644
--- a/modules/gallery/helpers/item.php
+++ b/modules/gallery/helpers/item.php
@@ -121,6 +121,14 @@ class item_Core {
}
/**
+ * Convert a filename into something we can use as a url component.
+ * @param string $filename
+ */
+ static function convert_filename_to_slug($filename) {
+ return preg_replace("/[^A-Za-z0-9-_]+/", "-", pathinfo($filename, PATHINFO_FILENAME));
+ }
+
+ /**
* Display delete confirmation message and form
* @param object $item
* @return string form
diff --git a/modules/gallery/helpers/movie.php b/modules/gallery/helpers/movie.php
index ec975cb0..59bf5c19 100644
--- a/modules/gallery/helpers/movie.php
+++ b/modules/gallery/helpers/movie.php
@@ -31,10 +31,11 @@ class movie_Core {
* @param string $name the filename to use for this photo in the album
* @param integer $title the title of the new photo
* @param string $description (optional) the longer description of this photo
+ * @param string $slug (optional) the url component for this photo
* @return Item_Model
*/
static function create($parent, $filename, $name, $title,
- $description=null, $owner_id=null) {
+ $description=null, $owner_id=null, $slug=null) {
if (!$parent->loaded || !$parent->is_album()) {
throw new Exception("@todo INVALID_PARENT");
}
@@ -67,6 +68,10 @@ class movie_Core {
$name .= "." . $pi["extension"];
}
+ if (empty($slug)) {
+ $slug = item::convert_filename_to_slug($name);
+ }
+
$movie = ORM::factory("item");
$movie->type = "movie";
$movie->title = $title;
@@ -79,15 +84,21 @@ class movie_Core {
$movie->thumb_dirty = 1;
$movie->resize_dirty = 1;
$movie->sort_column = "weight";
+ $movie->slug = $slug;
$movie->rand_key = ((float)mt_rand()) / (float)mt_getrandmax();
// Randomize the name if there's a conflict
+ // @todo Improve this. Random numbers are not user friendly
while (ORM::factory("item")
->where("parent_id", $parent->id)
+ ->open_paren()
->where("name", $movie->name)
+ ->orwhere("slug", $movie->slug)
+ ->close_paren()
->find()->id) {
- // @todo Improve this. Random numbers are not user friendly
- $movie->name = rand() . "." . $pi["extension"];
+ $rand = rand();
+ $movie->name = "{$name}.$rand.{$pi['extension']}";
+ $movie->slug = "{$slug}-$rand";
}
// This saves the photo
diff --git a/modules/gallery/helpers/photo.php b/modules/gallery/helpers/photo.php
index 40b645a2..c713fff9 100644
--- a/modules/gallery/helpers/photo.php
+++ b/modules/gallery/helpers/photo.php
@@ -31,10 +31,11 @@ class photo_Core {
* @param string $name the filename to use for this photo in the album
* @param integer $title the title of the new photo
* @param string $description (optional) the longer description of this photo
+ * @param string $slug (optional) the url component for this photo
* @return Item_Model
*/
static function create($parent, $filename, $name, $title,
- $description=null, $owner_id=null) {
+ $description=null, $owner_id=null, $slug=null) {
if (!$parent->loaded || !$parent->is_album()) {
throw new Exception("@todo INVALID_PARENT");
}
@@ -66,6 +67,10 @@ class photo_Core {
$name .= "." . $pi["extension"];
}
+ if (empty($slug)) {
+ $slug = item::convert_filename_to_slug($name);
+ }
+
$photo = ORM::factory("item");
$photo->type = "photo";
$photo->title = $title;
@@ -78,15 +83,21 @@ class photo_Core {
$photo->thumb_dirty = 1;
$photo->resize_dirty = 1;
$photo->sort_column = "weight";
+ $photo->slug = $slug;
$photo->rand_key = ((float)mt_rand()) / (float)mt_getrandmax();
- // Randomize the name if there's a conflict
+ // Randomize the name or slug if there's a conflict
+ // @todo Improve this. Random numbers are not user friendly
while (ORM::factory("item")
->where("parent_id", $parent->id)
+ ->open_paren()
->where("name", $photo->name)
+ ->orwhere("slug", $photo->slug)
+ ->close_paren()
->find()->id) {
- // @todo Improve this. Random numbers are not user friendly
- $photo->name = rand() . "." . $pi["extension"];
+ $rand = rand();
+ $photo->name = "{$name}.$rand.{$pi['extension']}";
+ $photo->slug = "{$slug}-$rand";
}
// This saves the photo
diff --git a/modules/gallery/models/item.php b/modules/gallery/models/item.php
index 8905a627..b679ebf1 100644
--- a/modules/gallery/models/item.php
+++ b/modules/gallery/models/item.php
@@ -117,7 +117,8 @@ class Item_Model extends ORM_MPTT {
@rename(dirname($original_thumb_path), dirname($this->thumb_path()));
Database::instance()
->update("items",
- array("relative_path_cache" => null),
+ array("relative_path_cache" => null,
+ "relative_url_cache" => null),
array("left_ptr >" => $this->left_ptr, "right_ptr <" => $this->right_ptr));
} else {
@rename($original_resize_path, $this->resize_path());
@@ -153,7 +154,8 @@ class Item_Model extends ORM_MPTT {
if ($this->is_album()) {
Database::instance()
->update("items",
- array("relative_path_cache" => null),
+ array("relative_path_cache" => null,
+ "relative_url_cache" => null),
array("left_ptr >" => $this->left_ptr, "right_ptr <" => $this->right_ptr));
}
@@ -188,8 +190,8 @@ class Item_Model extends ORM_MPTT {
* photo: http://example.com/gallery3/var/albums/album1/photo.jpg
*/
public function file_url($full_uri=false) {
- $relative_path = "var/albums/" . $this->relative_path();
- return $full_uri ? url::abs_file($relative_path) : url::file($relative_path);
+ $relative_url = "var/albums/" . $this->relative_url();
+ return $full_uri ? url::abs_file($relative_url) : url::file($relative_url);
}
/**
@@ -221,8 +223,8 @@ class Item_Model extends ORM_MPTT {
*/
public function thumb_url($full_uri=false) {
$cache_buster = "?m=" . $this->updated;
- $relative_path = "var/thumbs/" . $this->relative_path();
- $base = ($full_uri ? url::abs_file($relative_path) : url::file($relative_path));
+ $relative_url = "var/thumbs/" . $this->relative_url();
+ $base = ($full_uri ? url::abs_file($relative_url) : url::file($relative_url));
if ($this->is_photo()) {
return $base . $cache_buster;
} else if ($this->is_album()) {
@@ -248,12 +250,34 @@ class Item_Model extends ORM_MPTT {
* photo: http://example.com/gallery3/var/albums/album1/photo.resize.jpg
*/
public function resize_url($full_uri=false) {
- $relative_path = "var/resizes/" . $this->relative_path();
- return ($full_uri ? url::abs_file($relative_path) : url::file($relative_path)) .
+ $relative_url = "var/resizes/" . $this->relative_url();
+ return ($full_uri ? url::abs_file($relative_url) : url::file($relative_url)) .
($this->is_album() ? "/.album.jpg" : "");
}
/**
+ * Rebuild the relative_path_cache and relative_url_cache.
+ */
+ private function _build_relative_caches() {
+ $names = array();
+ $slugs = array();
+ foreach (Database::instance()
+ ->select(array("name", "slug"))
+ ->from("items")
+ ->where("left_ptr <=", $this->left_ptr)
+ ->where("right_ptr >=", $this->right_ptr)
+ ->where("id <>", 1)
+ ->orderby("left_ptr", "ASC")
+ ->get() as $row) {
+ $names[] = $row->name;
+ $slugs[] = $row->slug;
+ }
+ $this->relative_path_cache = implode($names, "/");
+ $this->relative_url_cache = implode($slugs, "/");
+ $this->save();
+ }
+
+ /**
* Return the relative path to this item's file.
* @return string
*/
@@ -263,24 +287,27 @@ class Item_Model extends ORM_MPTT {
}
if (!isset($this->relative_path_cache)) {
- $paths = array();
- foreach (Database::instance()
- ->select("name")
- ->from("items")
- ->where("left_ptr <=", $this->left_ptr)
- ->where("right_ptr >=", $this->right_ptr)
- ->where("id <>", 1)
- ->orderby("left_ptr", "ASC")
- ->get() as $row) {
- $paths[] = $row->name;
- }
- $this->relative_path_cache = implode($paths, "/");
- $this->save();
+ $this->_build_relative_caches();
}
return $this->relative_path_cache;
}
/**
+ * Return the relative url to this item's file.
+ * @return string
+ */
+ public function relative_url() {
+ if (!$this->loaded) {
+ return;
+ }
+
+ if (!isset($this->relative_url_cache)) {
+ $this->_build_relative_caches();
+ }
+ return $this->relative_url_cache;
+ }
+
+ /**
* @see ORM::__get()
*/
public function __get($column) {
@@ -302,7 +329,8 @@ class Item_Model extends ORM_MPTT {
*/
public function __set($column, $value) {
if ($column == "name") {
- // Clear the relative path as it is no longer valid.
+ // Clear the relative path as it is no longer valid. The relative url cache does not need
+ // to be flushed because it's not tightly bound to the actual name of the file.
$this->relative_path_cache = null;
}
parent::__set($column, $value);
diff --git a/modules/gallery/module.info b/modules/gallery/module.info
index 6b9dd1ba..70bd91e2 100644
--- a/modules/gallery/module.info
+++ b/modules/gallery/module.info
@@ -1,3 +1,3 @@
name = "Gallery 3"
description = "Gallery core application"
-version = 11
+version = 12
diff --git a/modules/gallery/tests/Movie_Helper_Test.php b/modules/gallery/tests/Movie_Helper_Test.php
index 627651bb..23544934 100644
--- a/modules/gallery/tests/Movie_Helper_Test.php
+++ b/modules/gallery/tests/Movie_Helper_Test.php
@@ -22,7 +22,7 @@ class Movie_Helper_Test extends Unit_Test_Case {
$rand = rand();
$root = ORM::factory("item", 1);
try {
- $movie = movie::create($root, MODPATH . "gallery/tests/test.jpg", "$rand/.jpg", $rand, $rand);
+ $movie = movie::create($root, MODPATH . "gallery/tests/test.flv", "$rand/.flv", $rand, $rand);
} catch (Exception $e) {
// pass
return;
@@ -35,7 +35,7 @@ class Movie_Helper_Test extends Unit_Test_Case {
$rand = rand();
$root = ORM::factory("item", 1);
try {
- $movie = movie::create($root, MODPATH . "gallery/tests/test.jpg", "$rand.jpg.", $rand, $rand);
+ $movie = movie::create($root, MODPATH . "gallery/tests/test.flv", "$rand.flv.", $rand, $rand);
} catch (Exception $e) {
$this->assert_equal("@todo NAME_CANNOT_END_IN_PERIOD", $e->getMessage());
return;
@@ -43,4 +43,14 @@ class Movie_Helper_Test extends Unit_Test_Case {
$this->assert_true(false, "Shouldn't create a movie with trailing . in the name");
}
+
+ public function create_movie_creates_reasonable_slug_test() {
+ $rand = rand();
+ $root = ORM::factory("item", 1);
+ $album = album::create($root, $rand, $rand, $rand);
+ $movie = movie::create(
+ $album, MODPATH . "gallery/tests/test.flv", "This (is) my file%name.flv", $rand, $rand);
+
+ $this->assert_equal("This-is-my-file-name", $movie->slug);
+ }
}
diff --git a/modules/gallery/tests/Photo_Helper_Test.php b/modules/gallery/tests/Photo_Helper_Test.php
index c0641ef4..a261693f 100644
--- a/modules/gallery/tests/Photo_Helper_Test.php
+++ b/modules/gallery/tests/Photo_Helper_Test.php
@@ -69,7 +69,7 @@ class Photo_Helper_Test extends Unit_Test_Case {
$rand = rand();
$root = ORM::factory("item", 1);
$photo = photo::create($root, MODPATH . "gallery/tests/test.jpg", "$rand.jpg", $rand, $rand);
- $this->assert_equal("http://./var/thumbs/{$rand}.jpg?m={$photo->updated}", $photo->thumb_url());
+ $this->assert_equal("http://./var/thumbs/{$rand}?m={$photo->updated}", $photo->thumb_url());
}
public function resize_url_test() {
@@ -78,7 +78,17 @@ class Photo_Helper_Test extends Unit_Test_Case {
$album = album::create($root, $rand, $rand, $rand);
$photo = photo::create($album, MODPATH . "gallery/tests/test.jpg", "$rand.jpg", $rand, $rand);
- $this->assert_equal("http://./var/resizes/{$rand}/{$rand}.jpg", $photo->resize_url());
+ $this->assert_equal("http://./var/resizes/{$rand}/{$rand}", $photo->resize_url());
+ }
+
+ public function create_photo_creates_reasonable_slug_test() {
+ $rand = rand();
+ $root = ORM::factory("item", 1);
+ $album = album::create($root, $rand, $rand, $rand);
+ $photo = photo::create(
+ $album, MODPATH . "gallery/tests/test.jpg", "This (is) my file%name.jpg", $rand, $rand);
+
+ $this->assert_equal("This-is-my-file-name", $photo->slug);
}
public function create_photo_shouldnt_allow_names_with_slash_test() {
diff --git a/modules/gallery/tests/test.flv b/modules/gallery/tests/test.flv
new file mode 100644
index 00000000..799d137e
--- /dev/null
+++ b/modules/gallery/tests/test.flv
Binary files differ