taxonomy.module 36.5 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");
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
function taxonomy_link($type, $node = NULL) {
Dries's avatar
   
Dries committed
25
26
  if ($type == "system") {
    if (user_access("administer taxonomy")) {
Dries's avatar
   
Dries committed
27
28
29
      menu("admin/taxonomy", t("taxonomy"), "taxonomy_admin", 3);
      menu("admin/taxonomy/add/vocabulary", t("create new vocabulary"), "taxonomy_admin");
      menu("admin/taxonomy/help", t("help"), "taxonomy_admin", 9);
Dries's avatar
   
Dries committed
30
    }
Dries's avatar
   
Dries committed
31
    if (user_access("access content")) {
Dries's avatar
   
Dries committed
32
      menu("taxonomy", t("taxonomy"), "taxonomy_page", 0, MENU_HIDE);
Dries's avatar
   
Dries committed
33
    }
Dries's avatar
   
Dries committed
34
  }
Dries's avatar
   
Dries committed
35
  else if ($type == "taxonomy terms" && $node != NULL) {
Kjartan's avatar
   
Kjartan committed
36
    $links = array();
Dries's avatar
   
Dries committed
37
38
39
    if ($node->taxonomy) {
      foreach ($node->taxonomy as $tid) {
        $term = taxonomy_get_term($tid);
40
        $links[] = l($term->name, "taxonomy/page/or/$term->tid");
Dries's avatar
   
Dries committed
41
42
43
44
      }
    }
    else {

Dries's avatar
   
Dries committed
45
46
47
48
49
50
51
52
    /*
    ** Themes can print taxonomy links with:
    **
    ** if (module_exist("taxonomy")) {
    **   $this->links(taxonomy_link("taxonomy terms", $node));
    ** }
    */

Dries's avatar
   
Dries committed
53
54
      $links = array();
      foreach (taxonomy_node_get_terms($node->nid) as $term) {
55
        $links[] = l($term->name, "taxonomy/page/or/$term->tid");
Dries's avatar
   
Dries committed
56
      }
Dries's avatar
   
Dries committed
57
58
59
60

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

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

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

Dries's avatar
   
Dries committed
72
73
74
  $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."));
  $form .= form_select(t("Types"), "nodes", explode(",", $edit["nodes"]), $nodetypes, t("Required") .". ". t("A list of node types you want to associate this vocabulary with."), "", 1);
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
  }

Dries's avatar
   
Dries committed
95
  $data = array("name" => $edit["name"], "nodes" => implode(",", $edit["nodes"]), "description" => $edit["description"], "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
303
304
}

function taxonomy_form($vocabulary_id, $value = 0) {
  $vocabulary = taxonomy_get_vocabulary($vocabulary_id);
  if ($vocabulary->required) {
Dries's avatar
   
Dries committed
305
    $descriptions = array(t("You must choose one term for this node."), t("You must choose one or more terms for this node."));
Kjartan's avatar
Kjartan committed
306
307
308
    $blank = 0;
  }
  else {
Dries's avatar
   
Dries committed
309
    $descriptions = array(t("You can choose one term for this node."), t("You can choose one or more terms for this node."));
Dries's avatar
   
Dries committed
310
    $blank = "<". t("none") .">";
Kjartan's avatar
Kjartan committed
311
  }
Dries's avatar
   
Dries committed
312

Dries's avatar
   
Dries committed
313
314
315
  $multiple = intval($vocabulary->multiple);

  return _taxonomy_term_select($vocabulary->name, "taxonomy", $value, $vocabulary_id, $descriptions[$multiple], $multiple, $blank);
Kjartan's avatar
Kjartan committed
316
}
Dries's avatar
 
Dries committed
317
318
319
320
321

/*
** API functions
*/

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

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

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

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

Kjartan's avatar
Kjartan committed
359
360
// 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
361
  $term_name = db_result(db_query("SELECT name FROM {term_data} WHERE tid = %d", $tid));
Dries's avatar
 
Dries committed
362

Dries's avatar
   
Dries committed
363
  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
364
365
366
367
}

// 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
368
  $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
369
370
371
  $terms = array();
  while ($term = db_fetch_object($result)) {
    $terms[$term->$key] = $term;
Dries's avatar
 
Dries committed
372
  }
Kjartan's avatar
Kjartan committed
373
374
375
376
377
378
  return $terms;
}

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

