taxonomy.module 37.2 KB
Newer Older
Dries's avatar
   
Dries committed
1
<?php
Kjartan's avatar
Kjartan committed
2
// $Id$
Dries's avatar
   
Dries committed
3

Dries's avatar
   
Dries committed
4
5
function taxonomy_feed($taxonomy) {
  global $id, $type;
Dries's avatar
   
Dries committed
6

Kjartan's avatar
Kjartan committed
7
  if ($type == "voc") {
Dries's avatar
   
Dries committed
8
    //TODO - vocabulary feed.
Kjartan's avatar
Kjartan committed
9
10
  }
  else {
Dries's avatar
   
Dries committed
11
12
    $result = taxonomy_select_nodes($taxonomy, 0);
    $term = taxonomy_get_term($taxonomy->tids[0]);
Dries's avatar
   
Dries committed
13
    $channel["link"] = url("taxonomy/view/$taxonomy->operator/$taxonomy->str_tids", NULL, NULL, TRUE);
Kjartan's avatar
Kjartan committed
14
15
16
    $channel["title"] = variable_get("site_name", "drupal") ." - ". $term->name;
    $channel["description"] = $term->description;
    node_feed($result, $channel);
Dries's avatar
   
Dries committed
17
  }
Kjartan's avatar
Kjartan committed
18
}
Dries's avatar
   
Dries committed
19

Kjartan's avatar
Kjartan committed
20
21
22
function taxonomy_perm() {
  return array("administer taxonomy");
}
Dries's avatar
   
Dries committed
23

Dries's avatar
   
Dries committed
24
25
26
27
28
29
30
31
32
33
34
/**
 * Implementation of hook_link().
 *
 * This hook is extended with $type = 'taxonomy terms' to allow themes to
 * print lists of terms associated with a node. Themes can print taxonomy
 * links with:
 *
 * if (module_exist('taxonomy')) {
 *   $this->links(taxonomy_link('taxonomy terms', $node));
 * }
 */
Dries's avatar
   
Dries committed
35
function taxonomy_link($type, $node = NULL) {
Dries's avatar
   
Dries committed
36
37
38
39
40
41
  if ($type == 'system') {
      menu('admin/taxonomy', t('categories'), user_access('administer taxonomy') ? 'taxonomy_admin' : MENU_DENIED, 3);
      menu('admin/taxonomy/add/vocabulary', t('create new vocabulary'), user_access('administer taxonomy') ? 'taxonomy_admin' : MENU_DENIED);
      menu('admin/taxonomy/help', t('help'), user_access('administer taxonomy') ? 'taxonomy_admin' : MENU_DENIED, 9);

      menu('taxonomy', t('taxonomy'), user_access('access content') ? 'taxonomy_page' : MENU_DENIED, 0, MENU_HIDE, MENU_LOCKED);
Dries's avatar
   
Dries committed
42
  }
Dries's avatar
   
Dries committed
43
  else if ($type == 'taxonomy terms' && $node != NULL) {
Kjartan's avatar
   
Kjartan committed
44
    $links = array();
Dries's avatar
   
Dries committed
45
46
47
    if ($node->taxonomy) {
      foreach ($node->taxonomy as $tid) {
        $term = taxonomy_get_term($tid);
48
        $links[] = l($term->name, "taxonomy/page/or/$term->tid", $term->description ? array ('title' => $term->description) : array());
Dries's avatar
   
Dries committed
49
50
51
52
53
      }
    }
    else {
      $links = array();
      foreach (taxonomy_node_get_terms($node->nid) as $term) {
54
        $links[] = l($term->name, "taxonomy/page/or/$term->tid", $term->description ? array ('title' => $term->description) : array());
Dries's avatar
   
Dries committed
55
      }
Dries's avatar
   
Dries committed
56
57
58
59

    }
    return $links;
  }
Kjartan's avatar
Kjartan committed
60
61
}

Dries's avatar
   
Dries committed
62
63
64
65
/*
** admin pages (form, save, overview)
*/

Kjartan's avatar
Kjartan committed
66
function taxonomy_form_vocabulary($edit = array()) {
Dries's avatar
   
Dries committed
67
68
  foreach (node_list() as $type) {
    $nodetypes[$type] = node_invoke($type, "node_name");
Kjartan's avatar
Kjartan committed
69
  }
Dries's avatar
   
Dries committed
70

Dries's avatar
   
Dries committed
71
72
  $form .= form_textfield(t("Vocabulary name"), "name", $edit["name"], 50, 64, t("Required") .". ". t("The name for this vocabulary.  Example: 'Topic'") .".");
  $form .= form_textarea(t("Description"), "description", $edit["description"], 60, 5, t("Optional") .". ". t("Description of the vocabulary, can be used by modules."));
73
  $form .= form_textfield(t("Help text"), "help", $edit["help"], 50, 255, t("Optional") .". ". t("Instructions to present to the user when choosing a term.") .".");
Dries's avatar
   
Dries committed
74
  $form .= form_checkboxes(t("Types"), "nodes", explode(",", $edit["nodes"]), $nodetypes, t("Required") .". ". t("A list of node types you want to associate this vocabulary with."));
Dries's avatar
   
Dries committed
75
76
  $form .= form_checkbox(t("Related terms"), "relations", 1, $edit["relations"], t("Optional") .". ". t("Allows <a href=\"%help-url\">related terms</a> in this vocabulary.", array("%help-url" => url("admin/taxonomy/help", NULL, NULL, "related-terms"))));
  $form .= form_radios(t("Hierarchy"), "hierarchy", $edit["hierarchy"], array(t("Disabled"), t("Single"), t("Multiple")), t("Optional") .". ". t("Allows <a href=\"%help-url\">a tree-like hierarchy</a> between terms of this vocabulary.", array("%help-url" => url("admin/taxonomy/help", NULL, NULL, "hierarchy"))), "", 0);
Dries's avatar
   
Dries committed
77
  $form .= form_checkbox(t("Multiple select"), "multiple", 1, $edit["multiple"], t("Optional") .". ". t("Allows nodes to have more than one term in this vocabulary."));
78
  $form .= form_checkbox(t("Required"), "required", 1, $edit["required"], t("If enabled every node <strong>must</strong> have at least one term in this vocabulary"));
Dries's avatar
   
Dries committed
79
  $form .= form_weight(t("Weight"), "weight", $edit["weight"], 10, t("Optional. In listings, the heavier vocabularies will sink and the lighter vocabularies will be positioned nearer the top."));
Dries's avatar
   
Dries committed
80
  $form .= form_submit(t("Submit"));
Dries's avatar
   
Dries committed
81

Kjartan's avatar
Kjartan committed
82
  if ($edit["vid"]) {
Dries's avatar
   
Dries committed
83
    $form .= form_submit(t("Delete"));
Kjartan's avatar
Kjartan committed
84
    $form .= form_hidden("vid", $edit["vid"]);
Dries's avatar
   
Dries committed
85
86
  }

Kjartan's avatar
Kjartan committed
87
88
  return form($form);
}
Kjartan's avatar
Kjartan committed
89

