summaryrefslogtreecommitdiff
path: root/modules/tag/models
diff options
context:
space:
mode:
authorBharat Mediratta <bharat@menalto.com>2009-08-08 14:30:21 -0700
committerBharat Mediratta <bharat@menalto.com>2009-08-08 14:30:21 -0700
commit7863aa16f9304e3c457898f22bce035bf4fedfd8 (patch)
treed05aa44709fa2c75137892dc937339d9623be327 /modules/tag/models
parente4eec71efa5f7b1902155a34f8655cebe523c358 (diff)
Update tags module to notify modules when items related to a tag are
affected. Practically speaking this means that we'll reindex items when tags are added or removed from them. API change: Remove item_related_updated_batch event. Rationale: While this is an efficient event, it requires module developers to support two event APIs for staying up to date and increases the likelihood that they'll forget one and have data corruption. Force them all through the slower but more reliable pipe, for now. We can always try to improve efficiency by using the batch_start and batch_stop events.
Diffstat (limited to 'modules/tag/models')
-rw-r--r--modules/tag/models/tag.php48
1 files changed, 48 insertions, 0 deletions
diff --git a/modules/tag/models/tag.php b/modules/tag/models/tag.php
index e910a8ee..d9488e1c 100644
--- a/modules/tag/models/tag.php
+++ b/modules/tag/models/tag.php
@@ -54,4 +54,52 @@ class Tag_Model extends ORM {
}
return $model->count_all();
}
+
+ /**
+ * Overload ORM::save() to trigger an item_related_update event for all items that are related
+ * to this tag. Since items can be added or removed as part of the save, we need to trigger an
+ * event for the union of all related items before and after the save.
+ */
+ public function save() {
+ $db = Database::instance();
+ $related_item_ids = array();
+ foreach ($db->getwhere("items_tags", array("tag_id" => $this->id)) as $row) {
+ $related_item_ids[$row->item_id] = 1;
+ }
+
+ $result = parent::save();
+
+ foreach ($db->getwhere("items_tags", array("tag_id" => $this->id)) as $row) {
+ $related_item_ids[$row->item_id] = 1;
+ }
+
+ if ($related_item_ids) {
+ foreach (ORM::factory("item")->in("id", array_keys($related_item_ids))->find_all() as $item) {
+ module::event("item_related_update", $item);
+ }
+ }
+
+ return $result;
+ }
+
+ /**
+ * Overload ORM::delete() to trigger an item_related_update event for all items that are
+ * related to this tag.
+ */
+ public function delete() {
+ $related_item_ids = array();
+ $db = Database::Instance();
+ foreach ($db->getwhere("items_tags", array("tag_id" => $this->id)) as $row) {
+ $related_item_ids[$row->item_id] = 1;
+ }
+
+ $result = parent::delete();
+
+ if ($related_item_ids) {
+ foreach (ORM::factory("item")->in("id", array_keys($related_item_ids))->find_all() as $item) {
+ module::event("item_related_update", $item);
+ }
+ }
+ return $result;
+ }
} \ No newline at end of file