diff options
author | Bharat Mediratta <bharat@menalto.com> | 2009-08-08 14:30:21 -0700 |
---|---|---|
committer | Bharat Mediratta <bharat@menalto.com> | 2009-08-08 14:30:21 -0700 |
commit | 7863aa16f9304e3c457898f22bce035bf4fedfd8 (patch) | |
tree | d05aa44709fa2c75137892dc937339d9623be327 /modules/tag/models | |
parent | e4eec71efa5f7b1902155a34f8655cebe523c358 (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.php | 48 |
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 |