Dries's avatar
   
Dries committed
380
  if (!isset($terms[$nid])) {
Dries's avatar
   
Dries committed
381
    $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
382
    $terms[$nid] = array();
Dries's avatar
 
Dries committed
383
    while ($term = db_fetch_object($result)) {
Kjartan's avatar
Kjartan committed
384
      $terms[$nid][$term->$key] = $term;
Dries's avatar
 
Dries committed
385
386
    }
  }
Kjartan's avatar
Kjartan committed
387
388
  return $terms[$nid];
}
Dries's avatar
 
Dries committed
389

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

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

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

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

Kjartan's avatar
Kjartan committed
421
422
423
// hierarchy: get parent terms
function taxonomy_get_parents($tid, $key = "tid") {
  if ($tid) {
Dries's avatar
   
Dries committed
424
    $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
425
426
427
    $parents = array();
    while ($parent = db_fetch_object($result)) {
      $parents[$parent->$key] = $parent;
Dries's avatar
   
Dries committed
428
    }
Kjartan's avatar
Kjartan committed
429
    return $parents;
Dries's avatar
 
Dries committed
430
  }
Kjartan's avatar
Kjartan committed
431
432
433
434
  else {
    return array();
  }
}
Dries's avatar
 
Dries committed
435

Dries's avatar
   
Dries committed
436
437
438
439
440
441
442
443
444
445
446
447
448
449
// 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
450
451
452
// hierarchy: get children
function taxonomy_get_children($tid, $vid = 0, $key = "tid") {
  if ($vid) {
Dries's avatar
   
Dries committed
453
    $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
454
  }
Kjartan's avatar
Kjartan committed
455
  else {
Dries's avatar
   
Dries committed
456
    $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
457
458
459
460
461
462
463
  }
  $children = array();
  while ($term = db_fetch_object($result)) {
    $children[$term->$key] = $term;
  }
  return $children;
}
Dries's avatar
 
Dries committed
464

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

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

Dries's avatar
   
Dries committed
471
472
473
474
  // 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
475
    $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
476
    while ($term = db_fetch_object($result)) {
Dries's avatar
   
Dries committed
477
478
479
      $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
480
481
    }
  }
Dries's avatar
   
Dries committed
482

Dries's avatar
   
Dries committed
483
484
485
486
487
488
  if ($children[$vocabulary_id][$parent]) {
    foreach ($children[$vocabulary_id][$parent] as $child) {
      $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
489

Dries's avatar
   
Dries committed
490
      $tree = array_merge($tree, taxonomy_get_tree($vocabulary_id, $child, $depth));
Dries's avatar
   
Dries committed
491
    }
Kjartan's avatar
Kjartan committed
492
  }
Dries's avatar
   
Dries committed
493

Dries's avatar
   
Dries committed
494
  return $tree ? $tree : array();
Kjartan's avatar
Kjartan committed
495
}
Dries's avatar
 
Dries committed
496

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

Kjartan's avatar
Kjartan committed
511
512
// synonyms: return original term
function taxonomy_get_synonym_root($term) {
Dries's avatar
   
Dries committed
513
  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
514
}
Dries's avatar
   
Dries committed
515

Dries's avatar
   
Dries committed
516
// given a term id, count number of published nodes in it
Dries's avatar
   
