summaryrefslogtreecommitdiff
path: root/modules/tag
diff options
context:
space:
mode:
authorhiwilson <wilsonpscheung@gmail.com>2009-07-19 17:02:20 +0800
committerBharat Mediratta <bharat@menalto.com>2009-07-20 08:02:07 -0700
commit709d6c5faf7ece54046c0e2bc431a559a6b9d735 (patch)
tree406c770bd7d549e51076fe9f5f2813a43a8260f7 /modules/tag
parent33d0b82d024df8fd85798cc4f6b9bab377f4f783 (diff)
(1)Add tag edit field in album/photo edit form. (2)provide edit functionality. (3)support multi-word tagging.
Diffstat (limited to 'modules/tag')
-rw-r--r--modules/tag/helpers/tag.php67
-rw-r--r--modules/tag/helpers/tag_event.php18
2 files changed, 85 insertions, 0 deletions
diff --git a/modules/tag/helpers/tag.php b/modules/tag/helpers/tag.php
index ab5ee303..ba8a438e 100644
--- a/modules/tag/helpers/tag.php
+++ b/modules/tag/helpers/tag.php
@@ -51,6 +51,59 @@ 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
@@ -127,4 +180,18 @@ 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;
+ }
} \ No newline at end of file
diff --git a/modules/tag/helpers/tag_event.php b/modules/tag/helpers/tag_event.php
index 0164f556..0b9504b3 100644
--- a/modules/tag/helpers/tag_event.php
+++ b/modules/tag/helpers/tag_event.php
@@ -67,4 +67,22 @@ class tag_event_Core {
"SELECT `tag_id` from {items_tags} WHERE `item_id` = $item->id)");
$db->delete("items_tags", array("item_id" => "$item->id"));
}
+
+ 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 photo_edit_form_completed($photo, $form) {
+ tag::update($photo, $form->edit_photo->tags->value);
+ }
}