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

4
function taxonomy_system($field){
Kjartan's avatar
Kjartan committed
5
  $system["description"] = t("Enables the organization of content into categories.");
6 7 8
  return $system[$field];
}

Dries's avatar
 
Dries committed
9 10
function taxonomy_feed($taxonomy) {
  global $id, $type;
Dries's avatar
 
Dries committed
11

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

Kjartan's avatar
Kjartan committed
25 26 27
function taxonomy_perm() {
  return array("administer taxonomy");
}
Dries's avatar
 
Dries committed
28

Dries's avatar
 
Dries committed
29
function taxonomy_link($type, $node = NULL) {
Kjartan's avatar
Kjartan committed
30
  if ($type == "admin" && user_access("administer taxonomy")) {
Dries's avatar
 
Dries committed
31 32
    $help["taxonomy"] = 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\".");
    $help["vocabulary"] = t("When you create a controlled vocabulary you are creating a set of terms to use for describing content (known as descriptors in indexing lingo).  Drupal allows you to describe each node type (blog, story, etc.) using one or many of these terms. For simple implementations, you might create a set of categories without subcategories, similar to Slashdot.org's or Kuro5hin.org's sections. For more complex implementations, you might create a hierarchical list of categories.");
Dries's avatar
 
Dries committed
33

Dries's avatar
 
Dries committed
34
    menu("admin/taxonomy", "taxonomy", "taxonomy_admin", $help["taxonomy"], 3);
35
    menu("admin/taxonomy/add/vocabulary", "create new vocabulary", "taxonomy_admin", $help["vocabulary"]);
Dries's avatar
 
Dries committed
36
    menu("admin/taxonomy/help", "help", "taxonomy_admin", NULL, 9);
Dries's avatar
 
Dries committed
37
  }
Dries's avatar
 
Dries committed
38
  else if ($type == "taxonomy terms" && $node != NULL) {
Dries's avatar
 
Dries committed
39 40 41 42 43 44 45 46 47

    if ($node->taxonomy) {
      foreach ($node->taxonomy as $tid) {
        $term = taxonomy_get_term($tid);
        $links[] = l($term->name, "taxonomy/page/or/$term->tid", $term->description ? array("title" => $term->description) : array());
      }
    }
    else {

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

Dries's avatar
 
Dries committed
56 57 58 59
      $links = array();
      foreach (taxonomy_node_get_terms($node->nid) as $term) {
        $links[] = l($term->name, "taxonomy/page/or/$term->tid", $term->description ? array("title" => $term->description) : array());
      }
Dries's avatar
 
Dries committed
60 61 62 63

    }
    return $links;
  }
Kjartan's avatar
Kjartan committed
64 65
}

Dries's avatar
 
Dries committed
66 67 68 69
/*
** admin pages (form, save, overview)
*/

Kjartan's avatar
Kjartan committed
70 71 72 73
function taxonomy_form_vocabulary($edit = array()) {
  foreach (module_list() as $name) {
    if (module_hook($name, "node")) {
      $nodetypes[$name] = $name;
Dries's avatar
 
Dries committed
74
    }
Kjartan's avatar
Kjartan committed
75
  }
Dries's avatar
 
Dries committed
76

Dries's avatar
 
Dries committed
77 78
  $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."));
Dries's avatar
 
Dries committed
79
  $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
80 81
  $form .= form_checkbox(t("Related terms"), "relations", 1, $edit["relations"], t("Optional") . ". " . t("Allows ". l("related terms", "admin/taxonomy/help#relatedterms") ." in this vocabulary."));
  $form .= form_select(t("Hierarchy"), "hierarchy", $edit["hierarchy"], array(t("Disabled"), t("Single"), t("Multiple")), t("Optional") . ". ". t("Allows ". l("a tree-like hierarchy", "admin/taxonomy/help#hierarchy") ." between terms of this vocabulary."), "", 0);
Dries's avatar
 
Dries committed
82 83
  $form .= form_checkbox(t("Multiple select"), "multiple", 1, $edit["multiple"], t("Optional") . ". " . t("Allows nodes to have more than one term in this vocabulary."));
  $form .= form_checkbox(t("Required"), "required", 1, $edit["required"], t("If enabled every node <b>must</b> have at least one term in this vocabulary"));
Dries's avatar
 
Dries committed
84
  $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
85
  $form .= form_submit(t("Submit"));
Dries's avatar
 
Dries committed
86

Kjartan's avatar
Kjartan committed
87
  if ($edit["vid"]) {
Dries's avatar
 
Dries committed
88
    $form .= form_submit(t("Delete"));
Kjartan's avatar
Kjartan committed
89
    $form .= form_hidden("vid", $edit["vid"]);
Dries's avatar
 
Dries committed
90 91
  }

Kjartan's avatar
Kjartan committed
92 93
  return form($form);
}
Kjartan's avatar
Kjartan committed
94

