taxonomy.module 35.2 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){
Dries's avatar
   
Dries committed
5
6
7
8
9
  $output = "";

  if ($field == "description") {$output = taxonomy_help("admin/system/modules"); };

  return $output;
10
11
}

Dries's avatar
   
Dries committed
12
13
function taxonomy_feed($taxonomy) {
  global $id, $type;
Dries's avatar
   
Dries committed
14

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

Kjartan's avatar
Kjartan committed
28
29
30
function taxonomy_perm() {
  return array("administer taxonomy");
}
Dries's avatar
 
Dries committed
31

Dries's avatar
   
Dries committed
32
function taxonomy_link($type, $node = NULL) {
Dries's avatar
   
Dries committed
33
34
  if ($type == "system") {
    if (user_access("administer taxonomy")) {
Dries's avatar
   
Dries committed
35
36
37
      menu("admin/taxonomy", t("taxonomy"), "taxonomy_admin", taxonomy_help("admin/taxonomy"), 3);
      menu("admin/taxonomy/add/vocabulary", t("create new vocabulary"), "taxonomy_admin", taxonomy_help("admin/taxonomy/add/vocabulary"));
      menu("admin/taxonomy/help", t("help"), "taxonomy_admin", NULL, 9);
Dries's avatar
   
Dries committed
38
    }
Dries's avatar
   
Dries committed
39
  }
Dries's avatar
   
Dries committed
40
  else if ($type == "taxonomy terms" && $node != NULL) {
Kjartan's avatar
   
Kjartan committed
41
    $links = array();
Dries's avatar
   
Dries committed
42
43
44
    if ($node->taxonomy) {
      foreach ($node->taxonomy as $tid) {
        $term = taxonomy_get_term($tid);
45
        $links[] = l($term->name, "taxonomy/page/or/$term->tid");
Dries's avatar
   
Dries committed
46
47
48
49
      }
    }
    else {

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

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

    }
    return $links;
  }
Kjartan's avatar
Kjartan committed
66
67
}

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

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

Dries's avatar
   
Dries committed
79
80
  $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
81
  $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
82
83
  $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
84
85
  $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
86
  $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
87
  $form .= form_submit(t("Submit"));
Dries's avatar
 
Dries committed
88

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

Kjartan's avatar
Kjartan committed
94
95
  return form($form);
}
Kjartan's avatar
Kjartan committed
96

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

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

  cache_clear_all();
Dries's avatar
   
Dries committed
119
120

  return $message;
Kjartan's avatar
Kjartan committed
121
}
Dries's avatar
 
Dries committed
122

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

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

Dries's avatar
   
Dries committed
132
133
  module_invoke_all("taxonomy", "delete", "vocabulary", $vocabulary);

Dries's avatar
   
Dries committed
134
135
  cache_clear_all();

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

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

Dries's avatar
   
Dries committed
155
156
  $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
157

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

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

Kjartan's avatar
Kjartan committed
168
    if ($vocabulary->hierarchy == 1) {
Dries's avatar
   
Dries committed
169
      $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
170
    }
Kjartan's avatar
Kjartan committed
171
    elseif ($vocabulary->hierarchy == 2) {
Dries's avatar
   
Dries committed
172
      $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
173
    }
Kjartan's avatar
Kjartan committed
174
  }
Dries's avatar
 
Dries committed
175

176
177
178
179
  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
180
  $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
181
  $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
182
  $form .= form_hidden("vid", $vocabulary->vid);
Dries's avatar
   
Dries committed
183
  $form .= form_submit(t("Submit"));
Kjartan's avatar
Kjartan committed
184
185

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

Kjartan's avatar
Kjartan committed
190
191
  return form($form);
}
Dries's avatar
 
Dries committed
192

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

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

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

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

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

Dries's avatar
   
Dries committed
245
246
  cache_clear_all();

Dries's avatar
   
Dries committed
247
  return $message;
Kjartan's avatar
Kjartan committed
248
}
Dries's avatar
 
Dries committed
249

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

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

Dries's avatar
   
Dries committed
259
  module_invoke_all("taxonomy", "delete", "term", $term);
Dries's avatar
   
Dries committed
260

Dries's avatar
   
Dries committed
261
262
  cache_clear_all();

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