Kjartan's avatar
Kjartan committed
90
function taxonomy_save_vocabulary($edit) {
Dries's avatar
   
Dries committed
91
92
  if (!$edit["nodes"]) {
    $edit["nodes"] = array();
Dries's avatar
   
Dries committed
93
94
  }

95
  $data = array("name" => $edit["name"], "nodes" => implode(",", $edit["nodes"]), "description" => $edit["description"], "help" => $edit["help"], "multiple" => $edit["multiple"], "required" => $edit["required"], "hierarchy" => $edit["hierarchy"], "relations" => $edit["relations"], "weight" => $edit["weight"]);
Kjartan's avatar
Kjartan committed
96
  if ($edit["vid"] && $edit["name"]) {
Dries's avatar
   
Dries committed
97
    db_query("UPDATE {vocabulary} SET ". _prepare_update($data) ." WHERE vid = %d", $edit["vid"]);
Dries's avatar
   
Dries committed
98
99
    module_invoke_all("taxonomy", "update", "vocabulary", $edit);
    $message = t("updated vocabulary '%name'.", array("%name" => $edit["name"]));
Dries's avatar
   
Dries committed
100
  }
Kjartan's avatar
Kjartan committed
101
  else if ($edit["vid"]) {
Dries's avatar
   
Dries committed
102
    $message = taxonomy_del_vocabulary($edit["vid"]);
Kjartan's avatar
Kjartan committed
103
104
  }
  else {
Dries's avatar
   
Dries committed
105
    $data["vid"] = $edit["vid"] = db_next_id("{vocabulary}_vid");
Dries's avatar
   
Dries committed
106
    db_query("INSERT INTO {vocabulary} ". _prepare_insert($data, 1) ." VALUES ". _prepare_insert($data, 2));
Dries's avatar
   
Dries committed
107
108
    module_invoke_all("taxonomy", "insert", "vocabulary", $edit);
    $message = t("created new vocabulary '%name'.", array("%name" => $edit["name"]));
Kjartan's avatar
Kjartan committed
109
  }
Dries's avatar
   
Dries committed
110
111

  cache_clear_all();
Dries's avatar
   
Dries committed
112

Dries's avatar
   
Dries committed
113
114
  drupal_set_message($message);
  return $edit;
Kjartan's avatar
Kjartan committed
115
}
Dries's avatar
   
Dries committed
116

Kjartan's avatar
Kjartan committed
117
function taxonomy_del_vocabulary($vid) {
Dries's avatar
   
Dries committed
118
119
  $vocabulary = taxonomy_get_vocabulary($vid);

Dries's avatar
   
Dries committed
120
121
  db_query("DELETE FROM {vocabulary} WHERE vid = %d", $vid);
  $result = db_query("SELECT tid FROM {term_data} WHERE vid = %d", $vid);
Kjartan's avatar
Kjartan committed
122
123
  while ($term = db_fetch_object($result)) {
    taxonomy_del_term($term->tid);
Dries's avatar
   
Dries committed
124
  }
Dries's avatar
   
Dries committed
125

Dries's avatar
   
Dries committed
126
127
  module_invoke_all("taxonomy", "delete", "vocabulary", $vocabulary);

Dries's avatar
   
Dries committed
128
129
  cache_clear_all();

Dries's avatar
   
Dries committed
130
131
132
133
134
135
136
137
138
139
140
141
142
  return t("deleted vocabulary '%name'.", array("%name" => $vocabulary->name));
}

function _taxonomy_confirm_del_vocabulary($vid) {
  $vocabulary = taxonomy_get_vocabulary($vid);

  $form .= form_hidden("confirm", 1);
  $form .= form_hidden("type", "vocabulary");
  $form .= form_hidden("vid", $vid);
  $form .= form_submit(t("Delete"));
  $form .= form_submit(t("Cancel"));

  return form(form_item(t("Delete vocabulary '%name'", array("%name" => $vocabulary->name)), $form, t("Are you sure you want to delete the vocabulary and all its terms?")));
Kjartan's avatar
Kjartan committed
143
}
Dries's avatar
   
Dries committed
144

Kjartan's avatar
Kjartan committed
145
function taxonomy_form_term($edit = array()) {
146
  $vocabulary_id = isset($edit["vid"]) ? $edit["vid"] : arg(4);
Kjartan's avatar
Kjartan committed
147
  $vocabulary = taxonomy_get_vocabulary($vocabulary_id);
Dries's avatar
   
Dries committed
148

Dries's avatar
   
Dries committed
149
150
  $form = form_textfield(t("Term name"), "name", $edit["name"], 50, 64, t("Required") .". ". t("The name for this term.  Example: 'Linux'."));
  $form .= form_textarea(t("Description"), "description", $edit["description"], 60, 5, t("Optional") .". ". t("A description of the term."));
Dries's avatar
   
Dries committed
151

Kjartan's avatar
Kjartan committed
152
153
  if ($vocabulary->hierarchy) {
    $parent = array_keys(taxonomy_get_parents($edit["tid"]));
Dries's avatar
   
Dries committed
154
    $children = taxonomy_get_tree($vocabulary_id, $edit["tid"]);
Dries's avatar
   
Dries committed
155
156
157
158
159

    // you can't be son of yourself nor of your children
    foreach ($children as $child) {
      $exclude[] = $child->tid;
    }
Kjartan's avatar
Kjartan committed
160
    $exclude[] = $edit["tid"];
Dries's avatar
   
Dries committed
161

Kjartan's avatar
Kjartan committed
162
    if ($vocabulary->hierarchy == 1) {
Dries's avatar
   
Dries committed
163
      $form .= _taxonomy_term_select(t("Parent"), "parent", $parent, $vocabulary_id, t("Required") .". ". l(t("Parent term"), "admin/taxonomy/help", NULL, NULL, "parent") .".", 0, "<". t("root") .">", $exclude);
Dries's avatar
   
Dries committed
164
    }
Kjartan's avatar
Kjartan committed
165
    elseif ($vocabulary->hierarchy == 2) {
Dries's avatar
   
Dries committed
166
      $form .= _taxonomy_term_select(t("Parents"), "parent", $parent, $vocabulary_id, t("Required") .". ". l(t("Parent terms"), "admin/taxonomy/help", NULL, NULL, "parent") .".", 1, "<". t("root") .">", $exclude);
Dries's avatar
   
Dries committed
167
    }
Kjartan's avatar
Kjartan committed
168
  }
Dries's avatar
   
Dries committed
169

170
  if ($vocabulary->relations) {
Dries's avatar
   
Dries committed
171
    $form .= _taxonomy_term_select(t("Related terms"), "relations", array_keys(taxonomy_get_related($edit["tid"])), $vocabulary_id, t("Optional") .". ", 1, "<". t("none") .">", array($edit["tid"]));
172
173
  }

Dries's avatar
   
Dries committed
174
  $form .= form_textarea(t("Synonyms"), "synonyms", implode("\n", taxonomy_get_synonyms($edit["tid"])), 30, 5, t("Optional") . ". ". t("<a href=\"%help-url\">Synonyms</a> of this term, one synonym per line.", array("%help-url" => url("admin/taxonomy/help", NULL, NULL, "synonyms"))));
Dries's avatar
   
Dries committed
175
  $form .= form_weight(t("Weight"), "weight", $edit["weight"], 10, t("Optional. In listings, the heavier terms will sink and the lighter terms will be positioned nearer the top."));
Kjartan's avatar
Kjartan committed
176
  $form .= form_hidden("vid", $vocabulary->vid);
Dries's avatar
   
Dries committed
177
  $form .= form_submit(t("Submit"));
Kjartan's avatar
Kjartan committed
178
179

  if ($edit["tid"]) {
Dries's avatar
   
Dries committed
180
    $form .= form_submit(t("Delete"));
Kjartan's avatar
Kjartan committed
181
    $form .= form_hidden("tid", $edit["tid"]);
Dries's avatar
   
Dries committed
182
183
  }

Kjartan's avatar
Kjartan committed
184
185
  return form($form);
}
Dries's avatar
   