Kjartan's avatar
Kjartan committed
95
function taxonomy_save_vocabulary($edit) {
Dries's avatar
 
Dries committed
96 97
  if (!$edit["nodes"]) {
    $edit["nodes"] = array();
Dries's avatar
 
Dries committed
98 99
  }

Dries's avatar
 
Dries committed
100
  $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
101
  if ($edit["vid"] && $edit["name"]) {
Dries's avatar
 
Dries committed
102
    db_query("UPDATE vocabulary SET ". _prepare_update($data) ." WHERE vid = %d", $edit["vid"]);
Dries's avatar
 
Dries committed
103 104
    module_invoke_all("taxonomy", "update", "vocabulary", $edit);
    $message = t("updated vocabulary '%name'.", array("%name" => $edit["name"]));
Dries's avatar
 
Dries committed
105
  }
Kjartan's avatar
Kjartan committed
106
  else if ($edit["vid"]) {
Dries's avatar
 
Dries committed
107
    $message = taxonomy_del_vocabulary($edit["vid"]);
Kjartan's avatar
Kjartan committed
108 109
  }
  else {
Dries's avatar
 
Dries committed
110
    $data["vid"] = $edit["vid"] = db_next_id("vocabulary_vid");
Kjartan's avatar
Kjartan committed
111
    db_query("INSERT INTO vocabulary ". _prepare_insert($data, 1) ." VALUES ". _prepare_insert($data, 2));
Dries's avatar
 
Dries committed
112 113
    module_invoke_all("taxonomy", "insert", "vocabulary", $edit);
    $message = t("created new vocabulary '%name'.", array("%name" => $edit["name"]));
Kjartan's avatar
Kjartan committed
114
  }
Dries's avatar
 
Dries committed
115 116

  cache_clear_all();
Dries's avatar
 
Dries committed
117 118

  return $message;
Kjartan's avatar
Kjartan committed
119
}
Dries's avatar
 
Dries committed
120

Kjartan's avatar
Kjartan committed
121
function taxonomy_del_vocabulary($vid) {
Dries's avatar
 
Dries committed
122 123
  $vocabulary = taxonomy_get_vocabulary($vid);

Dries's avatar
 
Dries committed
124 125
  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
126 127
  while ($term = db_fetch_object($result)) {
    taxonomy_del_term($term->tid);
Dries's avatar
 
Dries committed
128
  }
Dries's avatar
 
Dries committed
129

Dries's avatar
 
Dries committed
130 131
  module_invoke_all("taxonomy", "delete", "vocabulary", $vocabulary);

Dries's avatar
 
Dries committed
132 133
  cache_clear_all();

Dries's avatar
 
Dries committed
134 135 136 137 138 139 140 141 142 143 144 145 146
  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
147
}
Dries's avatar
 
Dries committed
148

Kjartan's avatar
Kjartan committed
149
function taxonomy_form_term($edit = array()) {
150
  $vocabulary_id = isset($edit["vid"]) ? $edit["vid"] : arg(4);
Kjartan's avatar
Kjartan committed
151
  $vocabulary = taxonomy_get_vocabulary($vocabulary_id);
Dries's avatar
 
Dries committed
152

Dries's avatar
 
Dries committed
153 154
  $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
155

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

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

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

174 175 176 177
  if ($vocabulary->relations) {
    $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"]));
  }

Dries's avatar
 
Dries committed
178
  $form .= form_textarea(t("Synonyms"), "synonyms", implode("\n", taxonomy_get_synonyms($edit["tid"])), 30, 5, t("Optional") . ". ". t(l("Synonyms", "admin/taxonomy/help#synonyms") ." of this term, one synonym per line."));
Dries's avatar
 
Dries committed
179
  $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
180
  $form .= form_hidden("vid", $vocabulary->vid);
Dries's avatar
 
Dries committed
181
  $form .= form_submit(t("Submit"));
Kjartan's avatar
Kjartan committed
182 183

  if ($edit["tid"]) {
Dries's avatar
 
Dries committed
184
    $form .= form_submit(t("Delete"));
Kjartan's avatar
Kjartan committed
185
    $form .= form_hidden("tid", $edit["tid"]);
Dries's avatar
 
Dries committed
186 187
  }

Kjartan's avatar
Kjartan committed
188 189
  return form($form);
}
Dries's avatar
 