Kjartan's avatar
Kjartan committed
278
function taxonomy_overview() {
Dries's avatar
 
Dries committed
279

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

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

Kjartan's avatar
Kjartan committed
284
  $vocabularies = taxonomy_get_vocabularies();
Dries's avatar
   
Dries committed
285

Kjartan's avatar
Kjartan committed
286
287
  foreach ($vocabularies as $vocabulary) {
    $links = array();
Dries's avatar
   
Dries committed
288
    $rows[] = array($vocabulary->name, array("data" => module_invoke($vocabulary->nodes, "node", "name"), "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
289

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

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

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
311
    $blank = "<" . t("none") . ">";
Kjartan's avatar
Kjartan committed
312
  }
Dries's avatar
   
Dries committed
313

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

/*
** API functions
*/

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

Kjartan's avatar
Kjartan committed
342
343
  return $vocabularies;
}
Dries's avatar
 
Dries committed
344

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

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

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

Dries's avatar
   
Dries committed
370
  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
371
372
373
374
}

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

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

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

Kjartan's avatar
Kjartan committed
397
398
399
// save terms of a node
function taxonomy_node_save($nid, $terms) {
  taxonomy_node_delete($nid);
Dries's avatar
 
Dries committed
400

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

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

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

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

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

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

Kjartan's avatar
Kjartan committed
462
  $depth++;
Dries's avatar
   
Dries committed
463

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

Dries's avatar
   
Dries committed
476
477
478
479
480
481
  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
482

Dries's avatar
   
Dries committed
483
      $tree = array_merge($tree, taxonomy_get_tree($vocabulary_id, $child, $depth));
Dries's avatar
   
Dries committed
484
    }
Kjartan's avatar
Kjartan committed
485
  }
Dries's avatar
   
Dries committed
486

Dries's avatar
   
Dries committed
487
  return $tree ? $tree : array();
Kjartan's avatar
Kjartan committed
488
}
Dries's avatar
 
Dries committed
489

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

Kjartan's avatar
Kjartan committed
504
505
// synonyms: return original term
function taxonomy_get_synonym_root($term) {
Dries's avatar
   
Dries committed
506
  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
507
}
Dries's avatar
   
Dries committed
508

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

Dries's avatar
   
Dries committed
513
514
515
  if (!isset($count[$type])) {
    // $type == 0 always evaluates true is $type is a string
    if (is_numeric($type)) {
Dries's avatar
   
Dries committed
516
      $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
517
518
    }
    else {
Dries's avatar
   
Dries committed
519
      $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
520
    }
Kjartan's avatar
Kjartan committed
521
    while ($term = db_fetch_object($result)) {
Dries's avatar
   
Dries committed
522
      $count[$type][$term->tid] = $term->c;
Dries's avatar
   
Dries committed
523
524
525
    }
  }

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

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

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

Dries's avatar
   
Dries committed
545
546
547
548
549
550
551
552
553
554
/**
 * 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
Dries's avatar
   
Dries committed
555
  $db_result = db_query("SELECT * FROM {vocabulary} WHERE LOWER('%s') LIKE LOWER(name)", trim($name));
Dries's avatar
   
Dries committed
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
  $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
Dries's avatar
   
Dries committed
574
  $db_result = db_query("SELECT * FROM {term_data} WHERE LOWER('%s') LIKE LOWER(name)", trim($name));
Dries's avatar
   
Dries committed
575
576
577
578
579
580
581
582
  $result = array();
  while ($term = db_fetch_object($db_result)) {
    $result[] = $term;
  }

  return $result;
}

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

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

/*
** service functions
*/

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

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

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

Kjartan's avatar
Kjartan committed
616
  if (count($options) > 0) {
Dries's avatar
   
Dries committed
617
618
    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
619
    }
Dries's avatar
 
Dries committed
620

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

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

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

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

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

Dries's avatar
   
Dries committed
655
656
657
658
659
660
661
662
/*
** 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;

663
664
  if ($taxonomy->str_tids) {
    if ($taxonomy->operator == "or") {
Dries's avatar
   
Dries committed
665
666
      $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'";
667
668
    }
    else {
Dries's avatar
   
Dries committed
669
      $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
670

671
      // Special trick as we could not find anything better:
Dries's avatar
   
Dries committed
672
      $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)));
673
674
      $sql_count = "SELECT $count";
    }
Dries's avatar
   
Dries committed
675

676
677
678
679
680
681
    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
682
683
684
685
686
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)) {
    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
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
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
714
function taxonomy_page() {
Dries's avatar
   
Dries committed
715

Dries's avatar
   
Dries committed
716
717
718
719
720
721

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

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

Kjartan's avatar
Kjartan committed
735
/*
Dries's avatar
 
Dries committed
736
737
738
** admin
*/

