summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBharat Mediratta <bharat@menalto.com>2009-07-20 08:51:12 -0700
committerBharat Mediratta <bharat@menalto.com>2009-07-20 08:51:12 -0700
commit60d605888094f34b4f5185adcdfd01c0338eb8cc (patch)
tree4b83288399c196edf23b8e91934be274402c498d
parent709d6c5faf7ece54046c0e2bc431a559a6b9d735 (diff)
Make some API changes simplify the tag editing code. We now have a
good pattern for allowing modules to add their own hooks to item forms! 1) Album, photo and movie forms now all use edit_item as the group and we publish item_edit_form and item_edit_form_completed events which makes it much easier in the module to handle all events. They can still differentiate based on $item->type if they want to. 2) Added tag::clear_all() and tag::compact() functions which takes the place of hiwilson's tag::update() function and is now used in tag_event::item_delete(). This provides a simple API that allows us to have a lot less event handling code. It's less efficient than what hiwilson was doing before in that it will delete and re-add tags, but if that ever turns out to be a performance issue we can do something about it then.
-rw-r--r--modules/gallery/controllers/albums.php17
-rw-r--r--modules/gallery/controllers/movies.php13
-rw-r--r--modules/gallery/controllers/photos.php15
-rw-r--r--modules/gallery/helpers/album.php4
-rw-r--r--modules/gallery/helpers/photo.php4
-rw-r--r--modules/tag/helpers/tag.php85
-rw-r--r--modules/tag/helpers/tag_event.php38
7 files changed, 60 insertions, 116 deletions
diff --git a/modules/gallery/controllers/albums.php b/modules/gallery/controllers/albums.php
index 0e1c27e5..56b74cb1 100644
--- a/modules/gallery/controllers/albums.php
+++ b/modules/gallery/controllers/albums.php
@@ -174,24 +174,23 @@ class Albums_Controller extends Items_Controller {
->from("items")
->where("parent_id", $album->parent_id)
->where("id <>", $album->id)
- ->where("name", $form->edit_album->dirname->value)
+ ->where("name", $form->edit_item->dirname->value)
->count_records()) {
- $form->edit_album->dirname->add_error("conflict", 1);
+ $form->edit_item->dirname->add_error("conflict", 1);
$valid = false;
}
}
if ($valid) {
- $album->title = $form->edit_album->title->value;
- $album->description = $form->edit_album->description->value;
- $album->sort_column = $form->edit_album->sort_order->column->value;
- $album->sort_order = $form->edit_album->sort_order->direction->value;
+ $album->title = $form->edit_item->title->value;
+ $album->description = $form->edit_item->description->value;
+ $album->sort_column = $form->edit_item->sort_order->column->value;
+ $album->sort_order = $form->edit_item->sort_order->direction->value;
if ($album->id != 1) {
- $album->rename($form->edit_album->dirname->value);
+ $album->rename($form->edit_item->dirname->value);
}
$album->save();
-
- module::event("album_edit_form_completed", $album, $form);
+ module::event("item_edit_form_completed", $album, $form);
log::success("content", "Updated album", "<a href=\"albums/$album->id\">view</a>");
message::success(
diff --git a/modules/gallery/controllers/movies.php b/modules/gallery/controllers/movies.php
index 110ea620..c8227d74 100644
--- a/modules/gallery/controllers/movies.php
+++ b/modules/gallery/controllers/movies.php
@@ -77,20 +77,19 @@ class Movies_Controller extends Items_Controller {
->from("items")
->where("parent_id", $photo->parent_id)
->where("id <>", $photo->id)
- ->where("name", $form->edit_photo->filename->value)
+ ->where("name", $form->edit_item->filename->value)
->count_records()) {
- $form->edit_photo->filename->add_error("conflict", 1);
+ $form->edit_item->filename->add_error("conflict", 1);
$valid = false;
}
}
if ($valid) {
- $photo->title = $form->edit_photo->title->value;
- $photo->description = $form->edit_photo->description->value;
- $photo->rename($form->edit_photo->filename->value);
+ $photo->title = $form->edit_item->title->value;
+ $photo->description = $form->edit_item->description->value;
+ $photo->rename($form->edit_item->filename->value);
$photo->save();
-
- module::event("photo_edit_form_completed", $photo, $form);
+ module::event("item_edit_form_completed", $photo, $form);
log::success("content", "Updated photo", "<a href=\"photos/$photo->id\">view</a>");
message::success(
diff --git a/modules/gallery/controllers/photos.php b/modules/gallery/controllers/photos.php
index 5d37636d..8ee24da8 100644
--- a/modules/gallery/controllers/photos.php
+++ b/modules/gallery/controllers/photos.php
@@ -63,27 +63,26 @@ class Photos_Controller extends Items_Controller {
$form = photo::get_edit_form($photo);
if ($valid = $form->validate()) {
- if ($form->edit_photo->filename->value != $photo->name) {
+ if ($form->edit_item->filename->value != $photo->name) {
// Make sure that there's not a conflict
if (Database::instance()
->from("items")
->where("parent_id", $photo->parent_id)
->where("id <>", $photo->id)
- ->where("name", $form->edit_photo->filename->value)
+ ->where("name", $form->edit_item->filename->value)
->count_records()) {
- $form->edit_photo->filename->add_error("conflict", 1);
+ $form->edit_item->filename->add_error("conflict", 1);
$valid = false;
}
}
}
if ($valid) {
- $photo->title = $form->edit_photo->title->value;
- $photo->description = $form->edit_photo->description->value;
- $photo->rename($form->edit_photo->filename->value);
+ $photo->title = $form->edit_item->title->value;
+ $photo->description = $form->edit_item->description->value;
+ $photo->rename($form->edit_item->filename->value);
$photo->save();
-
- module::event("photo_edit_form_completed", $photo, $form);
+ module::event("item_edit_form_completed", $photo, $form);
log::success("content", "Updated photo", "<a href=\"photos/$photo->id\">view</a>");
message::success(
diff --git a/modules/gallery/helpers/album.php b/modules/gallery/helpers/album.php
index 63182c36..5f10bd02 100644
--- a/modules/gallery/helpers/album.php
+++ b/modules/gallery/helpers/album.php
@@ -96,7 +96,7 @@ class album_Core {
static function get_edit_form($parent) {
$form = new Forge("albums/{$parent->id}", "", "post", array("id" => "gEditAlbumForm"));
$form->hidden("_method")->value("put");
- $group = $form->group("edit_album")->label(t("Edit Album"));
+ $group = $form->group("edit_item")->label(t("Edit Album"));
$group->input("title")->label(t("Title"))->value($parent->title);
$group->textarea("description")->label(t("Description"))->value($parent->description);
@@ -127,7 +127,7 @@ class album_Core {
"DESC" => t("Descending")))
->selected($parent->sort_order);
- module::event("album_edit_form", $parent, $form);
+ module::event("item_edit_form", $parent, $form);
$group->hidden("type")->value("album");
$group->submit("")->value(t("Modify"));
diff --git a/modules/gallery/helpers/photo.php b/modules/gallery/helpers/photo.php
index bf38e1ee..5cf37de1 100644
--- a/modules/gallery/helpers/photo.php
+++ b/modules/gallery/helpers/photo.php
@@ -137,7 +137,7 @@ class photo_Core {
static function get_edit_form($photo) {
$form = new Forge("photos/$photo->id", "", "post", array("id" => "gEditPhotoForm"));
$form->hidden("_method")->value("put");
- $group = $form->group("edit_photo")->label(t("Edit Photo"));
+ $group = $form->group("edit_item")->label(t("Edit Photo"));
$group->input("title")->label(t("Title"))->value($photo->title);
$group->textarea("description")->label(t("Description"))->value($photo->description);
$group->input("filename")->label(t("Filename"))->value($photo->name)
@@ -147,7 +147,7 @@ class photo_Core {
->callback("item::validate_no_trailing_period")
->error_messages("no_trailing_period", t("The photo name can't end in \".\""));
- module::event("photo_edit_form", $photo, $form);
+ module::event("item_edit_form", $photo, $form);
$group->submit("")->value(t("Modify"));
$form->add_rules_from(ORM::factory("item"));
diff --git a/modules/tag/helpers/tag.php b/modules/tag/helpers/tag.php
index ba8a438e..1fb2e940 100644
--- a/modules/tag/helpers/tag.php
+++ b/modules/tag/helpers/tag.php
@@ -51,59 +51,6 @@ class tag_Core {
}
/**
- * Modify the tags associate with an item.
- *
- * @param Item_Model $item an item
- * @param string $new_tags_string a string of new tags name seperated by ;
- * @return null
- * @throws Exception("@todo {$tag_name} WAS_NOT_ADDED_TO {$item->id}")
- * @throws Exception("@todo {$tag_name} WAS_NOT_DELETED_TO {$item->id}")
- */
- static function update($item, $new_tags_string) {
- $old_tags = self::get_tags($item);
-
- $new_tags = preg_split("/[,;]/", $new_tags_string);
- foreach ($new_tags as $i => $new_tag) {
- $new_tags[$i] = trim($new_tag);
- }
-
- $add_tags = array_diff($new_tags, $old_tags);
- foreach ($add_tags as $tag_name) {
- if (empty($tag_name)) continue;
- $tag = ORM::factory("tag")->where("name", $tag_name)->find();
- if (!$tag->loaded) {
- $tag->name = $tag_name;
- $tag->count = 0;
- $tag->save();
- }
- if (!$tag->has($item)) {
- if (!$tag->add($item, $tag)) {
- throw new Exception("@todo {$tag->name} WAS_NOT_ADDED_TO {$item->id}");
- }
- $tag->count++;
- $tag->save();
- }
- }
-
- $del_tags = array_diff($old_tags, $new_tags);
- foreach ($del_tags as $tag_name) {
- $tag = ORM::factory("tag")->where("name", $tag_name)->find();
- if ($tag->has($item)) {
- if (!$tag->remove($item, $tag)) {
- throw new Exception("@todo {$tag->name} WAS_NOT_DELETED_TO {$item->id}");
- }
- $tag->save();
- $tag->count--;
- if ($tag->count <= 0) {
- $tag->delete();
- } else {
- $tag->save();
- }
- }
- }
- }
-
- /**
* Return the N most popular tags.
*
* @return ORM_Iterator of Tag_Model in descending tag count order
@@ -180,18 +127,24 @@ class tag_Core {
$group->submit("")->value(t("Delete Tag"));
return $form;
}
-
- static function get_tags($item) {
- $records = ORM::factory("item")
- ->select("tags.name as tag_name")
- ->join("items_tags", "items.id", "items_tags.item_id", "left")
- ->join("tags", "items_tags.tag_id", "tags.id", "left")
- ->where("items.id", $item->id)
- ->find_all();
- $tags = array();
- foreach ($records as $record) {
- $tags[] = $record->tag_name;
- }
- return $tags;
+
+ /**
+ * Delete all tags associated with an item
+ */
+ static function clear_all($item) {
+ $db = Database::instance();
+ $db->query("UPDATE {tags} SET `count` = `count` - 1 WHERE `count` > 0 " .
+ "AND `id` IN (SELECT `tag_id` from {items_tags} WHERE `item_id` = $item->id)");
+ $db->delete("items_tags", array("item_id" => "$item->id"));
+ }
+
+ /**
+ * Get rid of any tags that have no associated items.
+ */
+ static function compact() {
+ // @todo There's a potential race condition here which we can solve by adding a lock around
+ // this and all the cases where we create/update tags. I'm loathe to do that since it's an
+ // extremely rare case.
+ Database::instance() ->delete("tags", array("count" => 0));
}
} \ No newline at end of file
diff --git a/modules/tag/helpers/tag_event.php b/modules/tag/helpers/tag_event.php
index 0b9504b3..d13d1340 100644
--- a/modules/tag/helpers/tag_event.php
+++ b/modules/tag/helpers/tag_event.php
@@ -60,29 +60,23 @@ class tag_event_Core {
}
static function item_deleted($item) {
- $db = Database::instance();
- $db->query("UPDATE {tags} SET `count` = `count` - 1 WHERE `count` > 0 " .
- "AND `id` IN (SELECT `tag_id` from {items_tags} WHERE `item_id` = $item->id)");
- $db->query("DELETE FROM {tags} WHERE `count` = 0 AND `id` IN (" .
- "SELECT `tag_id` from {items_tags} WHERE `item_id` = $item->id)");
- $db->delete("items_tags", array("item_id" => "$item->id"));
+ tag::clear_all($item);
+ tag::compact();
}
-
- static function album_edit_form($album, $form) {
- $tag_value = implode('; ', tag::get_tags($album));
- $form->edit_album->input("tags")->label(t("Tags ( seperate by , or ; )"))->value($tag_value);
- }
-
- static function album_edit_form_completed($album, $form) {
- tag::update($album, $form->edit_album->tags->value);
- }
-
- static function photo_edit_form($photo, $form) {
- $tag_value = implode('; ', tag::get_tags($photo));
- $form->edit_photo->input("tags")->label(t("Tags ( seperate by , or ; )"))->value($tag_value);
+
+ static function item_edit_form($item, $form) {
+ $tag_value = implode("; ", tag::item_tags($item));
+ $form->edit_item->input("tags")->label(t("Tags (separate by , or ;)"))
+ ->value($tag_value);
}
-
- static function photo_edit_form_completed($photo, $form) {
- tag::update($photo, $form->edit_photo->tags->value);
+
+ static function item_edit_form_completed($item, $form) {
+ tag::clear_all($item);
+ foreach (preg_split("/[,;]/", $form->edit_item->tags->value) as $tag_name) {
+ if ($tag_name) {
+ tag::add($item, $tag_name);
+ }
+ }
+ tag::compact();
}
}