Dries committed
190

Kjartan's avatar
Kjartan committed
191
function taxonomy_save_term($edit) {
Dries's avatar
 
Dries committed
192
  if ($edit["tid"] && $edit["name"]) {
Kjartan's avatar
Kjartan committed
193
    $data = array("name" => $edit["name"], "description" => $edit["description"], "weight" => $edit["weight"]);
Dries's avatar
 
Dries committed
194

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

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

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

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

Dries's avatar
 
Dries committed
243 244
  cache_clear_all();

Dries's avatar
 
Dries committed
245
  return $message;
Kjartan's avatar
Kjartan committed
246
}
Dries's avatar
 
Dries committed
247

Kjartan's avatar
Kjartan committed
248
function taxonomy_del_term($tid) {
Dries's avatar
 
Dries committed
249 250
  $term = taxonomy_get_term($tid);

Dries's avatar
 
Dries committed
251 252 253 254 255
  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
256

Dries's avatar
 
Dries committed
257
  module_invoke_all("taxonomy", "delete", "term", $term);
Dries's avatar
 
Dries committed
258

Dries's avatar
 
Dries committed
259 260
  cache_clear_all();

Dries's avatar
 
Dries committed
261 262 263 264 265 266 267 268 269 270 271 272 273
  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
274
}
Dries's avatar
 
Dries committed
275

Kjartan's avatar
Kjartan committed
276
function taxonomy_overview() {
Dries's avatar
 
Dries committed
277

Dries's avatar
 
Dries committed
278
  $output .= "<h3>" . t("Vocabularies overview") . "</h3>";
Dries's avatar
 
Dries committed
279 280

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

Kjartan's avatar
Kjartan committed
282 283 284
  $vocabularies = taxonomy_get_vocabularies();
  foreach ($vocabularies as $vocabulary) {
    $links = array();
Dries's avatar
 
Dries committed
285
    $rows[] = array($vocabulary->name, array("data" => $vocabulary->nodes, "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
286

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

Dries's avatar
 
Dries committed
297
  return table($header, $rows);
Kjartan's avatar
Kjartan committed
298 299 300 301 302 303 304 305 306 307
}

function taxonomy_form($vocabulary_id, $value = 0) {
  $vocabulary = taxonomy_get_vocabulary($vocabulary_id);
  if ($vocabulary->required) {
    $verb = "must";
    $blank = 0;
  }
  else {
    $verb = "can";
Dries's avatar
 
Dries committed
308
    $blank = "<" . t("none") . ">";
Kjartan's avatar
Kjartan committed
309
  }
Dries's avatar
 
Dries committed
310

Kjartan's avatar
Kjartan committed
311
  if ($vocabulary->multiple) {
Dries's avatar
 
Dries committed
312
    $description = t("You $verb choose one or more terms for this node.");
Kjartan's avatar
Kjartan committed
313
    $multiple = 1;
Dries's avatar
 
Dries committed
314
  }
Kjartan's avatar
Kjartan committed
315
  else {
Dries's avatar
 
Dries committed
316
    $description = t("You $verb choose one term for this node.");
Kjartan's avatar
Kjartan committed
317 318 319 320
    $multiple = 0;
  }
  return _taxonomy_term_select($vocabulary->name, "taxonomy", $value, $vocabulary_id, $description, $multiple, $blank);
}
Dries's avatar
 
Dries committed
321 322 323 324 325

/*
** API functions
*/

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

Kjartan's avatar
Kjartan committed
339 340
  return $vocabularies;
}
Dries's avatar
 
Dries committed
341

Kjartan's avatar
Kjartan committed
342 343 344 345 346
// 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
347 348
    }
    else {
Kjartan's avatar
Kjartan committed
349
      $terms = 0;
Dries's avatar
 
Dries committed
350
    }
Kjartan's avatar
Kjartan committed
351 352 353 354
  }
  else {
    $terms = $node->taxonomy;
  }
Dries's avatar
 
Dries committed
355

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

Kjartan's avatar
Kjartan committed
363 364
// 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
365
  $term_name = db_result(db_query("SELECT name FROM term_data WHERE tid = %d", $tid));
Dries's avatar
 
Dries committed
366

Dries's avatar
 
Dries committed
367
  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
368 369 370 371
}

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

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

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