Dries committed
186

Kjartan's avatar
Kjartan committed
187
function taxonomy_save_term($edit) {
Dries's avatar
   
Dries committed
188
  if ($edit["tid"] && $edit["name"]) {
Kjartan's avatar
Kjartan committed
189
    $data = array("name" => $edit["name"], "description" => $edit["description"], "weight" => $edit["weight"]);
Dries's avatar
   
Dries committed
190

Dries's avatar
   
Dries committed
191
    db_query("UPDATE {term_data} SET ". _prepare_update($data) ." WHERE tid = %d", $edit["tid"]);
Dries's avatar
   
Dries committed
192
    module_invoke_all("taxonomy", "update", "term", $edit);
Dries's avatar
   
Dries committed
193
    $message = t("the term '%a' has been updated.", array("%a" => $edit["name"]));
Kjartan's avatar
Kjartan committed
194
195
  }
  else if ($edit["tid"]) {
Dries's avatar
   
Dries committed
196
    return taxonomy_del_term($edit["tid"]);
Kjartan's avatar
Kjartan committed
197
198
  }
  else {
Dries's avatar
   
Dries committed
199
    $edit["tid"] = db_next_id("{term_data}_tid");
Kjartan's avatar
Kjartan committed
200
    $data = array("tid" => $edit["tid"], "name" => $edit["name"], "description" => $edit["description"], "vid" => $edit["vid"], "weight" => $edit["weight"]);
Dries's avatar
   
Dries committed
201
    db_query("INSERT INTO {term_data} ". _prepare_insert($data, 1) ." VALUES ". _prepare_insert($data, 2));
Dries's avatar
   
Dries committed
202
    module_invoke_all("taxonomy", "insert", "term", $edit);
Dries's avatar
   
Dries committed
203
    $message = t("created new term '%name'.", array("%name" => $edit["name"]));
Kjartan's avatar
Kjartan committed
204
  }
Dries's avatar
   
Dries committed
205

Kjartan's avatar
Kjartan committed
206
  // relations (seem very powerful, but I have to understand it completely)
Dries's avatar
   
Dries committed
207
  db_query("DELETE FROM {term_relation} WHERE tid1 = %d OR tid2 = %d", $edit["tid"], $edit["tid"]);
Kjartan's avatar
Kjartan committed
208
209
210
  if ($edit["relations"]) {
    foreach ($edit["relations"] as $related_id) {
      if ($related_id != 0) {
Dries's avatar
   
Dries committed
211
        db_query("INSERT INTO {term_relation} (tid1, tid2) VALUES (%d, %d)", $edit["tid"], $related_id);
Dries's avatar
   
Dries committed
212
      }
Kjartan's avatar
Kjartan committed
213
    }
Kjartan's avatar
Kjartan committed
214
  }
Dries's avatar
   
Dries committed
215

Kjartan's avatar
Kjartan committed
216
  // hierarchy
Dries's avatar
   
Dries committed
217
  db_query("DELETE FROM {term_hierarchy} WHERE tid = %d", $edit["tid"]);
Kjartan's avatar
Kjartan committed
218
219
220
221
222
  if (!isset($edit["parent"])) {
    $edit["parent"] = 0;
  }
  if (is_array($edit["parent"])) {
    foreach ($edit["parent"] as $parent) {
Dries's avatar
   
Dries committed
223
      db_query("INSERT INTO {term_hierarchy} (tid, parent) VALUES (%d, %d)", $edit["tid"], $parent);
Dries's avatar
   
Dries committed
224
    }
Kjartan's avatar
Kjartan committed
225
226
  }
  else {
Dries's avatar
   
Dries committed
227
    db_query("INSERT INTO {term_hierarchy} (tid, parent) VALUES (%d, %d)", $edit["tid"], $edit["parent"][0]);
Dries's avatar
   
Dries committed
228
229
  }

Dries's avatar
   
Dries committed
230
  db_query("DELETE FROM {term_synonym} WHERE tid = %d", $edit["tid"]);
Kjartan's avatar
Kjartan committed
231
  if ($edit["synonyms"]) {
Dries's avatar
   
Dries committed
232
233
    foreach (explode ("\n", str_replace("\r", "", $edit["synonyms"])) as $synonym) {
      if ($synonym) {
Dries's avatar
   
Dries committed
234
        db_query("INSERT INTO {term_synonym} (tid, name) VALUES (%d, '%s')", $edit["tid"], chop($synonym));
Dries's avatar
   
Dries committed
235
      }
Kjartan's avatar
Kjartan committed
236
    }
Dries's avatar
   
Dries committed
237
  }
Dries's avatar
   
Dries committed
238

Dries's avatar
   
Dries committed
239
240
  cache_clear_all();

Dries's avatar
   
Dries committed
241
  drupal_set_message($message);
Dries's avatar
   
Dries committed
242
  return $edit;
Kjartan's avatar
Kjartan committed
243
}
Dries's avatar
   
Dries committed
244

Kjartan's avatar
Kjartan committed
245
function taxonomy_del_term($tid) {
Dries's avatar
   
Dries committed
246
247
  $term = taxonomy_get_term($tid);

Dries's avatar
   
Dries committed
248
249
250
251
252
  db_query("DELETE FROM {term_data} WHERE tid = %d", $tid);
  db_query("DELETE FROM {term_hierarchy} WHERE tid = %d", $tid);
  db_query("DELETE FROM {term_relation} WHERE tid1 = %d OR tid2 = %d", $tid, $tid);
  db_query("DELETE FROM {term_synonym} WHERE tid = %d", $tid);
  db_query("DELETE FROM {term_node} WHERE tid = %d", $tid);
Dries's avatar
   
Dries committed
253

Dries's avatar
   
Dries committed
254
  module_invoke_all("taxonomy", "delete", "term", $term);
Dries's avatar
   
Dries committed
255

Dries's avatar
   
Dries committed
256
257
  cache_clear_all();

Dries's avatar
   
Dries committed
258
259
260
261
262
263
264
265
266
267
268
269
270
  return t("deleted term '%name'.", array("%name" => $term->name));
}

