? nodequeue-taxonomy-fixes.patch
Index: nodequeue.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/nodequeue/nodequeue.module,v
retrieving revision 1.39.2.28.2.22
diff -u -p -r1.39.2.28.2.22 nodequeue.module
--- nodequeue.module	10 Oct 2007 23:07:37 -0000	1.39.2.28.2.22
+++ nodequeue.module	3 Dec 2007 16:50:12 -0000
@@ -1759,13 +1759,14 @@ function nodequeue_add_subqueue(&$queue,
  * reflect updates in taxonomy term names, for example.
  */
 function nodequeue_subqueue_update_title($sqid, $title) {
-  db_query("UPDATE {nodequeue_subqueue} SET title = '%s' WHERE $sqid = %d", $title, $sqid);
+  db_query("UPDATE {nodequeue_subqueue} SET title = '%s' WHERE sqid = %d", $title, $sqid);
 }
 
 /**
- * Remove an a subqueue.
+ * Remove a subqueue.
  */
 function nodequeue_remove_subqueue($sqid) {
+  nodequeue_queue_clear($sqid);
   db_query("DELETE FROM {nodequeue_subqueue} WHERE sqid = %d", $sqid);
 }
 
Index: smartqueue.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/nodequeue/Attic/smartqueue.module,v
retrieving revision 1.1.2.4
diff -u -p -r1.1.2.4 smartqueue.module
--- smartqueue.module	16 Aug 2007 00:06:04 -0000	1.1.2.4
+++ smartqueue.module	3 Dec 2007 16:50:12 -0000
@@ -161,9 +161,50 @@ function smartqueue_taxonomy_get_terms($
 
 
 // TODO:
-// Implement hook_taxonomy to delete subqueues when terms are deleted.
-// And to update titles when taxonomy terms are changed.
-function smartqueue_taxonomy_taxonomy($op, $type, $array = NULL) {
-  // Since this is a relatively rare operation, and I'm out of time for this
-  // project, I'm leaving this for some enterprising developer who needs this.
+// * Automatically add subqueues when terms are created.
+// * Handle vocabulary changes (maybe?)
+/**
+ * Implementation of hook_taxonomy.
+ */
+function smartqueue_taxonomy($op, $type, $array = NULL) {
+  switch ($type) {
+    case 'term':
+      switch ($op){
+        // If a term was updated, we need to update any relevant nodequeue titles.
+        case 'update':
+          $tid = $array['tid'];
+          // Find subqueues that contain this term.
+          $result = db_query(
+            "SELECT nq.reference AS reference, sq.reference AS sqref, sq.sqid
+            FROM {nodequeue_queue} nq
+            INNER JOIN {nodequeue_subqueue} sq ON nq.qid = sq.qid
+            WHERE sq.reference = '%d' OR sq.reference LIKE '%%-%d'
+            OR sq.reference LIKE '%d-%%' OR sq.reference LIKE '%%-%d-%%'",
+            $tid, $tid, $tid, $tid
+          );
+          while ($row = db_fetch_object($result)) {
+            // Note that $row already contains the needed $row->reference.
+            $title = smartqueue_taxonomy_nodequeue_subqueue_title($row, $row->sqref);
+            nodequeue_subqueue_update_title($row->sqid, $title);
+          }
+          break;
+
+        // If a term was deleted, we need to delete any subqueues containing it.
+        case 'delete':
+          $tid = $array['tid'];
+          // Find subqueues that contain this term.
+          $result = db_query(
+            "SELECT sqid FROM {nodequeue_subqueue}
+            WHERE reference = '%d' OR reference LIKE '%%-%d'
+            OR reference LIKE '%d-%%' OR reference LIKE '%%-%d-%%'",
+            $tid, $tid, $tid, $tid
+          );
+          while ($row = db_fetch_object($result)) {
+            nodequeue_remove_subqueue($row->sqid);
+          }
+          break;
+      }
+    case 'vocabulary':
+      break;
+  }
 }
