summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDries Buytaert <dries@buytaert.net>2007-02-12 17:47:08 +0000
committerDries Buytaert <dries@buytaert.net>2007-02-12 17:47:08 +0000
commit72501e54df0e0de2e9690f69bdf84d5517e60966 (patch)
treeef620ce86538ae90770002deb9b87a25a8ec9754
parent35ce6daa28cdc6d687a6cef1b009d67348946a21 (diff)
downloadbrdo-72501e54df0e0de2e9690f69bdf84d5517e60966.tar.gz
brdo-72501e54df0e0de2e9690f69bdf84d5517e60966.tar.bz2
- Patch #115667 by rotzi: added versioning support to node terms.
-rw-r--r--CHANGELOG.txt1
-rw-r--r--modules/forum/forum.module2
-rw-r--r--modules/system/system.install38
-rw-r--r--modules/taxonomy/taxonomy.module70
4 files changed, 82 insertions, 29 deletions
diff --git a/CHANGELOG.txt b/CHANGELOG.txt
index 5475095d2..868871555 100644
--- a/CHANGELOG.txt
+++ b/CHANGELOG.txt
@@ -2,6 +2,7 @@
Drupal 6.0, xxxx-xx-xx (development version)
------------------------
+- added versioning support to node terms
- made it easier to theme the forum overview page
- Drupal works with error reporting set to E_ALL
diff --git a/modules/forum/forum.module b/modules/forum/forum.module
index 31103456b..c3cf18cf3 100644
--- a/modules/forum/forum.module
+++ b/modules/forum/forum.module
@@ -396,7 +396,7 @@ function forum_form(&$node) {
$form['title'] = array('#type' => 'textfield', '#title' => check_plain($type->title_label), '#default_value' => !empty($node->title) ? $node->title : '', '#required' => TRUE, '#weight' => -5);
if (!empty($node->nid)) {
- $forum_terms = taxonomy_node_get_terms_by_vocabulary(_forum_get_vid(), $node->nid);
+ $forum_terms = taxonomy_node_get_terms_by_vocabulary(_forum_get_vid(), $node);
// if editing, give option to leave shadows
$shadow = (count($forum_terms) > 1);
$form['shadow'] = array('#type' => 'checkbox', '#title' => t('Leave shadow copy'), '#default_value' => $shadow, '#description' => t('If you move this topic, you can leave a link in the old forum to the new forum.'));
diff --git a/modules/system/system.install b/modules/system/system.install
index 7c9bb13ee..44ecdde6d 100644
--- a/modules/system/system.install
+++ b/modules/system/system.install
@@ -518,10 +518,12 @@ function system_install() {
db_query("CREATE TABLE {term_node} (
nid int unsigned NOT NULL default '0',
+ vid int unsigned NOT NULL default '0',
tid int unsigned NOT NULL default '0',
KEY nid (nid),
+ KEY vid (vid),
KEY tid (tid),
- PRIMARY KEY (tid,nid)
+ PRIMARY KEY (vid,tid,nid)
) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
db_query("CREATE TABLE {term_relation} (
@@ -992,10 +994,12 @@ function system_install() {
db_query("CREATE TABLE {term_node} (
nid int_unsigned NOT NULL default '0',
+ vid int_unsigned NOT NULL default '0',
tid int_unsigned NOT NULL default '0',
- PRIMARY KEY (tid,nid)
+ PRIMARY KEY (tid,nid,vid)
)");
db_query("CREATE INDEX {term_node}_nid_idx ON {term_node} (nid)");
+ db_query("CREATE INDEX {term_node}_vid_idx ON {term_node} (vid)");
db_query("CREATE INDEX {term_node}_tid_idx ON {term_node} (tid)");
db_query("CREATE TABLE {term_relation} (
@@ -3545,6 +3549,36 @@ function system_update_2000() {
}
/**
+ * Add version id column to {term_node} to allow taxonomy module to use revisions.
+ */
+function system_update_2001() {
+ $ret = array();
+ // Add revision id to term-node relation.
+ switch ($GLOBALS['db_type']) {
+ case 'mysql':
+ case 'mysqli':
+ $ret[] = update_sql("ALTER TABLE {term_node} ADD vid int NOT NULL default '0'");
+ $ret[] = update_sql('ALTER TABLE {term_node} DROP PRIMARY KEY');
+ $ret[] = update_sql('ALTER TABLE {term_node} ADD PRIMARY KEY (tid,nid,vid)');
+ $ret[] = update_sql('ALTER TABLE {term_node} ADD KEY vid (vid)');
+ break;
+
+ case 'pgsql':
+ db_add_column($ret, 'term_node', 'vid', 'int', array('not null' => TRUE, 'default' => 0));
+ $ret[] = update_sql("ALTER TABLE {term_node} DROP CONSTRAINT {term_node}_pkey");
+ $ret[] = update_sql("ALTER TABLE {term_node} ADD PRIMARY KEY (tid,nid,vid)");
+ $ret[] = update_sql("CREATE INDEX {term_node}_vid_idx ON {term_node} (vid)");
+ break;
+ }
+ // Update all entries with the current revision number.
+ $nodes = db_query('SELECT nid, vid FROM {node}');
+ while ($node = db_fetch_object($nodes)) {
+ db_query('UPDATE {term_node} SET vid = %d WHERE nid = %d', $node->vid, $node->nid);
+ }
+ return $ret;
+}
+
+/**
* @} End of "defgroup updates-5.0-to-x.x"
* The next series of updates should start at 3000.
*/
diff --git a/modules/taxonomy/taxonomy.module b/modules/taxonomy/taxonomy.module
index 48919e3ee..b6f370a51 100644
--- a/modules/taxonomy/taxonomy.module
+++ b/modules/taxonomy/taxonomy.module
@@ -658,7 +658,7 @@ function taxonomy_form_alter($form_id, &$form) {
$node = $form['#node'];
if (!isset($node->taxonomy)) {
- $terms = empty($node->nid) ? array() : taxonomy_node_get_terms($node->nid);
+ $terms = empty($node->nid) ? array() : taxonomy_node_get_terms($node);
}
else {
$terms = $node->taxonomy;
@@ -730,8 +730,8 @@ function taxonomy_form_alter($form_id, &$form) {
/**
* Find all terms associated with the given node, within one vocabulary.
*/
-function taxonomy_node_get_terms_by_vocabulary($nid, $vid, $key = 'tid') {
- $result = db_query(db_rewrite_sql('SELECT t.tid, t.* FROM {term_data} t INNER JOIN {term_node} r ON r.tid = t.tid WHERE t.vid = %d AND r.nid = %d ORDER BY weight', 't', 'tid'), $vid, $nid);
+function taxonomy_node_get_terms_by_vocabulary($node, $vid, $key = 'tid') {
+ $result = db_query(db_rewrite_sql('SELECT t.tid, t.* FROM {term_data} t INNER JOIN {term_node} r ON r.tid = t.tid WHERE t.vid = %d AND r.vid = %d ORDER BY weight', 't', 'tid'), $vid, $node->vid);
$terms = array();
while ($term = db_fetch_object($result)) {
$terms[$term->$key] = $term;
@@ -742,17 +742,17 @@ function taxonomy_node_get_terms_by_vocabulary($nid, $vid, $key = 'tid') {
/**
* Find all terms associated with the given node, ordered by vocabulary and term weight.
*/
-function taxonomy_node_get_terms($nid, $key = 'tid') {
+function taxonomy_node_get_terms($node, $key = 'tid') {
static $terms;
- if (!isset($terms[$nid])) {
- $result = db_query(db_rewrite_sql('SELECT t.* FROM {term_node} r INNER JOIN {term_data} t ON r.tid = t.tid INNER JOIN {vocabulary} v ON t.vid = v.vid WHERE r.nid = %d ORDER BY v.weight, t.weight, t.name', 't', 'tid'), $nid);
- $terms[$nid] = array();
+ if (!isset($terms[$node->vid])) {
+ $result = db_query(db_rewrite_sql('SELECT t.* FROM {term_node} r INNER JOIN {term_data} t ON r.tid = t.tid INNER JOIN {vocabulary} v ON t.vid = v.vid WHERE r.vid = %d ORDER BY v.weight, t.weight, t.name', 't', 'tid'), $node->vid);
+ $terms[$node->vid] = array();
while ($term = db_fetch_object($result)) {
- $terms[$nid][$term->$key] = $term;
+ $terms[$node->vid][$term->$key] = $term;
}
}
- return $terms[$nid];
+ return $terms[$node->vid];
}
/**
@@ -777,8 +777,9 @@ function taxonomy_node_validate(&$node) {
/**
* Save term associations for a given node.
*/
-function taxonomy_node_save($nid, $terms) {
- taxonomy_node_delete($nid);
+function taxonomy_node_save($node, $terms) {
+
+ taxonomy_node_delete_revision($node);
// Free tagging vocabularies do not send their tids in the form,
// so we'll detect them here and process them independently.
@@ -820,7 +821,7 @@ function taxonomy_node_save($nid, $terms) {
// Defend against duplicate, differently cased tags
if (!isset($inserted[$typed_term_tid])) {
- db_query('INSERT INTO {term_node} (nid, tid) VALUES (%d, %d)', $nid, $typed_term_tid);
+ db_query('INSERT INTO {term_node} (nid, vid, tid) VALUES (%d, %d, %d)', $node->nid, $node->vid, $typed_term_tid);
$inserted[$typed_term_tid] = TRUE;
}
}
@@ -832,15 +833,15 @@ function taxonomy_node_save($nid, $terms) {
if (is_array($term)) {
foreach ($term as $tid) {
if ($tid) {
- db_query('INSERT INTO {term_node} (nid, tid) VALUES (%d, %d)', $nid, $tid);
+ db_query('INSERT INTO {term_node} (nid, vid, tid) VALUES (%d, %d, %d)', $node->nid, $node->vid, $tid);
}
}
}
else if (is_object($term)) {
- db_query('INSERT INTO {term_node} (nid, tid) VALUES (%d, %d)', $nid, $term->tid);
+ db_query('INSERT INTO {term_node} (nid, vid, tid) VALUES (%d, %d, %d)', $node->nid, $node->vid, $term->tid);
}
else if ($term) {
- db_query('INSERT INTO {term_node} (nid, tid) VALUES (%d, %d)', $nid, $term);
+ db_query('INSERT INTO {term_node} (nid, vid, tid) VALUES (%d, %d, %d)', $node->nid, $node->vid, $term);
}
}
}
@@ -849,8 +850,15 @@ function taxonomy_node_save($nid, $terms) {
/**
* Remove associations of a node to its terms.
*/
-function taxonomy_node_delete($nid) {
- db_query('DELETE FROM {term_node} WHERE nid = %d', $nid);
+function taxonomy_node_delete($node) {
+ db_query('DELETE FROM {term_node} WHERE nid = %d', $node->nid);
+}
+
+/**
+ * Remove associations of a node to its terms.
+ */
+function taxonomy_node_delete_revision($node) {
+ db_query('DELETE FROM {term_node} WHERE vid = %d', $node->vid);
}
/**
@@ -1036,10 +1044,10 @@ function taxonomy_term_count_nodes($tid, $type = 0) {
if (!isset($count[$type])) {
// $type == 0 always evaluates TRUE if $type is a string
if (is_numeric($type)) {
- $result = db_query(db_rewrite_sql('SELECT t.tid, COUNT(n.nid) AS c FROM {term_node} t INNER JOIN {node} n ON t.nid = n.nid WHERE n.status = 1 GROUP BY t.tid'));
+ $result = db_query(db_rewrite_sql('SELECT t.tid, COUNT(n.nid) AS c FROM {term_node} t INNER JOIN {node} n ON t.vid = n.vid WHERE n.status = 1 GROUP BY t.tid'));
}
else {
- $result = db_query(db_rewrite_sql("SELECT t.tid, COUNT(n.nid) AS c FROM {term_node} t INNER JOIN {node} n ON t.nid = n.nid WHERE n.status = 1 AND n.type = '%s' GROUP BY t.tid"), $type);
+ $result = db_query(db_rewrite_sql("SELECT t.tid, COUNT(n.nid) AS c FROM {term_node} t INNER JOIN {node} n ON t.vid = n.vid WHERE n.status = 1 AND n.type = '%s' GROUP BY t.tid"), $type);
}
while ($term = db_fetch_object($result)) {
$count[$type][$term->tid] = $term->c;
@@ -1217,14 +1225,14 @@ function taxonomy_select_nodes($tids = array(), $operator = 'or', $depth = 0, $p
if ($operator == 'or') {
$str_tids = implode(',', call_user_func_array('array_merge', $descendant_tids));
- $sql = 'SELECT DISTINCT(n.nid), n.sticky, n.title, n.created FROM {node} n INNER JOIN {term_node} tn ON n.nid = tn.nid WHERE tn.tid IN ('. $str_tids .') AND n.status = 1 ORDER BY '. $order;
- $sql_count = 'SELECT COUNT(DISTINCT(n.nid)) FROM {node} n INNER JOIN {term_node} tn ON n.nid = tn.nid WHERE tn.tid IN ('. $str_tids .') AND n.status = 1';
+ $sql = 'SELECT DISTINCT(n.nid), n.sticky, n.title, n.created FROM {node} n INNER JOIN {term_node} tn ON n.vid = t.vid WHERE tn.tid IN ('. $str_tids .') AND n.status = 1 ORDER BY '. $order;
+ $sql_count = 'SELECT COUNT(DISTINCT(n.nid)) FROM {node} n INNER JOIN {term_node} tn ON n.vid = tn.vid WHERE tn.tid IN ('. $str_tids .') AND n.status = 1';
}
else {
$joins = '';
$wheres = '';
foreach ($descendant_tids as $index => $tids) {
- $joins .= ' INNER JOIN {term_node} tn'. $index .' ON n.nid = tn'. $index .'.nid';
+ $joins .= ' INNER JOIN {term_node} tn'. $index .' ON n.vid = tn'. $index .'.vid';
$wheres .= ' AND tn'. $index .'.tid IN ('. implode(',', $tids) .')';
}
$sql = 'SELECT DISTINCT(n.nid), n.sticky, n.title, n.created FROM {node} n '. $joins .' WHERE n.status = 1 '. $wheres .' ORDER BY '. $order;
@@ -1266,22 +1274,32 @@ function taxonomy_render_nodes($result) {
function taxonomy_nodeapi($node, $op, $arg = 0) {
switch ($op) {
case 'load':
- $output['taxonomy'] = taxonomy_node_get_terms($node->nid);
+ $output['taxonomy'] = taxonomy_node_get_terms($node);
return $output;
+
case 'insert':
- taxonomy_node_save($node->nid, $node->taxonomy);
+ taxonomy_node_save($node, $node->taxonomy);
break;
+
case 'update':
- taxonomy_node_save($node->nid, $node->taxonomy);
+ taxonomy_node_save($node, $node->taxonomy);
break;
+
case 'delete':
- taxonomy_node_delete($node->nid);
+ taxonomy_node_delete($node);
+ break;
+
+ case 'delete revision':
+ taxonomy_node_delete_revision($node);
break;
+
case 'validate':
taxonomy_node_validate($node);
break;
+
case 'rss item':
return taxonomy_rss_item($node);
+
case 'update index':
return taxonomy_node_update_index($node);
}