function _taxonomy_confirm_del_term($tid) {
  $term = taxonomy_get_term($tid);

  $form .= form_hidden("confirm", 1);
  $form .= form_hidden("type", "term");
  $form .= form_hidden("tid", $tid);
  $form .= form_submit(t("Delete"));
  $form .= form_submit(t("Cancel"));

  return form(form_item(t("Delete term '%name'", array("%name" => $term->name)), $form, t("Are you sure you want to delete the term?")));
Kjartan's avatar
Kjartan committed
271
}
Dries's avatar
   
Dries committed
272

Kjartan's avatar
Kjartan committed
273
function taxonomy_overview() {
Dries's avatar
   
Dries committed
274

Dries's avatar
   
Dries committed
275
  $output .= "<h3>". t("Vocabularies overview") ."</h3>";
Dries's avatar
   
Dries committed
276
277

  $header = array(t("name"), t("node types"), array("data" => t("operations"), "colspan" => 3));
Dries's avatar
   
Dries committed
278

Kjartan's avatar
Kjartan committed
279
  $vocabularies = taxonomy_get_vocabularies();
Dries's avatar
   
Dries committed
280

Kjartan's avatar
Kjartan committed
281
282
  foreach ($vocabularies as $vocabulary) {
    $links = array();
Dries's avatar
   
Dries committed
283
284
    $types = array();
    foreach(explode(",", $vocabulary->nodes) as $type) {
Dries's avatar
   
Dries committed
285
      $types[] = node_invoke($type, "node_name");
Dries's avatar
   
Dries committed
286
287
    }
    $rows[] = array($vocabulary->name, array("data" => implode(", ", $types), "align" => "center"), l(t("edit vocabulary"), "admin/taxonomy/edit/vocabulary/$vocabulary->vid"), l(t("add term"), "admin/taxonomy/add/term/$vocabulary->vid"), l(t("preview form"), "admin/taxonomy/preview/vocabulary/$vocabulary->vid"));
Kjartan's avatar
Kjartan committed
288

Dries's avatar
   
Dries committed
289
    $tree = taxonomy_get_tree($vocabulary->vid);
Kjartan's avatar
Kjartan committed
290
    if ($tree) {
Dries's avatar
   
Dries committed
291
      unset($data);
Kjartan's avatar
Kjartan committed
292
      foreach ($tree as $term) {
293
        $data .= _taxonomy_depth($term->depth) ." ". $term->name ." (". l(t("edit term"), "admin/taxonomy/edit/term/$term->tid") .")<br />";
Dries's avatar
   
Dries committed
294
      }
Dries's avatar
   
Dries committed
295
      $rows[] = array(array("data" => $data, "colspan" => 5));
Dries's avatar
   
Dries committed
296
297
298
    }
  }

Dries's avatar
   
Dries committed
299
  return theme("table", $header, $rows);
Kjartan's avatar
Kjartan committed
300
301
}

302
function taxonomy_form($vocabulary_id, $value = 0, $error = array(), $help = NULL) {
Kjartan's avatar
Kjartan committed
303
  $vocabulary = taxonomy_get_vocabulary($vocabulary_id);
304
  $help = ($help) ? $help : $vocabulary->help;
Kjartan's avatar
Kjartan committed
305
306
307
308
  if ($vocabulary->required) {
    $blank = 0;
  }
  else {
Dries's avatar
   
Dries committed
309
    $blank = "<". t("none") .">";
Kjartan's avatar
Kjartan committed
310
  }
Dries's avatar
   
Dries committed
311

312
  $help .= $error['taxonomy'];
Dries's avatar
   
Dries committed
313

314
  return _taxonomy_term_select($vocabulary->name, 'taxonomy', $value, $vocabulary_id, $help, intval($vocabulary->multiple), $blank);
Kjartan's avatar
Kjartan committed
315
}
Dries's avatar
   
Dries committed
316
317
318
319
320

/*
** API functions
*/

Kjartan's avatar
Kjartan committed
321
322
323
// return array of vocabularies, as objects
function taxonomy_get_vocabularies($type = '', $key = "vid") {
  if ($type) {
Dries's avatar
   
Dries committed
324
    $result = db_query("SELECT * FROM {vocabulary} WHERE nodes LIKE '%%%s%%' ORDER BY weight, name", $type);
Kjartan's avatar
Kjartan committed
325
326
  }
  else {
Dries's avatar
   
Dries committed
327
    $result = db_query("SELECT * FROM {vocabulary} ORDER BY weight, name");
Kjartan's avatar
Kjartan committed
328
329
330
331
  }
  $vocabularies = array();
  while ($voc = db_fetch_object($result)) {
    $vocabularies[$voc->$key] = $voc;
Dries's avatar
   
Dries committed
332
  }
Dries's avatar
   
Dries committed
333

Kjartan's avatar
Kjartan committed
334
335
  return $vocabularies;
}
Dries's avatar
   
Dries committed
336

Kjartan's avatar
Kjartan committed
337
// return form with current term
338
function taxonomy_node_form($type, $node = '', $error = array()) {
Kjartan's avatar
Kjartan committed
339
340
341
  if (!$node->taxonomy) {
    if ($node->nid) {
      $terms = array_keys(taxonomy_node_get_terms($node->nid));
Kjartan's avatar
Kjartan committed
342
343
    }
    else {
Kjartan's avatar
Kjartan committed
344
      $terms = 0;
Dries's avatar
   
Dries committed
345
    }
Kjartan's avatar
Kjartan committed
346
347
348
349
  }
  else {
    $terms = $node->taxonomy;
  }
Dries's avatar
   
Dries committed
350

Dries's avatar
   
Dries committed
351
  $c = db_query("SELECT * FROM {vocabulary} WHERE nodes LIKE '%%%s%%' ORDER BY weight, name", $type);
Kjartan's avatar
Kjartan committed
352
  while ($vocabulary = db_fetch_object($c)) {
353
    $result[] .= taxonomy_form($vocabulary->vid, $terms, $error);
Dries's avatar
   
Dries committed
354
  }
Kjartan's avatar
Kjartan committed
355
356
  return $result ? $result : array();
}
Dries's avatar
   
Dries committed
357

Kjartan's avatar
Kjartan committed
358
359
// return 1 if node identified by $nid contains a taxonomy term identified by $tid in his body or title
function taxonomy_node_has_term($nid, $tid) {
Dries's avatar
   
Dries committed
360
  $term_name = db_result(db_query("SELECT name FROM {term_data} WHERE tid = %d", $tid));
Dries's avatar
   
Dries committed
361

Dries's avatar
   
Dries committed
362
  return db_result(db_query("SELECT COUNT(n.nid) FROM {node} n WHERE n.nid = %d AND ((n.body LIKE '%%%s%%') OR (n.body LIKE '%%%s%%'))", $nid, $term_name, $term_name));
Kjartan's avatar
Kjartan committed
363
364
365
366
}

// return array of terms of a node beloging to a particular vocabulary identified by $vid
function taxonomy_node_get_terms_by_vocabulary($nid, $vid, $key = "tid") {
Dries's avatar
   
Dries committed
367
  $result = db_query("SELECT t.* FROM {term_data} t, {term_node} r WHERE t.tid = r.tid AND t.vid = %d AND r.nid = %d ORDER BY weight", $vid, $nid);
Kjartan's avatar
Kjartan committed
368
369
370
  $terms = array();
  while ($term = db_fetch_object($result)) {
    $terms[$term->$key] = $term;
Dries's avatar
   
Dries committed
371
  }
Kjartan's avatar
Kjartan committed
372
373
374
375
376
377
  return $terms;
}