Dries committed
517
function taxonomy_term_count_nodes($tid, $type = 0) {
Kjartan's avatar
Kjartan committed
518
  static $count;
Dries's avatar
   
Dries committed
519

Dries's avatar
   
Dries committed
520
521
522
  if (!isset($count[$type])) {
    // $type == 0 always evaluates true is $type is a string
    if (is_numeric($type)) {
Dries's avatar
   
Dries committed
523
      $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
524
525
    }
    else {
Dries's avatar
   
Dries committed
526
      $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
527
    }
Kjartan's avatar
Kjartan committed
528
    while ($term = db_fetch_object($result)) {
Dries's avatar
   
Dries committed
529
      $count[$type][$term->tid] = $term->c;
Dries's avatar
   
Dries committed
530
531
532
    }
  }

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

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

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

Dries's avatar
   
Dries committed
552
/**
Dries's avatar
   
Dries committed
553
554
 * 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
555
 *
Dries's avatar
   
Dries committed
556
557
 * @param $name Name of the vocabulary to search
 * @return array of matching vocabularies, as objects
Dries's avatar
   
Dries committed
558
559
560
 */
function taxonomy_get_vocabulary_by_name($name) {
  // LOWER is ANSI SQL-92
Dries's avatar
   
Dries committed
561
  $db_result = db_query("SELECT * FROM {vocabulary} WHERE LOWER('%s') LIKE LOWER(name)", trim($name));
Dries's avatar
   
Dries committed
562
563
564
565
566
567
568
569
570
  $result = array();
  while ($vocabulary = db_fetch_object($db_result)) {
    $result[] = $vocabulary;
  }

  return $result;
}

/**
Dries's avatar
   
Dries committed
571
572
 * 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
573
 *
Dries's avatar
   
Dries committed
574
575
 * @param name Name of the term to search
 * @return rray of matching terms, as objects
Dries's avatar
   
Dries committed
576
577
578
 */
function taxonomy_get_term_by_name($name) {
  // LOWER is ANSI SQL-92
Dries's avatar
   
Dries committed
579
  $db_result = db_query("SELECT * FROM {term_data} WHERE LOWER('%s') LIKE LOWER(name)", trim($name));
Dries's avatar
   
Dries committed
580
581
582
583
584
585
586
587
  $result = array();
  while ($term = db_fetch_object($db_result)) {
    $result[] = $term;
  }

  return $result;
}

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

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

/*
** service functions
*/

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

Kjartan's avatar
Kjartan committed
605
  if ($blank) {
Dries's avatar
   
Dries committed
606
    $options[] = array("tid" => 0, "name" => $blank);
Kjartan's avatar
Kjartan committed
607
  }
Dries's avatar
 
Dries committed
608

Kjartan's avatar
Kjartan committed
609
610
611
  if ($tree) {
    foreach ($tree as $term) {
      if (!in_array($term->tid, $exclude)) {
Dries's avatar
   
Dries committed
612
        $options[] = array("tid" => $term->tid, "name" => _taxonomy_depth($term->depth, '-').$term->name);
Dries's avatar
 
Dries committed
613
614
      }
    }
Kjartan's avatar
Kjartan committed
615
616
617
618
619
    if (!$blank && !$value) {
      // required but without a predefined value, so set first as predefined
      $value = $tree[0]->tid;
    }
  }
Dries's avatar
 
Dries committed
620

Kjartan's avatar
Kjartan committed
621
  if (count($options) > 0) {
Dries's avatar
   
Dries committed
622
    foreach ($options as $option) {
Dries's avatar
   
Dries committed
623
      $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
624
    }
Dries's avatar
 
Dries committed
625

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

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

Kjartan's avatar
Kjartan committed
632
633
634
function _taxonomy_depth($depth, $graphic = '--') {
  for ($n = 0; $n < $depth; $n++) {
    $result .= $graphic;
Dries's avatar
 
Dries committed
635
  }
Kjartan's avatar
Kjartan committed
636
637
  return $result;
}
Dries's avatar
 
Dries committed
638

Kjartan's avatar
Kjartan committed
639
640
641
function _prepare_update($data) {
  foreach ($data as $key => $value) {
    $q[] = "$key = '". check_query($value) ."'";
Dries's avatar
 
Dries committed
642
  }
Kjartan's avatar
Kjartan committed
643
644
645
  $result = implode(", ", $q);
  return $result;
}
Dries's avatar
 
Dries committed
646

Kjartan's avatar
Kjartan committed
647
648
649
650
651
652
653
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
654
    }
Kjartan's avatar
Kjartan committed
655
    $result = implode(", ", $q);
Dries's avatar
 
Dries committed
656
  }
Kjartan's avatar
Kjartan committed
657
658
  return "($result)";
}
Dries's avatar
   
Dries committed
659

Dries's avatar
   