Kjartan's avatar
Kjartan committed
394 395 396
// save terms of a node
function taxonomy_node_save($nid, $terms) {
  taxonomy_node_delete($nid);
Dries's avatar
 
Dries committed
397

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

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

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

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

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

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

Kjartan's avatar
Kjartan committed
459
  $depth++;
Dries's avatar
 
Dries committed
460

Dries's avatar
 
Dries committed
461 462 463 464
  // 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
465
    $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
466
    while ($term = db_fetch_object($result)) {
Dries's avatar
 
Dries committed
467 468 469
      $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
470 471
    }
  }
Dries's avatar
 
Dries committed
472

Dries's avatar
 
Dries committed
473 474 475 476 477 478
  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
479

Dries's avatar
 
Dries committed
480
      $tree = array_merge($tree, taxonomy_get_tree($vocabulary_id, $child, $depth));
Dries's avatar
 
Dries committed
481
    }
Kjartan's avatar
Kjartan committed
482
  }
Dries's avatar
 
Dries committed
483

Dries's avatar
 
Dries committed
484
  return $tree ? $tree : array();
Kjartan's avatar
Kjartan committed
485
}
Dries's avatar
 
Dries committed
486

Kjartan's avatar
Kjartan committed
487 488 489
// synonyms: return array of synonyms
function taxonomy_get_synonyms($tid) {
  if ($tid) {
Dries's avatar
 
Dries committed
490
    $result = db_query("SELECT name FROM term_synonym WHERE tid = %d", $tid);
Kjartan's avatar
Kjartan committed
491 492
    while ($synonym = db_fetch_array($result)) {
      $synonyms[] = $synonym["name"];
Dries's avatar
 
Dries committed
493
    }
Kjartan's avatar
Kjartan committed
494
    return $synonyms ? $synonyms : array();
Dries's avatar
 
Dries committed
495
  }
Kjartan's avatar
Kjartan committed
496 497
  else {
    return array();
Dries's avatar
 
Dries committed
498
  }
Kjartan's avatar
Kjartan committed
499
}
Dries's avatar
 
Dries committed
500

Kjartan's avatar
Kjartan committed
501 502 503 504
// synonyms: return original term
function taxonomy_get_synonym_root($term) {
  return db_fetch_object(db_query("SELECT * FROM term_synonym s, term_data t WHERE t.tid = s.tid AND s.name = '%s'", $term));
}
Dries's avatar
 
Dries committed
505

Dries's avatar
 
Dries committed
506
// given a term id, count number of published nodes in it
Dries's avatar
 
Dries committed
507
function taxonomy_term_count_nodes($tid, $type = 0) {
Kjartan's avatar
Kjartan committed
508
  static $count;
Dries's avatar
 
Dries committed
509

Dries's avatar
 
Dries committed
510 511 512
  if (!isset($count[$type])) {
    // $type == 0 always evaluates true is $type is a string
    if (is_numeric($type)) {
Dries's avatar
 
Dries committed
513
      $result = db_query("SELECT t.tid, COUNT(*) AS c FROM term_node t LEFT JOIN node n ON t.nid = n.nid WHERE n.status = 1 GROUP BY t.tid");
Dries's avatar
 
Dries committed
514 515
    }
    else {
Dries's avatar
 
Dries committed
516
      $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
517
    }
Kjartan's avatar
Kjartan committed
518
    while ($term = db_fetch_object($result)) {
Dries's avatar
 
Dries committed
519
      $count[$type][$term->tid] = $term->c;
Dries's avatar
 
Dries committed
520 521 522
    }
  }

Kjartan's avatar
Kjartan committed
523
  foreach (_taxonomy_term_children($tid) as $c) {
Dries's avatar
 
Dries committed
524
    $children_count += taxonomy_term_count_nodes($c, $type);
Kjartan's avatar
Kjartan committed
525
  }
Dries's avatar
 
Dries committed
526
  return $count[$type][$tid] + $children_count;
Kjartan's avatar
Kjartan committed
527 528 529 530 531
}

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

Dries's avatar
 
Dries committed
533
  if (!isset($children)) {
Kjartan's avatar
Kjartan committed
534 535 536
    $result = db_query("SELECT tid, parent FROM term_hierarchy");
    while ($term = db_fetch_object($result)) {
      $children[$term->parent][] = $term->tid;
Dries's avatar
 
Dries committed
537
    }
Dries's avatar
 
Dries committed
538
  }
