From 7863aa16f9304e3c457898f22bce035bf4fedfd8 Mon Sep 17 00:00:00 2001
From: Bharat Mediratta
Date: Sat, 8 Aug 2009 14:30:21 -0700
Subject: 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.
---
modules/comment/helpers/comment_installer.php | 13 ++++++--
modules/search/helpers/search_event.php | 5 ---
modules/tag/models/tag.php | 48 +++++++++++++++++++++++++++
3 files changed, 58 insertions(+), 8 deletions(-)
(limited to 'modules')
diff --git a/modules/comment/helpers/comment_installer.php b/modules/comment/helpers/comment_installer.php
index f54913c3..edf2427c 100644
--- a/modules/comment/helpers/comment_installer.php
+++ b/modules/comment/helpers/comment_installer.php
@@ -52,8 +52,8 @@ class comment_installer {
}
static function upgrade($version) {
+ $db = Database::instance();
if ($version == 1) {
- $db = Database::instance();
$db->query("ALTER TABLE {comments} CHANGE `state` `state` varchar(15) default 'unpublished'");
module::set_version("comment", 2);
}
@@ -61,9 +61,16 @@ class comment_installer {
static function uninstall() {
$db = Database::instance();
- $sql = "SELECT `item_id` FROM {comments}";
- module::event("item_related_update_batch", $sql);
+ // Notify listeners that we're deleting some data. This is probably going to be very
+ // inefficient for large uninstalls, and we could make it better by doing things like passing
+ // a SQL fragment through so that the listeners could use subselects. But by using a single,
+ // simple event API we lighten the load on module developers.
+ foreach (ORM::factory("item")
+ ->join("comments", "items.id", "comments.item_id")
+ ->find_all() as $item) {
+ module::event("item_related_update", $item);
+ }
$db->query("DROP TABLE IF EXISTS {comments};");
}
}
diff --git a/modules/search/helpers/search_event.php b/modules/search/helpers/search_event.php
index b65763af..836bbe15 100644
--- a/modules/search/helpers/search_event.php
+++ b/modules/search/helpers/search_event.php
@@ -35,9 +35,4 @@ class search_event_Core {
static function item_related_update($item) {
search::update($item);
}
-
- static function item_related_update_batch($sql) {
- $db = Database::instance();
- $db->query("UPDATE {search_records} SET `dirty` = 1 WHERE item_id IN ($sql)");
- }
}
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
--
cgit v1.2.3
From cb1ae141bb65a5da42e94910214abbf5ac367920 Mon Sep 17 00:00:00 2001
From: Tim Almdal
Date: Sat, 8 Aug 2009 15:46:53 -0700
Subject: Create an new option 'immediate' and if set to true then don't try to
set up click events, but just show the dialog. Also remove the destroy
method and put all the cleanup into the dialog close handler
---
lib/gallery.dialog.js | 88 ++++++++++++++--------------
modules/gallery/js/quick.js | 2 +-
modules/gallery/views/after_install.html.php | 2 +-
3 files changed, 47 insertions(+), 45 deletions(-)
(limited to 'modules')
diff --git a/lib/gallery.dialog.js b/lib/gallery.dialog.js
index 51ebb21a..9aebd455 100644
--- a/lib/gallery.dialog.js
+++ b/lib/gallery.dialog.js
@@ -2,56 +2,54 @@
$.widget("ui.gallery_dialog", {
_init: function() {
var self = this;
- this.element.click(function(event){
- event.preventDefault();
- var element = event.currentTarget;
- var sHref = $(element).attr("href");
- var sTitle = $(element).attr("title");
- var eDialog = '';
-
- $("body").append(eDialog);
+ var options = self.options;
+ if (!self.options.immediate) {
+ this.element.click(function(event) {
+ event.preventDefault();
+ self._show($(event.currentTarget).attr("href"));
+ return false;
+ });
+ } else {
+ self._show(this.element.attr("href"));
+ }
+ },
- if (!self.options.close) {
- self.options.close = self.close_dialog;
- }
- $("#gDialog").dialog(self.options);
+ _show: function(sHref) {
+ var self = this;
+ var eDialog = '';
- $("#gDialog").gallery_show_loading();
+ $("body").append(eDialog);
- $.get(sHref, function(data) {
- $("#gDialog").html(data).gallery_show_loading();
+ if (!self.options.close) {
+ self.options.close = self.close_dialog;
+ }
+ $("#gDialog").dialog(self.options);
- if ($("#gDialog form").length) {
- self._trigger("form_loaded", null, $("#gDialog form"));
- }
- self._layout();
+ $("#gDialog").gallery_show_loading();
- $("#gDialog").dialog("open");
- // Remove titlebar for progress dialogs or set title
- if ($("#gDialog #gProgress").length) {
- $(".ui-dialog-titlebar").remove();
- } else if ($("#gDialog h1").length) {
- $("#gDialog").dialog('option', 'title', $("#gDialog h1:eq(0)").html());
- } else if ($("#gDialog fieldset legend").length) {
- $("#gDialog").dialog('option', 'title', $("#gDialog fieldset legend:eq(0)").html());
- }
+ $.get(sHref, function(data) {
+ $("#gDialog").html(data).gallery_show_loading();
- if ($("#gDialog form").length) {
- self._ajaxify_dialog();
- }
- });
- $("#gDialog").dialog("option", "self", self);
- return false;
- });
- },
+ if ($("#gDialog form").length) {
+ self._trigger("form_loaded", null, $("#gDialog form"));
+ }
+ self._layout();
- destroy: function() {
- if ($("#gDialog form").length) {
- this._trigger("form_closing", null, $("#gDialog form"));
- }
- this._trigger("dialog_closing", null, $("#gDialog"));
+ $("#gDialog").dialog("open");
+ // Remove titlebar for progress dialogs or set title
+ if ($("#gDialog #gProgress").length) {
+ $(".ui-dialog-titlebar").remove();
+ } else if ($("#gDialog h1").length) {
+ $("#gDialog").dialog('option', 'title', $("#gDialog h1:eq(0)").html());
+ } else if ($("#gDialog fieldset legend").length) {
+ $("#gDialog").dialog('option', 'title', $("#gDialog fieldset legend:eq(0)").html());
+ }
- $("#gDialog").dialog("destroy").remove();
+ if ($("#gDialog form").length) {
+ self._ajaxify_dialog();
+ }
+ });
+ $("#gDialog").dialog("option", "self", self);
},
_layout: function() {
@@ -93,7 +91,11 @@
close_dialog: function (event, ui) {
var self = $("#gDialog").dialog("option", "self");
- self.destroy();
+ if ($("#gDialog form").length) {
+ self._trigger("form_closing", null, $("#gDialog form"));
+ }
+ self._trigger("dialog_closing", null, $("#gDialog"));
+ $("#gDialog").dialog("destroy").remove();
},
_ajaxify_dialog: function() {
diff --git a/modules/gallery/js/quick.js b/modules/gallery/js/quick.js
index fda6470f..dfa61c20 100644
--- a/modules/gallery/js/quick.js
+++ b/modules/gallery/js/quick.js
@@ -46,7 +46,7 @@ var quick_do = function(cont, pane, img) {
return false;
}
if (pane.hasClass("gDialogLink")) {
- openDialog(pane);
+ $(pane).gallery_dialog({immediate: 1});
} else {
img.css("opacity", "0.1");
cont.addClass("gLoadingLarge");
diff --git a/modules/gallery/views/after_install.html.php b/modules/gallery/views/after_install.html.php
index bfce46f0..76b59474 100644
--- a/modules/gallery/views/after_install.html.php
+++ b/modules/gallery/views/after_install.html.php
@@ -16,7 +16,7 @@
title="= t("Edit Your Profile") ?>"
id="gAfterInstallChangePasswordLink" class="gButtonLink ui-state-default ui-corners-all">= t("Change Password Now") ?>
--
cgit v1.2.3
From e04675470bc43b8abd792c4c1621e5c0dc61f36a Mon Sep 17 00:00:00 2001
From: Tim Almdal
Date: Sat, 8 Aug 2009 16:01:20 -0700
Subject: Forgot to save this file when i changed the value from 1 to true
---
modules/gallery/views/after_install.html.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'modules')
diff --git a/modules/gallery/views/after_install.html.php b/modules/gallery/views/after_install.html.php
index 76b59474..41e600fb 100644
--- a/modules/gallery/views/after_install.html.php
+++ b/modules/gallery/views/after_install.html.php
@@ -16,7 +16,7 @@
title="= t("Edit Your Profile") ?>"
id="gAfterInstallChangePasswordLink" class="gButtonLink ui-state-default ui-corners-all">= t("Change Password Now") ?>
--
cgit v1.2.3