// return array of terms of a node
function taxonomy_node_get_terms($nid, $key = "tid") {
  static $terms;
Dries's avatar
   
Dries committed
378

Dries's avatar
   
Dries committed
379
  if (!isset($terms[$nid])) {
Dries's avatar
   
Dries committed
380
    $result = db_query("SELECT t.* FROM {term_data} t, {term_node} r WHERE r.tid = t.tid AND r.nid = %d ORDER BY weight, name", $nid);
Kjartan's avatar
Kjartan committed
381
    $terms[$nid] = array();
Dries's avatar
   
Dries committed
382
    while ($term = db_fetch_object($result)) {
Kjartan's avatar
Kjartan committed
383
      $terms[$nid][$term->$key] = $term;
Dries's avatar
   
Dries committed
384
385
    }
  }
Kjartan's avatar
Kjartan committed
386
387
  return $terms[$nid];
}
Dries's avatar
   
Dries committed
388

Kjartan's avatar
Kjartan committed
389
390
391
// save terms of a node
function taxonomy_node_save($nid, $terms) {
  taxonomy_node_delete($nid);
Dries's avatar
   
Dries committed
392

Kjartan's avatar
Kjartan committed
393
  if ($terms) {
Dries's avatar
   
Dries committed
394
    foreach ($terms as $term) {
395
396
397
      if ($term) {
        db_query("INSERT INTO {term_node} (nid, tid) VALUES (%d, %d)", $nid, $term);
      }
Dries's avatar
   
Dries committed
398
399
    }
  }
Kjartan's avatar
Kjartan committed
400
}
Dries's avatar
   
Dries committed
401

Kjartan's avatar
Kjartan committed
402
403
// clean up terms
function taxonomy_node_delete($nid) {
Dries's avatar
   
Dries committed
404
  db_query("DELETE FROM {term_node} WHERE nid = %d", $nid);
Kjartan's avatar
Kjartan committed
405
}
Dries's avatar
   
Dries committed
406