Dries committed
660
661
662
663
664
665
666
667
/*
** 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;

668
669
  if ($taxonomy->str_tids) {
    if ($taxonomy->operator == "or") {
Dries's avatar
   
Dries committed
670
671
      $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'";
672
673
    }
    else {
Dries's avatar
   
Dries committed
674
      $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
675

676
      // Special trick as we could not find anything better:
Dries's avatar
   
Dries committed
677
      $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)));
678
679
      $sql_count = "SELECT $count";
    }
Dries's avatar
   
Dries committed
680

681
682
683
684
685
686
    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
687
688
689
690
691
692
693
694
695
696
697
698
  }

  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
699
    $output .= node_view(node_load(array("nid" => $node->nid, "type" => $node->type)), 1);
Dries's avatar
   
Dries committed
700
  }
Dries's avatar
Dries committed
701
  $output .= theme("pager", NULL, variable_get("default_nodes_main", 10), 0);
Dries's avatar
   
Dries committed
702
  return $output;
Dries's avatar
   
Dries committed
703
704
}

Dries's avatar
   
Dries committed
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
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
720
function taxonomy_page() {
Dries's avatar
   
Dries committed
721

Dries's avatar
   
Dries committed
722
723
724
725
726
727

  // taxonomy querystring always parsed here
  // TODO: support term *names* in URL (e.g. taxonomy/view/or/milk,beer,red+wine)
  $taxonomy->operator = arg(2);
  $taxonomy->str_tids = check_query(arg(3));
  $taxonomy->tids = explode(",", $taxonomy->str_tids);
Dries's avatar
   
Dries committed
728

Dries's avatar
   
Dries committed
729
  switch (arg(1)) {
Kjartan's avatar
Kjartan committed
730
    case "feed":
Dries's avatar
   
Dries committed
731
      taxonomy_feed($taxonomy);
Kjartan's avatar
Kjartan committed
732
733
      break;
    default:
Dries's avatar
   
Dries committed
734
      // Build title:
735
      $sql = 'SELECT name FROM {term_data} WHERE tid IN (%s)';
Dries's avatar
   
Dries committed
736
737
738
739
      $result = db_query($sql, $taxonomy->str_tids);
      while ($term = db_fetch_object($result)) {
        $names[] = $term->name;
      }
Dries's avatar
   
Dries committed
740
741
742
743
744
745
746
747
748
749

      // 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
750
751
      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
752
      $output = taxonomy_render_nodes(taxonomy_select_nodes($taxonomy));
Dries's avatar
   
Dries committed
753
      print theme("page", $output, implode(', ', $names), $breadcrumbs);
Dries's avatar
   
Dries committed
754
      break;
Dries's avatar
   
Dries committed
755
  }
Kjartan's avatar
Kjartan committed
756
}
Dries's avatar
   
Dries committed
757

Kjartan's avatar
Kjartan committed
758
/*
Dries's avatar
 
Dries committed
759
760
761
** admin
*/

Kjartan's avatar
Kjartan committed
762
function taxonomy_admin() {
Dries's avatar
   
Dries committed
763
764
  $op = $_POST["op"];
  $edit = $_POST["edit"];
Kjartan's avatar
Kjartan committed
765
766

  if (user_access("administer taxonomy")) {
Dries's avatar
   
Dries committed
767
768
769
770
    if (empty($op)) {
      $op = arg(2);
    }

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

Dries's avatar
   
Dries committed
830
  print theme("page", $output);
Kjartan's avatar
Kjartan committed
831
832
}

Dries's avatar
   
Dries committed
833
function taxonomy_help($section = "admin/help#taxonomy") {
Dries's avatar
   
Dries committed
834
  $output = "";
Dries's avatar
   
Dries committed
835

Dries's avatar
   
Dries committed
836
  switch ($section) {
Dries's avatar
   
Dries committed
837
    case 'admin/system/modules#description':
Dries's avatar
   
Dries committed
838
      $output = t("Enables the organization of content into categories.");
Dries's avatar
   
Dries committed
839
      break;
Dries's avatar
   
Dries committed
840
    case 'admin/taxonomy':
Dries's avatar
   
Dries committed
841
      $output = t("The taxonomy module allows you to classify content into categories and subcategories; it allows multiple lists of categories for classification (controlled vocabularies) and offers the possibility of creating thesauri (controlled vocabularies that indicate the relationship of terms) and taxonomies (controlled vocabularies where relationships are indicated hierarchically). To delete a term choose \"edit term\". To delete a vocabulary, and all its terms, choose \"edit vocabulary\".");
Dries's avatar
   
Dries committed