Kjartan's avatar
Kjartan committed
539 540
  return $children[$tid] ? $children[$tid] : array();
}
Dries's avatar
 
Dries committed
541

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

  return $result;
}

/**
 * Try to map a string to existing terms
 * Provide case insensitive and trimmed map so as to
 * maximize likelihood of successful mapping.
 *
 * @param   string  $name  Name of the term to search
 * @return  array   array of matching terms, as objects
 */
function taxonomy_get_term_by_name($name) {
  // LOWER is ANSI SQL-92
  $db_result = db_query("SELECT * FROM term_data WHERE LOWER('%s') LIKE LOWER(name)", trim($name));
  $result = array();
  while ($term = db_fetch_object($db_result)) {
    $result[] = $term;
  }

  return $result;
}

Kjartan's avatar
Kjartan committed
580 581
function taxonomy_get_vocabulary($vid) {
  // simple cache using a static var?
Dries's avatar
 
Dries committed
582
  return db_fetch_object(db_query("SELECT * FROM vocabulary WHERE vid = %d", $vid));
Kjartan's avatar
Kjartan committed
583
}
Dries's avatar
 
Dries committed
584

Kjartan's avatar
Kjartan committed
585 586
function taxonomy_get_term($tid) {
  // simple cache using a static var?
Dries's avatar
 
Dries committed
587
  return db_fetch_object(db_query("SELECT * FROM term_data WHERE tid = %d", $tid));
Kjartan's avatar
Kjartan committed
588
}
Dries's avatar
 
Dries committed
589 590 591 592 593

/*
** service functions
*/

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

Kjartan's avatar
Kjartan committed
597
  if ($blank) {
Dries's avatar
 
Dries committed
598
    $options[] = array("tid" => 0, "name" => $blank);
Kjartan's avatar
Kjartan committed
599
  }
Dries's avatar
 
Dries committed
600

Kjartan's avatar
Kjartan committed
601 602 603
  if ($tree) {
    foreach ($tree as $term) {
      if (!in_array($term->tid, $exclude)) {
Dries's avatar
 
Dries committed
604
        $options[] = array("tid" => $term->tid, "name" => _taxonomy_depth($term->depth, '-').$term->name);
Dries's avatar
 
Dries committed
605 606
      }
    }
Kjartan's avatar
Kjartan committed
607 608 609 610 611
    if (!$blank && !$value) {
      // required but without a predefined value, so set first as predefined
      $value = $tree[0]->tid;
    }
  }
Dries's avatar
 
Dries committed
612

Kjartan's avatar
Kjartan committed
613
  if (count($options) > 0) {
Dries's avatar
 
Dries committed
614 615
    foreach ($options as $option) {
      $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
616
    }
Dries's avatar
 
Dries committed
617

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

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

Kjartan's avatar
Kjartan committed
624 625 626
function _taxonomy_depth($depth, $graphic = '--') {
  for ($n = 0; $n < $depth; $n++) {
    $result .= $graphic;
Dries's avatar
 
Dries committed
627
  }
Kjartan's avatar
Kjartan committed
628 629
  return $result;
}
Dries's avatar
 
Dries committed
630

Kjartan's avatar
Kjartan committed
631 632 633
function _prepare_update($data) {
  foreach ($data as $key => $value) {
    $q[] = "$key = '". check_query($value) ."'";
Dries's avatar
 
Dries committed
634
  }
Kjartan's avatar
Kjartan committed
635 636 637
  $result = implode(", ", $q);
  return $result;
}
Dries's avatar
 
Dries committed
638

Kjartan's avatar
Kjartan committed
639 640 641 642 643 644 645
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
646
    }
Kjartan's avatar
Kjartan committed
647
    $result = implode(", ", $q);
Dries's avatar
 
Dries committed
648
  }
Kjartan's avatar
Kjartan committed
649 650
  return "($result)";
}
Dries's avatar
 
Dries committed
651

Dries's avatar
 
