summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
authorDries Buytaert <dries@buytaert.net>2009-04-15 14:12:55 +0000
committerDries Buytaert <dries@buytaert.net>2009-04-15 14:12:55 +0000
commit383f7e5721a69668a2f95b84649b7ff1770bc9f5 (patch)
treefd1e96b174c1a9225e1b9ac462dc98769412fbb8 /modules
parentbd93e7279d50ca5a1afbf6d776d68e21aec9d7ab (diff)
downloadbrdo-383f7e5721a69668a2f95b84649b7ff1770bc9f5.tar.gz
brdo-383f7e5721a69668a2f95b84649b7ff1770bc9f5.tar.bz2
- Patch #302412 by Berdir: converted more of taxonomy module to the new database abstraction layer.
Diffstat (limited to 'modules')
-rw-r--r--modules/taxonomy/taxonomy.admin.inc31
-rw-r--r--modules/taxonomy/taxonomy.module390
-rw-r--r--modules/taxonomy/taxonomy.pages.inc44
3 files changed, 335 insertions, 130 deletions
diff --git a/modules/taxonomy/taxonomy.admin.inc b/modules/taxonomy/taxonomy.admin.inc
index fdb96f68c..bdddea75d 100644
--- a/modules/taxonomy/taxonomy.admin.inc
+++ b/modules/taxonomy/taxonomy.admin.inc
@@ -265,9 +265,29 @@ function taxonomy_overview_terms(&$form_state, $vocabulary) {
if ($vocabulary->tags) {
// We are not calling taxonomy_get_tree because that might fail with a big
// number of tags in the freetagging vocabulary.
- $results = pager_query(db_rewrite_sql('SELECT t.*, h.parent FROM {taxonomy_term_data} t INNER JOIN {taxonomy_term_hierarchy} h ON t.tid = h.tid WHERE t.vid = %d ORDER BY weight, name', 't', 'tid'), $page_increment, 0, NULL, $vocabulary->vid);
- $total_entries = db_query(db_rewrite_sql('SELECT COUNT(*) FROM {taxonomy_term_data} t INNER JOIN {taxonomy_term_hierarchy} h ON t.tid = h.tid WHERE t.vid = :vid'), array(':vid' => $vocabulary->vid));
- while ($term = db_fetch_object($results)) {
+ $query = db_select('taxonomy_term_data', 't')->extend('PagerDefault');
+ $query->join('taxonomy_term_hierarchy', 'h', 't.tid = h.tid');
+ $query->addTag('term_access');
+ $query->condition('t.vid', $vocabulary->vid);
+
+ // Store count in total entries and use this as count query.
+ $count_query = db_select('taxonomy_term_data', 't');
+ $count_query->join('taxonomy_term_hierarchy', 'h', 't.tid = h.tid');
+ $count_query->addTag('term_access');
+ $count_query->condition('t.vid', $vocabulary->vid);
+ $count_query->addExpression('COUNT(t.tid)');
+ $total_entries = $count_query->execute();
+ $query->setCountQuery($count_query);
+
+ $result = $query
+ ->fields('t')
+ ->fields('h', array('parent'))
+ ->orderBy('weight')
+ ->orderBy('name')
+ ->limit($page_increment)
+ ->execute();
+
+ foreach ($result as $term) {
$key = 'tid:' . $term->tid . ':0';
$current_page[$key] = $term;
$page_entries++;
@@ -903,7 +923,10 @@ function taxonomy_vocabulary_confirm_reset_alphabetical(&$form_state, $vid) {
* @see taxonomy_vocabulary_confirm_reset_alphabetical()
*/
function taxonomy_vocabulary_confirm_reset_alphabetical_submit($form, &$form_state) {
- db_query('UPDATE {taxonomy_term_data} SET weight = 0 WHERE vid = :vid', array(':vid' => $form_state['values']['vid']));
+ db_update('taxonomy_term_data')
+ ->fields(array('weight' => 0))
+ ->condition('vid', $form_state['values']['vid'])
+ ->execute();
drupal_set_message(t('Reset vocabulary %name to alphabetical order.', array('%name' => $form_state['values']['name'])));
watchdog('taxonomy', 'Reset vocabulary %name to alphabetical order.', array('%name' => $form_state['values']['name']), WATCHDOG_NOTICE);
$form_state['redirect'] = 'admin/content/taxonomy/' . $form_state['values']['vid'];
diff --git a/modules/taxonomy/taxonomy.module b/modules/taxonomy/taxonomy.module
index 8f1f3b047..5682d0e82 100644
--- a/modules/taxonomy/taxonomy.module
+++ b/modules/taxonomy/taxonomy.module
@@ -212,16 +212,36 @@ function taxonomy_vocabulary_save($vocabulary) {
if (!empty($vocabulary->vid) && !empty($vocabulary->name)) {
$status = drupal_write_record('taxonomy_vocabulary', $vocabulary, 'vid');
- db_query("DELETE FROM {taxonomy_vocabulary_node_type} WHERE vid = %d", $vocabulary->vid);
- foreach ($vocabulary->nodes as $type => $selected) {
- db_query("INSERT INTO {taxonomy_vocabulary_node_type} (vid, type) VALUES (%d, '%s')", $vocabulary->vid, $type);
+ db_delete('taxonomy_vocabulary_node_type')
+ ->condition('vid', $vocabulary->vid)
+ ->execute();
+
+ if (!empty($vocabulary->nodes)) {
+ $query = db_insert('taxonomy_vocabulary_node_type')
+ ->fields(array('vid', 'type'));
+ foreach ($vocabulary->nodes as $type => $selected) {
+ $query->values(array(
+ 'vid' => $vocabulary->vid,
+ 'type' => $type,
+ ));
+ }
+ $query->execute();
}
module_invoke_all('taxonomy_vocabulary_update', $vocabulary);
}
elseif (empty($vocabulary->vid)) {
$status = drupal_write_record('taxonomy_vocabulary', $vocabulary);
- foreach ($vocabulary->nodes as $type => $selected) {
- db_query("INSERT INTO {taxonomy_vocabulary_node_type} (vid, type) VALUES (%d, '%s')", $vocabulary->vid, $type);
+
+ if (!empty($vocabulary->nodes)) {
+ $query = db_insert('taxonomy_vocabulary_node_type')
+ ->fields(array('vid', 'type'));
+ foreach ($vocabulary->nodes as $type => $selected) {
+ $query->values(array(
+ 'vid' => $vocabulary->vid,
+ 'type' => $type,
+ ));
+ }
+ $query->execute();
}
module_invoke_all('taxonomy_vocabulary_insert', $vocabulary);
}
@@ -243,11 +263,15 @@ function taxonomy_vocabulary_save($vocabulary) {
function taxonomy_vocabulary_delete($vid) {
$vocabulary = (array) taxonomy_vocabulary_load($vid);
- db_query('DELETE FROM {taxonomy_vocabulary} WHERE vid = %d', $vid);
- db_query('DELETE FROM {taxonomy_vocabulary_node_type} WHERE vid = %d', $vid);
- $result = db_query('SELECT tid FROM {taxonomy_term_data} WHERE vid = %d', $vid);
- while ($term = db_fetch_object($result)) {
- taxonomy_term_delete($term->tid);
+ db_delete('taxonomy_vocabulary')
+ ->condition('vid', $vid)
+ ->execute();
+ db_delete('taxonomy_vocabulary_node_type')
+ ->condition('vid', $vid)
+ ->execute();
+ $result = db_query('SELECT tid FROM {taxonomy_term_data} WHERE vid = :vid', array(':vid' => $vid))->fetchCol();
+ foreach ($result as $tid) {
+ taxonomy_term_delete($tid);
}
module_invoke_all('taxonomy', 'delete', 'vocabulary', $vocabulary);
@@ -322,44 +346,75 @@ function taxonomy_term_save($term) {
module_invoke_all('taxonomy_term_update', $term);
}
- $or = db_or()->condition('tid1', $term->tid)->condition('tid2', $term->tid);
- db_delete('taxonomy_term_relation')->condition($or)->execute();
+ db_delete('taxonomy_term_relation')
+ ->condition(db_or()
+ ->condition('tid1', $term->tid)
+ ->condition('tid2', $term->tid)
+ )
+ ->execute();
if (!empty($term->relations)) {
foreach ($term->relations as $related_id) {
if ($related_id != 0) {
- db_insert('taxonomy_term_relation')->fields(array('tid1' => $term->tid, 'tid2' => $related_id))->execute();
+ db_insert('taxonomy_term_relation')
+ ->fields(array(
+ 'tid1' => $term->tid,
+ 'tid2' => $related_id
+ ))
+ ->execute();
}
}
}
- db_delete('taxonomy_term_hierarchy')->condition('tid', $term->tid)->execute();
+ db_delete('taxonomy_term_hierarchy')
+ ->condition('tid', $term->tid)
+ ->execute();
if (!isset($term->parent) || empty($term->parent)) {
$term->parent = array(0);
}
+ $query = db_insert('taxonomy_term_hierarchy')
+ ->fields(array('tid', 'parent'));
if (is_array($term->parent)) {
foreach ($term->parent as $parent) {
if (is_array($parent)) {
foreach ($parent as $tid) {
- db_insert('taxonomy_term_hierarchy')->fields(array('tid' => $term->tid, 'parent' => $tid))->execute();
+ $query->values(array(
+ 'tid' => $term->tid,
+ 'parent' => $tid
+ ));
}
}
else {
- db_insert('taxonomy_term_hierarchy')->fields(array('tid' => $term->tid, 'parent' => $parent))->execute();
+ $query->values(array(
+ 'tid' => $term->tid,
+ 'parent' => $parent
+ ));
}
}
}
else {
- db_insert('taxonomy_term_hierarchy')->fields(array('tid' => $term->tid, 'parent' => $term->parent))->execute();
+ $query->values(array(
+ 'tid' => $term->tid,
+ 'parent' => $parent
+ ));
}
+ $query->execute();
- db_delete('taxonomy_term_synonym')->condition('tid', $term->tid)->execute();
+ db_delete('taxonomy_term_synonym')
+ ->condition('tid', $term->tid)
+ ->execute();
if (!empty($term->synonyms)) {
+ $query = db_insert('taxonomy_term_synonym')
+ ->fields(array('tid', 'name'));
foreach (explode ("\n", str_replace("\r", '', $term->synonyms)) as $synonym) {
if ($synonym) {
- db_insert('taxonomy_term_synonym')->fields(array('tid' => $term->tid, 'name' => rtrim($synonym)))->execute();
+ $query->values(array(
+ 'tid' => $term->tid,
+ 'name' => rtrim($synonym)
+ ));
}
}
+ $query->execute();
}
cache_clear_all();
@@ -394,11 +449,24 @@ function taxonomy_term_delete($tid) {
$term = taxonomy_term_load($tid);
- db_query('DELETE FROM {taxonomy_term_data} WHERE tid = %d', $tid);
- db_query('DELETE FROM {taxonomy_term_hierarchy} WHERE tid = %d', $tid);
- db_query('DELETE FROM {taxonomy_term_relation} WHERE tid1 = %d OR tid2 = %d', $tid, $tid);
- db_query('DELETE FROM {taxonomy_term_synonym} WHERE tid = %d', $tid);
- db_query('DELETE FROM {taxonomy_term_node} WHERE tid = %d', $tid);
+ db_delete('taxonomy_term_data')
+ ->condition('tid', $tid)
+ ->execute();
+ db_delete('taxonomy_term_hierarchy')
+ ->condition('tid', $tid)
+ ->execute();
+ db_delete('taxonomy_term_relation')
+ ->condition(db_or()
+ ->condition('tid1', $tid)
+ ->condition('tid2', $tid)
+ )
+ ->execute();
+ db_delete('taxonomy_term_synonym')
+ ->condition('tid', $tid)
+ ->execute();
+ db_delete('taxonomy_term_node')
+ ->condition('tid', $tid)
+ ->execute();
module_invoke_all('taxonomy_term_delete', $term);
}
@@ -493,10 +561,18 @@ function taxonomy_form_alter(&$form, $form_state, $form_id) {
}
$terms = $node->taxonomy;
}
+ $query = db_select('taxonomy_vocabulary', 'v');
+ $query->join('taxonomy_vocabulary_node_type', 'n', 'v.vid = n.vid');
+ $query->addTag('term_access');
- $c = db_query(db_rewrite_sql("SELECT v.* FROM {taxonomy_vocabulary} v INNER JOIN {taxonomy_vocabulary_node_type} n ON v.vid = n.vid WHERE n.type = '%s' ORDER BY v.weight, v.name", 'v', 'vid'), $node->type);
+ $result = $query
+ ->fields('v')
+ ->condition('n.type', $node->type)
+ ->orderBy('v.weight')
+ ->orderBy('v.name')
+ ->execute();
- while ($vocabulary = db_fetch_object($c)) {
+ foreach ($result as $vocabulary) {
if ($vocabulary->tags) {
if (isset($form_state['node_preview'])) {
// Typed string can be changed by the user before preview,
@@ -592,9 +668,19 @@ function taxonomy_preview_terms($node) {
* Find all terms associated with the given node, within one vocabulary.
*/
function taxonomy_node_get_terms_by_vocabulary($node, $vid, $key = 'tid') {
- $result = db_query(db_rewrite_sql('SELECT t.tid, t.* FROM {taxonomy_term_data} t INNER JOIN {taxonomy_term_node} r ON r.tid = t.tid WHERE t.vid = %d AND r.vid = %d ORDER BY weight', 't', 'tid'), $vid, $node->vid);
+ $query = db_select('taxonomy_term_data', 't');
+ $query->join('taxonomy_term_node', 'r', 'r.tid = t.tid');
+ $query->addTag('term_access');
+
+ $result = $query
+ ->fields('t')
+ ->condition('t.vid', $vid)
+ ->condition('r.vid', $node->vid)
+ ->orderBy('weight')
+ ->execute();
+
$terms = array();
- while ($term = db_fetch_object($result)) {
+ foreach ($result as $term) {
$terms[$term->$key] = $term;
}
return $terms;
@@ -615,16 +701,18 @@ function taxonomy_get_tids_from_nodes($nodes) {
$node_vids[] = $node->vid;
}
$query = db_select('taxonomy_term_node', 'r');
- $query->fields('r', array('tid', 'nid', 'vid'));
$query->join('taxonomy_term_data', 't', 'r.tid = t.tid');
$query->join('taxonomy_vocabulary', 'v', 't.vid = v.vid');
- $query->condition('r.vid', $node_vids, 'IN');
- $query->orderBy('v.weight');
- $query->orderBy('t.weight');
- $query->orderBy('t.name');
$query->addTag('term_access');
- return $query->execute()->fetchAll();
+ return $query
+ ->fields('r', array('tid', 'nid', 'vid'))
+ ->condition('r.vid', $node_vids, 'IN')
+ ->orderBy('v.weight')
+ ->orderBy('t.weight')
+ ->orderBy('t.name')
+ ->execute()
+ ->fetchAll();
}
/**
@@ -634,9 +722,20 @@ function taxonomy_node_get_terms($node, $key = 'tid') {
$terms = &drupal_static(__FUNCTION__);
if (!isset($terms[$node->vid][$key])) {
- $result = db_query(db_rewrite_sql('SELECT t.* FROM {taxonomy_term_node} r INNER JOIN {taxonomy_term_data} t ON r.tid = t.tid INNER JOIN {taxonomy_vocabulary} v ON t.vid = v.vid WHERE r.vid = %d ORDER BY v.weight, t.weight, t.name', 't', 'tid'), $node->vid);
+ $query = db_select('taxonomy_term_node', 'r');
+ $query->join('taxonomy_term_data', 't', 'r.tid = t.tid');
+ $query->join('taxonomy_vocabulary', 'v', 't.vid = v.vid');
+ $query->addTag('term_access');
+
+ $result = $query
+ ->fields('r', array('tid', 'nid', 'vid'))
+ ->condition('r.vid', $node->vid)
+ ->orderBy('v.weight')
+ ->orderBy('t.weight')
+ ->orderBy('t.name')
+ ->execute();
$terms[$node->vid][$key] = array();
- while ($term = db_fetch_object($result)) {
+ foreach ($result as $term) {
$terms[$node->vid][$key][$term->$key] = $term;
}
}
@@ -680,29 +779,51 @@ function taxonomy_node_save($node, $terms) {
// Defend against duplicate, differently cased tags
if (!isset($inserted[$typed_term_tid])) {
- db_query('INSERT INTO {taxonomy_term_node} (nid, vid, tid) VALUES (%d, %d, %d)', $node->nid, $node->vid, $typed_term_tid);
+ db_insert('taxonomy_term_node')
+ ->fields(array(
+ 'nid' => $node->nid,
+ 'vid' => $node->vid,
+ 'tid' => $typed_term_tid
+ ))
+ ->execute();
$inserted[$typed_term_tid] = TRUE;
}
}
}
}
- if (is_array($terms)) {
+ if (is_array($terms) && !empty($terms)) {
+ $query = db_insert('taxonomy_term_node')
+ ->fields(array('nid', 'vid', 'tid'));
+
foreach ($terms as $term) {
if (is_array($term)) {
foreach ($term as $tid) {
if ($tid) {
- db_query('INSERT INTO {taxonomy_term_node} (nid, vid, tid) VALUES (%d, %d, %d)', $node->nid, $node->vid, $tid);
+ $query->values(array(
+ 'nid' => $node->nid,
+ 'vid' => $node->vid,
+ 'tid' => $tid,
+ ));
}
}
}
elseif (is_object($term)) {
- db_query('INSERT INTO {taxonomy_term_node} (nid, vid, tid) VALUES (%d, %d, %d)', $node->nid, $node->vid, $term->tid);
+ $query->values(array(
+ 'nid' => $node->nid,
+ 'vid' => $node->vid,
+ 'tid' => $term->tid,
+ ));
}
elseif ($term) {
- db_query('INSERT INTO {taxonomy_term_node} (nid, vid, tid) VALUES (%d, %d, %d)', $node->nid, $node->vid, $term);
+ $query->values(array(
+ 'nid' => $node->nid,
+ 'vid' => $node->vid,
+ 'tid' => $term,
+ ));
}
}
+ $query->execute();
}
}
@@ -711,10 +832,17 @@ function taxonomy_node_save($node, $terms) {
*/
function taxonomy_node_type($op, $info) {
if ($op == 'update' && !empty($info->old_type) && $info->type != $info->old_type) {
- db_query("UPDATE {taxonomy_vocabulary_node_type} SET type = '%s' WHERE type = '%s'", $info->type, $info->old_type);
+ db_update('taxonomy_vocabulary_node_type')
+ ->fields(array(
+ 'type' => $info->type,
+ ))
+ ->condition('type', $info->old_type)
+ ->execute();
}
elseif ($op == 'delete') {
- db_query("DELETE FROM {taxonomy_vocabulary_node_type} WHERE type = '%s'", $info->type);
+ db_delete('taxonomy_vocabulary_node_type')
+ ->condition('type', $info->type)
+ ->execute();
}
drupal_static_reset('taxonomy_term_count_nodes');
}
@@ -724,9 +852,9 @@ function taxonomy_node_type($op, $info) {
*/
function taxonomy_get_related($tid, $key = 'tid') {
if ($tid) {
- $result = db_query('SELECT t.*, tid1, tid2 FROM {taxonomy_term_relation}, {taxonomy_term_data} t WHERE (t.tid = tid1 OR t.tid = tid2) AND (tid1 = %d OR tid2 = %d) AND t.tid != %d ORDER BY weight, name', $tid, $tid, $tid);
+ $result = db_query('SELECT t.*, tid1, tid2 FROM {taxonomy_term_relation}, {taxonomy_term_data} t WHERE (t.tid = tid1 OR t.tid = tid2) AND (tid1 = :tid1 OR tid2 = :tid2) AND t.tid != :tid ORDER BY weight, name', array(':tid' => $tid, ':tid1' => $tid, 'tid2' => $tid));
$related = array();
- while ($term = db_fetch_object($result)) {
+ foreach ($result as $term) {
$related[$term->$key] = $term;
}
return $related;
@@ -741,9 +869,18 @@ function taxonomy_get_related($tid, $key = 'tid') {
*/
function taxonomy_get_parents($tid, $key = 'tid') {
if ($tid) {
- $result = db_query(db_rewrite_sql('SELECT t.tid, t.* FROM {taxonomy_term_data} t INNER JOIN {taxonomy_term_hierarchy} h ON h.parent = t.tid WHERE h.tid = %d ORDER BY weight, name', 't', 'tid'), $tid);
+ $query = db_select('taxonomy_term_data', 't');
+ $query->join('taxonomy_term_hierarchy', 'h', 'h.parent = t.tid');
+ $query->addTag('term_access');
+
+ $result = $query
+ ->fields('t')
+ ->condition('h.tid', $tid)
+ ->orderBy('weight')
+ ->orderBy('name')
+ ->execute();
$parents = array();
- while ($parent = db_fetch_object($result)) {
+ foreach ($result as $parent) {
$parents[$parent->$key] = $parent;
}
return $parents;
@@ -773,14 +910,22 @@ function taxonomy_get_parents_all($tid) {
* Find all children of a term ID.
*/
function taxonomy_get_children($tid, $vid = 0, $key = 'tid') {
+ $query = db_select('taxonomy_term_data', 't');
+ $query->join('taxonomy_term_hierarchy', 'h', 'h.tid = t.tid');
+ $query->addTag('term_access');
+
+ $query
+ ->fields('t')
+ ->condition('parent', $tid)
+ ->orderBy('weight')
+ ->orderBy('name');
if ($vid) {
- $result = db_query(db_rewrite_sql('SELECT t.* FROM {taxonomy_term_data} t INNER JOIN {taxonomy_term_hierarchy} h ON h.tid = t.tid WHERE t.vid = %d AND h.parent = %d ORDER BY weight, name', 't', 'tid'), $vid, $tid);
- }
- else {
- $result = db_query(db_rewrite_sql('SELECT t.* FROM {taxonomy_term_data} t INNER JOIN {taxonomy_term_hierarchy} h ON h.tid = t.tid WHERE parent = %d ORDER BY weight, name', 't', 'tid'), $tid);
+ $query->condition('t.vid', $vid);
}
+ $result = $query->execute();
+
$children = array();
- while ($term = db_fetch_object($result)) {
+ foreach ($result as $term) {
$children[$term->$key] = $term;
}
return $children;
@@ -818,8 +963,18 @@ function taxonomy_get_tree($vid, $parent = 0, $max_depth = NULL, $depth = -1) {
$parents[$vid] = array();
$terms[$vid] = array();
- $result = db_query(db_rewrite_sql('SELECT t.tid, t.*, parent FROM {taxonomy_term_data} t INNER JOIN {taxonomy_term_hierarchy} h ON t.tid = h.tid WHERE t.vid = %d ORDER BY weight, name', 't', 'tid'), $vid);
- while ($term = db_fetch_object($result)) {
+ $query = db_select('taxonomy_term_data', 't');
+ $query->join('taxonomy_term_hierarchy', 'h', 'h.tid = t.tid');
+ $query->addTag('term_access');
+
+ $result = $query
+ ->fields('t')
+ ->fields('h', array('parent'))
+ ->condition('t.vid', $vid)
+ ->orderBy('weight')
+ ->orderBy('name')
+ ->execute();
+ foreach ($result as $term) {
$children[$vid][$term->parent][] = $term->tid;
$parents[$vid][$term->tid][] = $term->parent;
$terms[$vid][$term->tid] = $term;
@@ -854,11 +1009,7 @@ function taxonomy_get_tree($vid, $parent = 0, $max_depth = NULL, $depth = -1) {
function taxonomy_get_synonyms($tid) {
if ($tid) {
$synonyms = array();
- $result = db_query('SELECT name FROM {taxonomy_term_synonym} WHERE tid = %d', $tid);
- while ($synonym = db_fetch_array($result)) {
- $synonyms[] = $synonym['name'];
- }
- return $synonyms;
+ return db_query('SELECT name FROM {taxonomy_term_synonym} WHERE tid = :tid', array(':tid' => $tid))->fetchCol();
}
else {
return array();
@@ -940,13 +1091,13 @@ function taxonomy_term_count_nodes($tid, $type = NULL) {
* An array of matching term objects.
*/
function taxonomy_get_term_by_name($name) {
- $db_result = db_query(db_rewrite_sql("SELECT t.tid, t.* FROM {taxonomy_term_data} t WHERE LOWER(t.name) = LOWER('%s')", 't', 'tid'), trim($name));
- $result = array();
- while ($term = db_fetch_object($db_result)) {
- $result[] = $term;
- }
+ $query = db_select('taxonomy_term_data', 't');
+ $query->addTag('term_access');
- return $result;
+ return $query
+ ->fields('t')
+ ->where("LOWER(t.name) = LOWER(:name)", array(':name' => trim($name)))
+ ->execute()->fetchAll();
}
/**
@@ -1013,10 +1164,11 @@ function taxonomy_vocabulary_load_multiple($vids = array(), $conditions = array(
// we have $vids still to load, or if no $vids were passed.
if ($vids || !$passed_vids) {
$query = db_select('taxonomy_vocabulary', 'v');
- $query->fields('v');
$query->addField('n', 'type');
- $query->orderBy('v.weight');
- $query->orderBy('v.name');
+ $query
+ ->fields('v')
+ ->orderBy('v.weight')
+ ->orderBy('v.name');
if (!empty($type)) {
$query->leftJoin('taxonomy_vocabulary_node_type', 'n', 'v.vid = n.vid AND n.type = :type', array(':type' => $type));
@@ -1229,7 +1381,7 @@ function taxonomy_get_term_data($tid) {
$terms = &drupal_static(__FUNCTION__, array());
if (!isset($terms[$tid])) {
- $terms[$tid] = db_query('SELECT * FROM {taxonomy_term_data} WHERE tid = :tid', array(':tid' => $tid))->fetchObject();
+ $terms[$tid] = db_query('SELECT * FROM {taxonomy_term_data} WHERE tid = :tid', array(':tid' => $tid))->fetch();
}
return $terms[$tid];
}
@@ -1287,52 +1439,68 @@ function theme_taxonomy_term_select($element) {
* Whether the nodes are to be used with a pager (the case on most Drupal
* pages) or not (in an XML feed, for example).
* @param $order
- * The order clause for the query that retrieve the nodes.
+ * The order clause for the query that retrieve the nodes.
+ * It is important to specifc the table alias (n).
+ *
+ * Example:
+ * array('table_alias.field_name' = 'DESC');
* @return
* An array of node IDs.
*/
-function taxonomy_select_nodes($tids = array(), $operator = 'or', $depth = 0, $pager = TRUE, $order = 'n.sticky DESC, n.created DESC') {
- if (count($tids) > 0) {
- // For each term ID, generate an array of descendant term IDs to the right depth.
- $descendant_tids = array();
- if ($depth === 'all') {
- $depth = NULL;
- }
- foreach ($tids as $index => $tid) {
- $term = taxonomy_get_term_data($tid);
- $tree = taxonomy_get_tree($term->vid, $tid, $depth);
- $descendant_tids[] = array_merge(array($tid), array_map('_taxonomy_get_tid_from_term', $tree));
- }
+function taxonomy_select_nodes($tids = array(), $operator = 'or', $depth = 0, $pager = TRUE, $order = array('n.sticky' => 'DESC', 'n.created' => 'DESC')) {
+ if (count($tids) <= 0) {
+ return array();
+ }
+ // For each term ID, generate an array of descendant term IDs to the right depth.
+ $descendant_tids = array();
+ if ($depth === 'all') {
+ $depth = NULL;
+ }
+ foreach ($tids as $index => $tid) {
+ $term = taxonomy_get_term_data($tid);
+ $tree = taxonomy_get_tree($term->vid, $tid, $depth);
+ $descendant_tids[] = array_merge(array($tid), array_map('_taxonomy_get_tid_from_term', $tree));
+ }
+
+ $query = db_select('node', 'n');
+ $query->addTag('node_access');
+ $query->condition('n.status', 1);
- if ($operator == 'or') {
+ if ($operator == 'or') {
$args = call_user_func_array('array_merge', $descendant_tids);
- $placeholders = db_placeholders($args, 'int');
- $sql = 'SELECT DISTINCT(n.nid), n.sticky, n.title, n.created FROM {node} n INNER JOIN {taxonomy_term_node} tn ON n.vid = tn.vid WHERE tn.tid IN (' . $placeholders . ') AND n.status = 1 ORDER BY ' . $order;
- $sql_count = 'SELECT COUNT(DISTINCT(n.nid)) FROM {node} n INNER JOIN {taxonomy_term_node} tn ON n.vid = tn.vid WHERE tn.tid IN (' . $placeholders . ') AND n.status = 1';
- }
- else {
- $joins = '';
- $wheres = '';
- $args = array();
- foreach ($descendant_tids as $index => $tids) {
- $joins .= ' INNER JOIN {taxonomy_term_node} tn' . $index . ' ON n.vid = tn' . $index . '.vid';
- $wheres .= ' AND tn' . $index . '.tid IN (' . db_placeholders($tids, 'int') . ')';
- $args = array_merge($args, $tids);
- }
- $sql = 'SELECT DISTINCT(n.nid) AS nid, n.sticky, n.created FROM {node} n ' . $joins . ' WHERE n.status = 1 ' . $wheres . ' ORDER BY ' . $order;
- $sql_count = 'SELECT COUNT(DISTINCT(n.nid)) FROM {node} n ' . $joins . ' WHERE n.status = 1 ' . $wheres;
- }
- $sql = db_rewrite_sql($sql);
- $sql_count = db_rewrite_sql($sql_count);
- if ($pager) {
- $nids = pager_query($sql, variable_get('default_nodes_main', 10), 0, $sql_count, $args)->fetchCol();
- }
- else {
- $nids = db_query_range($sql, $args, 0, variable_get('feed_default_items', 10))->fetchCol();
+ $query->join('taxonomy_term_node', 'tn', 'n.vid = tn.vid');
+ $query->condition('tn.tid', $args, 'IN');
+ }
+ else {
+ foreach ($descendant_tids as $tids) {
+ $alias = $query->join('taxonomy_term_node', 'tn', 'n.vid = tn.vid');
+ $query->condition($alias . '.tid', $tids, 'IN');
}
}
+
+ if ($pager) {
+ $count_query = clone $query;
+ $count_query->addExpression('COUNT(DISTINCT n.nid)');
+
+ $query = $query
+ ->extend('PagerDefault')
+ ->limit(variable_get('default_nodes_main', 10));
+ $query->setCountQuery($count_query);
+ }
+ else {
+ $query->range(0, variable_get('feed_default_items', 10));
+ }
+
+ $query->distinct(TRUE);
+ $query->addField('n', 'nid');
+ foreach ($order as $field => $direction) {
+ $query->orderBy($field, $direction);
+ // ORDER BY fields need to be loaded too, assume they are in the form table_alias.name
+ list($table_alias, $name) = explode('.', $field);
+ $query->addField($table_alias, $name);
+ }
- return $nids;
+ return $query->execute()->fetchCol();
}
/**
@@ -1385,7 +1553,9 @@ function taxonomy_node_update($node) {
* Remove associations of a node to its terms.
*/
function taxonomy_node_delete($node) {
- db_query('DELETE FROM {taxonomy_term_node} WHERE nid = %d', $node->nid);
+ db_delete('taxonomy_term_node')
+ ->condition('nid', $node->nid)
+ ->execute();
drupal_static_reset('taxonomy_term_count_nodes');
}
@@ -1395,7 +1565,9 @@ function taxonomy_node_delete($node) {
* Remove associations of a node to its terms.
*/
function taxonomy_node_delete_revision($node) {
- db_query('DELETE FROM {taxonomy_term_node} WHERE vid = %d', $node->vid);
+ db_delete('taxonomy_term_node')
+ ->condition('nid', $node->vid)
+ ->execute();
drupal_static_reset('taxonomy_term_count_nodes');
}
diff --git a/modules/taxonomy/taxonomy.pages.inc b/modules/taxonomy/taxonomy.pages.inc
index 16013aa1b..38a785593 100644
--- a/modules/taxonomy/taxonomy.pages.inc
+++ b/modules/taxonomy/taxonomy.pages.inc
@@ -16,13 +16,17 @@ function taxonomy_term_page($terms, $depth = 0, $op = 'page') {
$str_tids = $terms['str_tids'];
if ($terms['tids']) {
- $result = db_query(db_rewrite_sql('SELECT t.tid, t.name FROM {taxonomy_term_data} t WHERE t.tid IN (' . db_placeholders($terms['tids']) . ')', 't', 'tid'), $terms['tids']);
- $tids = array(); // we rebuild the $tids-array so it only contains terms the user has access to.
- $names = array();
- while ($term = db_fetch_object($result)) {
- $tids[] = $term->tid;
- $names[] = $term->name;
- }
+ $query = db_select('taxonomy_term_data', 't');
+ $query->addTag('term_access');
+
+ // Load array with all tid's the user has access to in the format tid => name.
+ $term_results = $query
+ ->fields('t', array('tid', 'name'))
+ ->condition('tid', $terms['tids'], 'IN')
+ ->execute()
+ ->fetchAllKeyed();
+ $tids = array_keys($term_results);
+ $names = array_values($term_results);
if ($names) {
$title = check_plain(implode(', ', $names));
@@ -124,20 +128,26 @@ function taxonomy_autocomplete($vid, $string = '') {
$last_string = trim(array_pop($array));
$matches = array();
if ($last_string != '') {
- $result = db_query_range(db_rewrite_sql("SELECT t.tid, t.name FROM {taxonomy_term_data} t WHERE t.vid = :vid AND LOWER(t.name) LIKE LOWER(:last_string)", 't', 'tid'), array(
- ':vid' => $vid,
- ':last_string' => '%'. $last_string .'%',
- ), 0, 10);
-
+ $query = db_select('taxonomy_term_data', 't');
+ $query->addTag('term_access');
+
+ $tags = $query
+ ->fields('t', array('tid', 'name'))
+ ->condition('t.vid', $vid)
+ ->where("LOWER(t.name) LIKE LOWER(:last_string)", array(':last_string' => '%'. $last_string .'%'))
+ ->range(0, 10)
+ ->execute()
+ ->fetchAllKeyed();
+
$prefix = count($array) ? implode(', ', $array) . ', ' : '';
- while ($tag = db_fetch_object($result)) {
- $n = $tag->name;
+ foreach ($tags as $tid => $name) {
+ $n = $name;
// Commas and quotes in terms are special cases, so encode 'em.
- if (strpos($tag->name, ',') !== FALSE || strpos($tag->name, '"') !== FALSE) {
- $n = '"' . str_replace('"', '""', $tag->name) . '"';
+ if (strpos($name, ',') !== FALSE || strpos($name, '"') !== FALSE) {
+ $n = '"' . str_replace('"', '""', $name) . '"';
}
- $matches[$prefix . $n] = check_plain($tag->name);
+ $matches[$prefix . $n] = check_plain($name);
}
}