Kjartan's avatar
Kjartan committed
739
function taxonomy_admin() {
Dries's avatar
   
Dries committed
740
741
  $op = $_POST["op"];
  $edit = $_POST["edit"];
Kjartan's avatar
Kjartan committed
742
743

  if (user_access("administer taxonomy")) {
Dries's avatar
   
Dries committed
744
745
746
747
    if (empty($op)) {
      $op = arg(2);
    }

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

803
  return $output;
Kjartan's avatar
Kjartan committed
804
805
}

Dries's avatar
   
Dries committed
806
function taxonomy_help($section = "admin/taxonomy/help") {
Dries's avatar
   
Dries committed
807
  $output = "";
Dries's avatar
   
Dries committed
808

Dries's avatar
   
Dries committed
809
810
  switch ($section) {
    case "admin/system/modules":
Dries's avatar
   
Dries committed
811
      $output = t("Enables the organization of content into categories.");
Dries's avatar
   
Dries committed
812
813
      break;
    case "admin/taxonomy":
Dries's avatar
   
Dries committed
814
      $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
815
816
      break;
    case "admin/taxonomy/add/vocabulary":
Dries's avatar
   
Dries committed
817
      $output = 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
818
819
      break;
    case "admin/taxonomy/help":
Dries's avatar
   
Dries committed
820
      $output .= "<h3>Background</h3><p>Taxonomy is the study of classification. Drupal's taxonomy module allows you to define categories which are used to classify content. The module supports hierarchical classification and association between terms, allowing for truly flexible information retrieval and classification. For more details about %classification-types and insight into the development of the <i>taxonomy.module</i>, see this %drupal-dis.</p>";
Dries's avatar
   
Dries committed
821
822
      $output .= "<h3>An example taxonomy: food</h3><ul><li>Dairy<ul><li>Milk</li></ul></li><li>Drink<ul><li>Alchohol<ul><li>Beer</li><li>Wine</li></ul></li><li>Pop</li><li>Milk</li></ul></li><li>Meat<ul><li>Beef</li><li>Chicken</li><li>Lamb</li></ul></li><li>Spices<ul><li>Sugar</li></ul></li></ul>";
      $output .= "<p><b>Notes</b></p><ul><li>The term <i>Milk</i> appears within both <i>Dairy</i> and <i>Drink</i>.  This is an example of <i>multiple parents</i> for a term.</li><li>In Drupal the order of siblings (e.g. <i>Beef</i>, <i>Chicken</i>, <i>Lamb</i>) in a taxonomy may be controlled with the <i>weight</i> parameter.</li></ul>";
Dries's avatar
   
Dries committed
823
      $output .= "<h3>Vocabularies</h3><p>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 of content (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's sections.  For more complex implementations, you might create a hierarchical list of categories such as <i>Food</i> taxonomy shown above.</p>";
Dries's avatar
   
Dries committed
824
      $output .= "<h4>Setting up a vocabulary</h4><p>When setting up a controlled vocabulary, if you select the <i>hierarchy</i> option, you will be defining a taxonomy or a thesaurus. If you select the <i>related terms</i> option, you are allowing the definition of related terms, think <i>see also</i>, as in a thesaurus. Selecting <i>multiple select</i> will allow you to describe a node using more than one term. That node will then appear in each term's page, thus increasing the chance that a user will find it.</p>";
Dries's avatar
   
Dries committed
825
826
827
828
829
830
831
832
833
834
      $output .= "<p>When setting up a controlled vocabulary you are asked for: <ul>";
      $output .= "<li><b>Vocabulary name</b> (Required) -- The name for this vocabulary. Example: <i>Dairy</i>.</li>";
      $output .= "<li><b>Description</b> (Optional) -- Description of the vocabulary, this can be used by modules and feeds.</li>";
      $output .= "<li><b>Types</b> (Required) -- The list of node types you want to associate this vocabulary with. Some available types are: blog, book, forum, page, story.</li>";
      $output .= "<li><a id=\"relatedterms\"></a><b>Related terms</b> -- Allows relationships between terms within this vocabulary. Think of these as <i>see also</i>-references.</li>";
      $output .= "<li><a id=\"hierarchy\"></a><b>Hierarchy</b> -- Allows a tree-like taxonomy, as in our <i>Foods</i> example above</li>";
      $output .= "<li><b>Multiple select</b> -- Allows nodes to be described using more than one term. Nodes may then appear on multiple taxonomy pages.</li>";
      $output .= "<li><b>Required</b> -- Each node has to have a term in this vacabulary associated with it.</li>";
      $output .= "<li><b>Weight</b> -- The over all weight for this vocaulary in listings with multiple vacabularies.</li>";
      $output .= "</ul></p>";
Dries's avatar
   
Dries committed
835
      $output .= "<h4>Adding terms to a vocabulary</h4><p>Once done defining the vocabulary, you have to add terms to it to make it useful. The options you see when adding a term to a vocabulary will depend on what you selected for <i>related terms</i>, <i>hierarchy </i>and <i>multiple select</i>. These options are:</p>";
Dries's avatar
   
Dries committed
836
837
838
839
840
841
842
843
844
      $output .= "<p><ul>";
      $output .= "<li><b>Term name</b> (Required) -- The name for this term. Example: <i>Milk</i></li>";
      $output .= "<li><b>Description</b> (Optional) -- Description of the term that may be used by modules and feeds.  This is synonymous with a 'scope note'.</li>";
      $output .= "<li><b><a id=\"parent\"></a>Parent</b> (Required) -- Select the term under which this term is a subset -- the branch of the hierarchy that this term belongs under. This is also known as the \"Broader term\" indicator used in thesauri.</li>";
      $output .= "<li><b><a id=\"synonyms\"></a>Synonyms</b> (Optional) -- Enter synonyms for this term, one synonym per line. Synonyms can be used for variant spellings, acronyms, and other terms that have the same meaning as the added term, but which are not explicitly listed in this thesaurus (i.e. <i>unauthorized terms</i>)</li>";
      $output .= "<li><b>Weight</b> (Optional) -- The weight is used to sort the terms of this vocabulary.</li>";
      $output .= "</ul></p>";
      $output .= "<h3><a id=\"taxonomyURL\"></a>Displaying nodes organized by term(s)</h3><p>In order to view the nodes associated with a term or a collection of terms, you should browse to a properly formed Taxonomy URL. For example, %taxo-example.  Taxonomy URLs always contain one or more term IDs (tid) at the end of the URL (a.k.a the <i>querystring</i>). You may learn the term ID for a given term by hovering over that term in the %taxo-overview page and noting the number at the end or the URL.  To build a Taxonomy URL start with \"taxonomy/page\". Now add the querystring parameter, either <i>or</i>, which chooses nodes tagged with <b>any</b> of the given term IDs, or <i>and</i>, which chooses nodes tagged with <b>all</b> of the given Term IDs. Thus <i>or</i> is less specific than <i>and</i>. Finally add a comma seperated list of term IDs.</p>";
      $output .= "<h3>RSS feeds</h3><p>Every term, or collection of terms, provides an %userland-rss feed to which interested users may subscribe. The URL format for a sample RSS feed is %sample-rss. Built like a Taxonomy URL, %taxo-help it starts with \"node/feed\", then has the querystring parameter, and finally the Term IDs.</p>";
Dries's avatar
   
Dries committed
845
      $output = t($output, array("%classification-types" => "<a href=\"http://www.eleganthack.com/archives/002165.html#002165\">classification types</a>", "%drupal-dis" => "<a href=\"http://www.drupal.org/node/view/55\">drupal.org discussion</a>", "%slashdot" => "<a href=\"http://www.slashdot.com/\">Slashdot</a>", "%taxo-example" => l("taxonomy/page/or/1,2", "taxonomy/page/or/1,2"), "%taxo-overview" => l(t("taxonomy overview"), "admin/taxonomy"), "%userland-rss" => "<a href=\"http://backend.userland.com/stories/rss\">RSS</a>", "%sample-rss" => l("node/feed/or/1,2", "node/feed/or/1,2"), "%taxo-help" => l(t("see above"), "admin/taxonomy/help#yaxonomyURL") ));
Dries's avatar
   
Dries committed
846
847
      break;
  }
Dries's avatar
   
Dries committed
848
849

  return $output;
Kjartan's avatar
Kjartan committed
850
}
Dries's avatar
   
Dries committed
851
?>