Dries committed
652 653 654 655 656 657 658 659
/*
** 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;

660 661 662 663 664 665 666
  if ($taxonomy->str_tids) {
    if ($taxonomy->operator == "or") {
      $sql = "SELECT DISTINCT(n.nid), n.title, n.type, n.created, n.changed, n.uid, n.static, n.created, u.name FROM node n LEFT JOIN term_node r ON n.nid = r.nid LEFT 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 LEFT JOIN term_node r ON n.nid = r.nid LEFT JOIN users u ON n.uid = u.uid WHERE r.tid IN ($taxonomy->str_tids) AND n.status = '1'";
    }
    else {
      $sql = "SELECT n.nid, n.title, n.type, n.created, n.changed, n.uid, u.name FROM node n LEFT JOIN term_node r ON n.nid = r.nid LEFT 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
667

668 669 670 671
      // Special trick as we could not find anything better:
      $count = db_num_rows(db_query("SELECT n.nid FROM node n LEFT 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)));
      $sql_count = "SELECT $count";
    }
Dries's avatar
 
Dries committed
672

673 674 675 676 677 678
    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
679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695
  }

  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)) {
    node_view(node_load(array("nid" => $node->nid, "type" => $node->type)), 1);
  }
  print pager_display_default(NULL, variable_get("default_nodes_main", 10), 0);
}

Dries's avatar
 
Dries committed
696 697 698 699 700 701 702 703 704 705 706 707 708 709 710
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
711
function taxonomy_page() {
Dries's avatar
 
Dries committed
712

Dries's avatar
 
Dries committed
713 714 715 716 717 718

  // 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
719

Dries's avatar
 
Dries committed
720
  switch (arg(1)) {
Kjartan's avatar
Kjartan committed
721
    case "feed":
Dries's avatar
 
Dries committed
722
      taxonomy_feed($taxonomy);
Kjartan's avatar
Kjartan committed
723 724
      break;
    default:
Dries's avatar
 
Dries committed
725
      theme("header");
Dries's avatar
 
Dries committed
726
      taxonomy_render_nodes(taxonomy_select_nodes($taxonomy));
Dries's avatar
 
Dries committed
727
      theme("footer");
Dries's avatar
 
Dries committed
728
      break;
Dries's avatar
 
Dries committed
729
  }
Kjartan's avatar
Kjartan committed
730
}
Dries's avatar
 
Dries committed
731

Kjartan's avatar
Kjartan committed
732
/*
Dries's avatar
 
Dries committed
733 734 735
** admin
*/

Kjartan's avatar
Kjartan committed
736
function taxonomy_admin() {
Dries's avatar
 
Dries committed
737 738
  $op = $_POST["op"];
  $edit = $_POST["edit"];
Kjartan's avatar
Kjartan committed
739 740

  if (user_access("administer taxonomy")) {
Dries's avatar
 
Dries committed
741 742 743 744
    if (empty($op)) {
      $op = arg(2);
    }

Kjartan's avatar
Kjartan committed
745
    switch ($op) {
746 747 748 749 750
      case "add":
        if (arg(3) == "vocabulary")
          $output .= taxonomy_form_vocabulary();
        else if (arg(3) == "term")
          $output .= taxonomy_form_term();
Dries's avatar
 
Dries committed
751
        break;
752 753 754 755 756
      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))));
Kjartan's avatar
Kjartan committed
757 758
        break;
      case "preview":
759
        $output .= taxonomy_form(arg(4));
Kjartan's avatar
Kjartan committed
760 761
        break;
      case "help":
762
        $output .= taxonomy_help();
Kjartan's avatar
Kjartan committed
763
        break;
Dries's avatar
 
Dries committed
764
      case t("Delete"):
Dries's avatar
 
Dries committed
765
        if (!$edit["confirm"]) {
Dries's avatar
 
Dries committed
766
          if (arg(3) == "vocabulary") {
767
            $output .= _taxonomy_confirm_del_vocabulary($edit["vid"]);
Dries's avatar
 
Dries committed
768 769
          }
          else {
770
            $output .= _taxonomy_confirm_del_term($edit["tid"]);
Dries's avatar
 
Dries committed
771 772 773 774 775 776 777
          }
          break;
        }
        else {
          $edit["name"] = 0;
          // fall through:
        }
Dries's avatar
 
Dries committed
778
      case t("Submit"):
779 780
        if (arg(3) == "vocabulary") {
          $output .= status(taxonomy_save_vocabulary($edit));
Kjartan's avatar
Kjartan committed
781 782
        }
        else {
Dries's avatar
 
Dries committed
783
          $output .= status(taxonomy_save_term($edit));
Dries's avatar
 
Dries committed
784 785
          if (!$edit["tid"]) {
            // if INSERT show form again
786
            $output .= taxonomy_form_term();
Dries's avatar
 
Dries committed
787 788 789
            break;
          }
          // else (UPDATE or DELETE) fall through
Kjartan's avatar
Kjartan committed
790
        }
Kjartan's avatar