Kjartan's avatar
Kjartan committed
407
408
409
// relations: return array of related terms
function taxonomy_get_related($tid, $key = "tid") {
  if ($tid) {
Dries's avatar
   
Dries committed
410
    $result = db_query("SELECT t.*, tid1, tid2 FROM {term_relation} , {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);
Kjartan's avatar
Kjartan committed
411
412
413
    $related = array();
    while ($term = db_fetch_object($result)) {
      $related[$term->$key] = $term;
Dries's avatar
   
Dries committed
414
    }
Kjartan's avatar
Kjartan committed
415
    return $related;
Dries's avatar
   
Dries committed
416
  }
Kjartan's avatar
Kjartan committed
417
418
  else {
    return array();
Dries's avatar
   
Dries committed
419
  }
Kjartan's avatar
Kjartan committed
420
}
Dries's avatar
   
Dries committed
421

Kjartan's avatar
Kjartan committed
422
423
424
// hierarchy: get parent terms
function taxonomy_get_parents($tid, $key = "tid") {
  if ($tid) {
Dries's avatar
   
Dries committed
425
    $result = db_query("SELECT t.* FROM {term_hierarchy} h, {term_data} t WHERE h.parent = t.tid AND h.tid = %d ORDER BY weight, name", $tid);
Kjartan's avatar
Kjartan committed
426
427
428
    $parents = array();
    while ($parent = db_fetch_object($result)) {
      $parents[$parent->$key] = $parent;
Dries's avatar
   
Dries committed
429
    }
Kjartan's avatar
Kjartan committed
430
    return $parents;
Dries's avatar
   
Dries committed
431
  }
Kjartan's avatar
Kjartan committed
432
433
434
435
  else {
    return array();
  }
}
Dries's avatar
   
Dries committed
436

Dries's avatar
   
Dries committed
437
438
439
440
441
442
443
444
445
446
447
448
449
450
// Gets all parents, parents of parents, etc.
function taxonomy_get_parents_all($tid, $key = "tid") {
  $parents = array();
  if ($tid) {
    $parents[] = taxonomy_get_term($tid);
    $n = 0;
    while ($parent = taxonomy_get_parents($parents[$n]->tid)) {
      $parents = array_merge($parents, $parent);
      $n++;
    }
  }
  return $parents;
}

Kjartan's avatar
Kjartan committed
451
452
453
// hierarchy: get children
function taxonomy_get_children($tid, $vid = 0, $key = "tid") {
  if ($vid) {
Dries's avatar
   
Dries committed
454
    $result = db_query("SELECT t.* FROM {term_hierarchy} h, {term_data} t WHERE t.vid = %d AND h.tid = t.tid AND h.parent = %d ORDER BY weight, name", $vid, $tid);
Dries's avatar
   
Dries committed
455
  }
Kjartan's avatar
Kjartan committed
456
  else {
Dries's avatar
   
Dries committed
457
    $result = db_query("SELECT t.* FROM {term_hierarchy} h, {term_data} t WHERE h.tid = t.tid AND parent = %d ORDER BY weight", $tid);
Kjartan's avatar
Kjartan committed
458
459
460
461
462
463
464
  }
  $children = array();
  while ($term = db_fetch_object($result)) {
    $children[$term->$key] = $term;
  }
  return $children;
}
Dries's avatar
   
Dries committed
465

Kjartan's avatar
Kjartan committed
466
// hierarchy: get whole family, with tid, parent and depth; useful to show
Dries's avatar
   
Dries committed
467
function taxonomy_get_tree($vocabulary_id, $parent = 0, $depth = -1, $max_depth = NULL) {
Dries's avatar
   
Dries committed
468
  static $children, $parents, $terms;
Dries's avatar
   
Dries committed
469

Kjartan's avatar
Kjartan committed
470
  $depth++;
Dries's avatar
   
Dries committed
471

Dries's avatar
   
Dries committed
472
473
474
475
  // we cache trees, so it's not cpu-intensive to call get_tree on a term and its children too
  if (!isset($children[$vocabulary_id])) {
    $children[$vocabulary_id] = array();

Dries's avatar
   
Dries committed
476
    $result = db_query("SELECT t.*, parent FROM {term_data} t, {term_hierarchy} h WHERE t.tid = h.tid AND t.vid = %d ORDER BY weight, name", $vocabulary_id);
Dries's avatar
   
Dries committed
477
    while ($term = db_fetch_object($result)) {
Dries's avatar
   
Dries committed
478
479
480
      $children[$vocabulary_id][$term->parent][] = $term->tid;
      $parents[$vocabulary_id][$term->tid][] = $term->parent;
      $terms[$vocabulary_id][$term->tid] = $term;
Dries's avatar
   
Dries committed
481
482
    }
  }
Dries's avatar
   
Dries committed
483

Dries's avatar
   
Dries committed
484
  $max_depth = ($max_depth == '') ? count($children[$vocabulary_id]) : $max_depth;
Dries's avatar
   
Dries committed
485
486
  if ($children[$vocabulary_id][$parent]) {
    foreach ($children[$vocabulary_id][$parent] as $child) {
Dries's avatar
   
Dries committed
487
488
489
490
491
      if ($max_depth > $depth) {
        $terms[$vocabulary_id][$child]->depth = $depth;
        unset($terms[$vocabulary_id][$child]->parent); // this is not useful as it would show one parent only
        $terms[$vocabulary_id][$child]->parents = $parents[$vocabulary_id][$child];
        $tree[] = $terms[$vocabulary_id][$child];
Dries's avatar
   
Dries committed
492

Dries's avatar
   
Dries committed
493
494
        $tree = array_merge($tree, taxonomy_get_tree($vocabulary_id, $child, $depth, $max_depth));
      }
Dries's avatar
   
Dries committed
495
    }
Kjartan's avatar
Kjartan committed
496
  }
Dries's avatar
   
Dries committed
497

Dries's avatar
   
Dries committed
498
  return $tree ? $tree : array();
Kjartan's avatar
Kjartan committed
499
}
Dries's avatar
   
Dries committed
500

Kjartan's avatar
Kjartan committed
501
502
503
// synonyms: return array of synonyms
function taxonomy_get_synonyms($tid) {
  if ($tid) {
Dries's avatar
   
Dries committed
504
    $result = db_query("SELECT name FROM {term_synonym} WHERE tid = %d", $tid);
Kjartan's avatar
Kjartan committed
505
506
    while ($synonym = db_fetch_array($result)) {
      $synonyms[] = $synonym["name"];
Dries's avatar
   
Dries committed
507
    }
Kjartan's avatar
Kjartan committed
508
    return $synonyms ? $synonyms : array();
Dries's avatar
   
Dries committed
509
  }
Kjartan's avatar
Kjartan committed
510
511
  else {
    return array();
Dries's avatar
   
Dries committed
512
  }
Kjartan's avatar
Kjartan committed
513
}
Dries's avatar
   
Dries committed
514

Kjartan's avatar
Kjartan committed
515
516
// synonyms: return original term
function taxonomy_get_synonym_root($term) {
Dries's avatar
   
Dries committed
517
  return db_fetch_object(db_query("SELECT * FROM {term_synonym} s, {term_data} t WHERE t.tid = s.tid AND s.name = '%s'", $term));
Kjartan's avatar
Kjartan committed
518
}
Dries's avatar
   
Dries committed
519

Dries's avatar
   
Dries committed
520
// given a term id, count number of published nodes in it
Dries's avatar
   
Dries committed
521
function taxonomy_term_count_nodes($tid, $type = 0) {
Kjartan's avatar
Kjartan committed
522
  static $count;
Dries's avatar
   
Dries committed
523

Dries's avatar
   
Dries committed
524
525
526
  if (!isset($count[$type])) {
    // $type == 0 always evaluates true is $type is a string
    if (is_numeric($type)) {
Dries's avatar
   
Dries committed
527
      $result = db_query("SELECT t.tid, COUNT(*) AS c FROM {term_node} t INNER JOIN {node} n ON t.nid = n.nid WHERE n.status = 1 GROUP BY t.tid");
Dries's avatar
   
Dries committed
528
529
    }
    else {
Dries's avatar
   
Dries committed
530
      $result = db_query("SELECT t.tid, COUNT(*) AS c FROM {term_node} t, {node} n WHERE t.nid = n.nid AND n.status = 1 AND n.type = '%s' GROUP BY t.tid", $type);
Dries's avatar
   
Dries committed
531
    }
Kjartan's avatar
Kjartan committed
532
    while ($term = db_fetch_object($result)) {
Dries's avatar
   
Dries committed
533
      $count[$type][$term->tid] = $term->c;
Dries's avatar
   
Dries committed
534
535
536
    }
  }

Kjartan's avatar
Kjartan committed
537
  foreach (_taxonomy_term_children($tid) as $c) {
Dries's avatar
   
Dries committed
538
    $children_count += taxonomy_term_count_nodes($c, $type);
Kjartan's avatar
Kjartan committed
539
  }
Dries's avatar
   
Dries committed
540
  return $count[$type][$tid] + $children_count;
Kjartan's avatar
Kjartan committed
541
542
543
544
545
}

// helper for above function
function _taxonomy_term_children($tid) {
  static $children;
Dries's avatar
   
Dries committed
546

Dries's avatar
   
Dries committed
547
  if (!isset($children)) {
Dries's avatar
   
Dries committed
548
    $result = db_query("SELECT tid, parent FROM {term_hierarchy} ");
Kjartan's avatar
Kjartan committed
549
550
    while ($term = db_fetch_object($result)) {
      $children[$term->parent][] = $term->tid;
Dries's avatar
   
Dries committed
551
    }
Dries's avatar
   
Dries committed
552
  }
Kjartan's avatar
Kjartan committed
553
554
  return $children[$tid] ? $children[$tid] : array();
}
Dries's avatar
   
Dries committed
555

Dries's avatar
   
Dries committed
556
/**
Dries's avatar
   
Dries committed
557
558
 * Try to map a string to existing vocabularies. Provide case insensitive and
 * trimmed map so as to maximize likelihood of successful mapping.
Dries's avatar
   
Dries committed
559
 *
Dries's avatar
   
Dries committed
560
561
 * @param $name Name of the vocabulary to search
 * @return array of matching vocabularies, as objects
Dries's avatar
   
Dries committed
562
563
564
 */
function taxonomy_get_vocabulary_by_name($name) {
  // LOWER is ANSI SQL-92
Dries's avatar
   
Dries committed
565
  $db_result = db_query("SELECT * FROM {vocabulary} WHERE LOWER('%s') LIKE LOWER(name)", trim($name));
Dries's avatar
   
Dries committed
566
567
568
569
570
571
572
573
574
  $result = array();
  while ($vocabulary = db_fetch_object($db_result)) {
    $result[] = $vocabulary;
  }

  return $result;
}

/**
Dries's avatar
   
Dries committed
575
576
 * Try to map a string to existing terms Provide case insensitive and trimmed
 * map so as to maximize likelihood of successful mapping.
Dries's avatar
   
Dries committed
577
 *
Dries's avatar
   
Dries committed
578
579
 * @param name Name of the term to search
 * @return rray of matching terms, as objects
Dries's avatar
   
Dries committed
580
581
582
 */
function taxonomy_get_term_by_name($name) {
  // LOWER is ANSI SQL-92
Dries's avatar
   
Dries committed
583
  $db_result = db_query("SELECT * FROM {term_data} WHERE LOWER('%s') LIKE LOWER(name)", trim($name));
Dries's avatar
   
Dries committed
584
585
586
587
588
589
590
591
  $result = array();
  while ($term = db_fetch_object($db_result)) {
    $result[] = $term;
  }

  return $result;
}

Kjartan's avatar
Kjartan committed
592
593
function taxonomy_get_vocabulary($vid) {
  // simple cache using a static var?
Dries's avatar
   
Dries committed
594
  return db_fetch_object(db_query("SELECT * FROM {vocabulary} WHERE vid = %d", $vid));
Kjartan's avatar
Kjartan committed
595
}
Dries's avatar
   
Dries committed
596

Kjartan's avatar
Kjartan committed
597
598
function taxonomy_get_term($tid) {
  // simple cache using a static var?
Dries's avatar
   
Dries committed
599
  return db_fetch_object(db_query("SELECT * FROM {term_data} WHERE tid = %d", $tid));
Kjartan's avatar
Kjartan committed
600
}
Dries's avatar
   
Dries committed
601
602
603
604
605

/*
** service functions
*/

Kjartan's avatar
Kjartan committed
606
function _taxonomy_term_select($title, $name, $value, $vocabulary_id, $description, $multiple, $blank, $exclude = array()) {
Dries's avatar
   
Dries committed
607
  $tree = taxonomy_get_tree($vocabulary_id);
Dries's avatar
   
Dries committed
608

609
610
611
612
613
614
615
616
  // We store the last selected ID in a session variable:
  if (!$value) {
    $value = $_SESSION['vocabulary']["$vocabulary_id"];
  }
  else {
    $_SESSION['vocabulary']["$vocabulary_id"] = $value;
  }

Kjartan's avatar
Kjartan committed
617
  if ($blank) {
Dries's avatar
   
Dries committed
618
    $options[] = array("tid" => 0, "name" => $blank);
Kjartan's avatar
Kjartan committed
619
  }
Dries's avatar
   
Dries committed
620

Kjartan's avatar
Kjartan committed
621
622
623
  if ($tree) {
    foreach ($tree as $term) {
      if (!in_array($term->tid, $exclude)) {
Dries's avatar
   
Dries committed
624
        $options[] = array("tid" => $term->tid, "name" => _taxonomy_depth($term->depth, '-').$term->name);
Dries's avatar
   
Dries committed
625
626
      }
    }
Kjartan's avatar
Kjartan committed
627
628
629
630
631
    if (!$blank && !$value) {
      // required but without a predefined value, so set first as predefined
      $value = $tree[0]->tid;
    }
  }
Dries's avatar
   
Dries committed
632

Kjartan's avatar
Kjartan committed
633
  if (count($options) > 0) {
Dries's avatar
   
Dries committed
634
    foreach ($options as $option) {
Dries's avatar
   
Dries committed
635
      $select .= "<option value=\"". $option["tid"] ."\"". (is_array($value) ? (in_array($option["tid"], $value) ? " selected=\"selected\"" : "") : ($option["tid"] == $value ? " selected=\"selected\"" : "")) .">". check_form($option["name"]) ."</option>";
Kjartan's avatar
Kjartan committed
636
    }
Dries's avatar
   
Dries committed
637

Dries's avatar
   
Dries committed
638
    $size = min(12, count($options));
Dries's avatar
   
Dries committed
639

Dries's avatar
   
Dries committed
640
    return form_item($title, "<select name=\"edit[$name][]\"". ($multiple ? " multiple=\"multiple\" size=\"$size\"" : "") . ($extra ? " $extra" : "") .">$select</select>", $description);
Dries's avatar
   
Dries committed
641
  }
Kjartan's avatar
Kjartan committed
642
}
Dries's avatar
   
Dries committed
643

Kjartan's avatar
Kjartan committed
644
645
646
function _taxonomy_depth($depth, $graphic = '--') {
  for ($n = 0; $n < $depth; $n++) {
    $result .= $graphic;
Dries's avatar
   
Dries committed
647
  }
Kjartan's avatar
Kjartan committed
648
649
  return $result;
}
Dries's avatar
   
Dries committed
650

Kjartan's avatar
Kjartan committed
651
652
653
function _prepare_update($data) {
  foreach ($data as $key => $value) {
    $q[] = "$key = '". check_query($value) ."'";
Dries's avatar
   
Dries committed
654
  }
Kjartan's avatar
Kjartan committed
655
656
657
  $result = implode(", ", $q);
  return $result;
}
Dries's avatar
   
Dries committed
658

Kjartan's avatar
Kjartan committed
659
660
661
662
663
664
665
function _prepare_insert($data, $stage) {
  if ($stage == 1) {
    $result = implode(", ", array_keys($data));
  }
  else {
    foreach (array_values($data) as $value) {
      $q[] = "'". check_query($value) ."'";
Dries's avatar
   
Dries committed
666
    }
Kjartan's avatar
Kjartan committed
667
    $result = implode(", ", $q);
Dries's avatar
   
Dries committed
668
  }
Kjartan's avatar
Kjartan committed
669
670
  return "($result)";
}
Dries's avatar
   
Dries committed
671

Dries's avatar
   
Dries committed
672
673
674
675
676
677
678
679
/*
** Accepts taxonomy conditions and returns a resource identifier.  If
** you intend to use the nodes without a pager (eg. in a XML feed),
** then set $pager to false.
*/
function taxonomy_select_nodes($taxonomy, $pager = 1) {
  global $user;

680
681
  if ($taxonomy->str_tids) {
    if ($taxonomy->operator == "or") {
Dries's avatar
   
Dries committed
682
683
      $sql = "SELECT DISTINCT(n.nid), n.title, n.type, n.created, n.changed, n.uid, n.static, n.created, u.name FROM {node} n INNER JOIN {term_node} r ON n.nid = r.nid INNER JOIN {users} u ON n.uid = u.uid WHERE r.tid IN ($taxonomy->str_tids) AND n.status = '1' ORDER BY static DESC, created DESC";
      $sql_count = "SELECT COUNT(DISTINCT(n.nid)) FROM {node} n INNER JOIN {term_node} r ON n.nid = r.nid INNER JOIN {users} u ON n.uid = u.uid WHERE r.tid IN ($taxonomy->str_tids) AND n.status = '1'";
684
685
    }
    else {
Dries's avatar
   
Dries committed
686
      $sql = "SELECT n.nid, n.title, n.type, n.created, n.changed, n.uid, u.name FROM {node} n INNER JOIN {term_node} r ON n.nid = r.nid INNER JOIN {users} u ON n.uid = u.uid WHERE r.tid IN ($taxonomy->str_tids) AND n.status = '1' GROUP BY n.nid, n.title, n.type, n.created, n.changed, n.uid, u.name HAVING COUNT(n.nid) = ". count($taxonomy->tids) ." ORDER BY static DESC, created DESC";
Dries's avatar
   
Dries committed
687

688
      // Special trick as we could not find anything better:
Dries's avatar
   
Dries committed
689
      $count = db_num_rows(db_query("SELECT n.nid FROM {node} n INNER JOIN {term_node} r ON n.nid = r.nid WHERE r.tid IN ($taxonomy->str_tids) AND n.status = '1' GROUP BY n.nid HAVING COUNT(n.nid) = ". count($taxonomy->tids)));
690
691
      $sql_count = "SELECT $count";
    }
Dries's avatar
   
Dries committed
692

693
694
695
696
697
698
    if ($pager) {
      $result = pager_query($sql, variable_get("default_nodes_main", 10) , 0, $sql_count);
    }
    else {
      $result = db_query_range($sql, 0, 15);
    }
Dries's avatar
   
Dries committed
699
700
701
702
703
704
705
706
707
708
709
710
  }

  return $result;
}

/*
** Accepts the result of a db_query() and formats each node along
** with a pager.
*/
function taxonomy_render_nodes($result) {

  while ($node = db_fetch_object($result)) {
Dries's avatar
   
Dries committed
711
    $output .= node_view(node_load(array("nid" => $node->nid, "type" => $node->type)), 1);
Dries's avatar
   
Dries committed
712
  }
Dries's avatar
Dries committed
713
  $output .= theme("pager", NULL, variable_get("default_nodes_main", 10), 0);
Dries's avatar
   
Dries committed
714
  return $output;
Dries's avatar
   
Dries committed
715
716
}

Dries's avatar
   
Dries committed
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
function taxonomy_nodeapi($node, $op, $arg = 0) {

  switch ($op) {
    case "insert":
      taxonomy_node_save($node->nid, $node->taxonomy);
      break;
    case "update":
      taxonomy_node_save($node->nid, $node->taxonomy);
      break;
    case "delete":
      taxonomy_node_delete($node->nid);
      break;
  }
}

Kjartan's avatar
Kjartan committed
732
function taxonomy_page() {
Dries's avatar
   
Dries committed
733

Dries's avatar
   
Dries committed
734
735
736
  $taxonomy->operator = arg(2);
  $taxonomy->str_tids = check_query(arg(3));
  $taxonomy->tids = explode(",", $taxonomy->str_tids);
Dries's avatar
   
Dries committed
737

738
  if (ereg("^([0-9]+,){0,}[0-9]+$", $taxonomy->str_tids)) {
Dries's avatar
   
Dries committed
739
740
741
    switch (arg(1)) {
      case "feed":
        taxonomy_feed($taxonomy);
Kjartan's avatar
Kjartan committed
742
      break;
Dries's avatar
   
Dries committed
743
      default:
Dries's avatar
   
Dries committed
744
      // Build title:
745
      $sql = 'SELECT name FROM {term_data} WHERE tid IN (%s)';
Dries's avatar
   
Dries committed
746
      $result = db_query($sql, $taxonomy->str_tids);
Kjartan's avatar
Kjartan committed
747
      $names = array();
Dries's avatar
   
Dries committed
748
749
750
      while ($term = db_fetch_object($result)) {
        $names[] = $term->name;
      }
Dries's avatar
   
Dries committed
751
752
753
754
755
756
757
758
759
760

      // Build breadcrumb based on first hierarchy of first term:
      $current->tid = $taxonomy->tids[0];
      while ($parents = taxonomy_get_parents($current->tid)) {
        $current = array_shift($parents);
        $breadcrumbs[] = l($current->name, "taxonomy/view/or/$current->tid");
      }
      $breadcrumbs[] = l(t('Home'), '');
      $breadcrumbs = array_reverse($breadcrumbs);

Dries's avatar
   
Dries committed
761
      drupal_set_html_head('<link rel="alternate" type="application/rss+xml" title="RSS - '. implode(' : ', $names) .'" href="'. url("taxonomy/feed/or/$taxonomy->str_tids") .'" />');
Dries's avatar
Dries committed
762

Dries's avatar
   
Dries committed
763
      $output = taxonomy_render_nodes(taxonomy_select_nodes($taxonomy));
Dries's avatar
   
Dries committed
764
      print theme("page", $output, implode(', ', $names), $breadcrumbs);
Dries's avatar
   
Dries committed
765
      break;
Dries's avatar
   
Dries committed
766
767
768
769
    }
  }
  else {
    drupal_not_found();
Dries's avatar
   
Dries committed
770
  }
Kjartan's avatar
Kjartan committed
771
}
Dries's avatar
   
Dries committed
772

Kjartan's avatar
Kjartan committed
773
/*
Dries's avatar
   
Dries committed
774
775
776
** admin
*/

Kjartan's avatar
Kjartan committed
777
function taxonomy_admin() {
Dries's avatar
   
Dries committed
778
779
  $op = $_POST["op"];
  $edit = $_POST["edit"];
Kjartan's avatar
Kjartan committed
780

Dries's avatar
   
Dries committed
781
782
783
  if (empty($op)) {
    $op = arg(2);
  }
Dries's avatar
   
Dries committed
784

Dries's avatar
   
Dries committed
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
  switch ($op) {
    case "add":
      if (arg(3) == "vocabulary") {
        $output .= taxonomy_form_vocabulary();
      }
      else if (arg(3) == "term") {
        $output .= taxonomy_form_term();
      }
      break;
    case "edit":
      if (arg(3) == "vocabulary") {
        $output .= taxonomy_form_vocabulary(object2array(taxonomy_get_vocabulary(arg(4))));
      }
      else if (arg(3) == "term") {
        $output .= taxonomy_form_term(object2array(taxonomy_get_term(arg(4))));
      }
      break;
    case "preview":
      $output .= taxonomy_form(arg(4));
      break;
    case "help":
      $output .= taxonomy_help();
      break;
    case t("Delete"):
      if (!$edit["confirm"]) {
810
        if (arg(3) == "vocabulary") {
Dries's avatar
   
Dries committed
811
          $output .= _taxonomy_confirm_del_vocabulary($edit["vid"]);
812
        }
Dries's avatar
   
Dries committed
813
814
        else {
          $output .= _taxonomy_confirm_del_term($edit["tid"]);
815
        }
Kjartan's avatar
Kjartan committed
816
        break;
Dries's avatar
   
Dries committed
817
818
819
820
821
822
823
824
825
826
827
828
829
830
      }
      else {
        $edit["name"] = 0;
        // fall through:
      }
    case t("Submit"):
      if (arg(3) == "vocabulary") {
        taxonomy_save_vocabulary($edit);
      }
      else {
        taxonomy_save_term($edit);
        if (!$edit["tid"]) {
          // if INSERT show form again
          $output .= taxonomy_form_term();
Dries's avatar
   
Dries committed
831
832
          break;
        }
Dries's avatar
   
Dries committed
833
834
835
836
837
        // else (UPDATE or DELETE) fall through
      }
      // fall through:
    default:
      $output .= taxonomy_overview();
Kjartan's avatar
Kjartan committed
838
  }
Dries's avatar
   
Dries committed
839

Dries's avatar
   
Dries committed
840
  print theme("page", $output);
Kjartan's avatar
Kjartan committed
841
842
}

Dries's avatar
   
Dries committed
843
function taxonomy_help($section = "admin/help#taxonomy") {
Dries's avatar
   
Dries committed
844
  $output = "";
Dries's avatar
   
Dries committed
845

Dries's avatar
   
Dries committed
846
  switch ($section) {
Dries's avatar
   
Dries committed
847
    case 'admin/system/modules#description':
Dries's avatar
   
Dries committed
848
      $output = t("Enables the organization of content into categories.");
Dries's avatar
   
Dries committed
849
      break;
Dries's avatar
   
Dries committed
850
    case 'admin/taxonomy':
Dries's avatar
   
Dries committed
851
      $output = t("The taxonomy module allows you to classify content into categories and subcategories; it allows multi