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

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

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

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

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

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

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

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

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

Dries's avatar
   
Dries committed
71
72
73
  $form .= form_textfield(t("Vocabulary name"), "name", $edit["name"], 50, 64, t("Required") .". ". t("The name for this vocabulary.  Example: 'Topic'") .".");
  $form .= form_textarea(t("Description"), "description", $edit["description"], 60, 5, t("Optional") .". ". t("Description of the vocabulary, can be used by modules."));
  $form .= form_select(t("Types"), "nodes", explode(",", $edit["nodes"]), $nodetypes, t("Required") .". ". t("A list of node types you want to associate this vocabulary with."), "", 1);
Dries's avatar
   
Dries committed
74
75
  $form .= form_checkbox(t("Related terms"), "relations", 1, $edit["relations"], t("Optional") .". ". t("Allows <a href=\"%help-url\">related terms</a> in this vocabulary.", array("%help-url" => url("admin/taxonomy/help", NULL, NULL, "related-terms"))));
  $form .= form_radios(t("Hierarchy"), "hierarchy", $edit["hierarchy"], array(t("Disabled"), t("Single"), t("Multiple")), t("Optional") .". ". t("Allows <a href=\"%help-url\">a tree-like hierarchy</a> between terms of this vocabulary.", array("%help-url" => url("admin/taxonomy/help", NULL, NULL, "hierarchy"))), "", 0);
Dries's avatar
   
Dries committed
76
  $form .= form_checkbox(t("Multiple select"), "multiple", 1, $edit["multiple"], t("Optional") .". ". t("Allows nodes to have more than one term in this vocabulary."));
77
  $form .= form_checkbox(t("Required"), "required", 1, $edit["required"], t("If enabled every node <strong>must</strong> have at least one term in this vocabulary"));
Dries's avatar
   
Dries committed
78
  $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
79
  $form .= form_submit(t("Submit"));
Dries's avatar
   
Dries committed
80

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

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

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

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

  cache_clear_all();
Dries's avatar
   
Dries committed
111

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

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

Dries's avatar
   
Dries committed
119
120
  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
121
122
  while ($term = db_fetch_object($result)) {
    taxonomy_del_term($term->tid);
Dries's avatar
   
Dries committed
123
  }
Dries's avatar
   
Dries committed
124

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

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

Dries's avatar
   
Dries committed
129
130
131
132
133
134
135
136
137
138
139
140
141
  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
142
}
Dries's avatar
   
Dries committed
143

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

Dries's avatar
   
Dries committed
148
149
  $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
150

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

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

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

169
  if ($vocabulary->relations) {
Dries's avatar
   
Dries committed
170
    $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"]));
171
172
  }

Dries's avatar
   
Dries committed
173
  $form .= form_textarea(t("Synonyms"), "synonyms", implode("\n", taxonomy_get_synonyms($edit["tid"])), 30, 5, t("Optional") . ". ". t("<a href=\"%help-url\">Synonyms</a> of this term, one synonym per line.", array("%help-url" => url("admin/taxonomy/help", NULL, NULL, "synonyms"))));
Dries's avatar
   
Dries committed
174
  $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
175
  $form .= form_hidden("vid", $vocabulary->vid);
Dries's avatar
   
Dries committed
176
  $form .= form_submit(t("Submit"));
Kjartan's avatar
Kjartan committed
177
178

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

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

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

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

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

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

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

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

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

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

Dries's avatar
   
Dries committed
247
248
249
250
251
  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
252

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

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

Dries's avatar
   
Dries committed
257
258
259
260
261
262
263
264
265
266
267
268
269
  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
270
}
Dries's avatar
   
Dries committed
271

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

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

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

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

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

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

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

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

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

314
315
316
  $description = $descriptions[$multiple] . $error['taxonomy'];

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

/*
** API functions
*/

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

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

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

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

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

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

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

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

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

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

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

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

Kjartan's avatar
Kjartan committed
407
408
409
// relations: return array of related terms
function taxonomy_get_related($tid, $key = "tid") {
  if ($tid) {
Dries's avatar
   
Dries committed
410
    $result = db_query("SELECT t.*, tid1, tid2 FROM {term_relation} , {term_data} t WHERE (t.tid = tid1 OR t.tid = tid2) AND (tid1 = %d OR tid2 = %d) AND t.tid != %d ORDER BY weight, name", $tid, $tid, $tid);
Kjartan's avatar
Kjartan committed
411
412
413
    $related = array();
    while ($term = db_fetch_object($result)) {
      $related[$term->$key] = $term;
Dries's avatar
   
Dries committed
414
    }
Kjartan's avatar
Kjartan committed
415
    return $related;
Dries's avatar
   
Dries committed
416
  }
Kjartan's avatar
Kjartan committed
417
418
  else {
    return array();
Dries's avatar
   
Dries committed
419
  }
Kjartan's avatar
Kjartan committed
420
}
Dries's avatar
   
Dries committed
421

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

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

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

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

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

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

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

Dries's avatar
   
Dries committed
484
485
486
487
488
489
  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
490

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

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

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

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

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

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

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

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

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

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

  return $result;
}

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

  return $result;
}

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

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

/*
** service functions
*/

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

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

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

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

Kjartan's avatar
Kjartan committed
630
  if (count($options) > 0) {
Dries's avatar
   
Dries committed
631
    foreach ($options as $option) {
Dries's avatar
   
Dries committed
632
      $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
633
    }
Dries's avatar
   
Dries committed
634

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

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

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

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

Kjartan's avatar
Kjartan committed
656
657
658
659
660
661
662
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
663
    }
Kjartan's avatar
Kjartan committed
664
    $result = implode(", ", $q);
Dries's avatar
   
Dries committed
665
  }
Kjartan's avatar
Kjartan committed
666
667
  return "($result)";
}
Dries's avatar
   
Dries committed
668

Dries's avatar
   
Dries committed
669
670
671
672
673
674
675
676
/*
** 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;

677
678
  if ($taxonomy->str_tids) {
    if ($taxonomy->operator == "or") {
Dries's avatar
   
Dries committed
679
680
      $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'";
681
682
    }
    else {
Dries's avatar
   
Dries committed
683
      $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
684

685
      // Special trick as we could not find anything better:
Dries's avatar
   
Dries committed
686
      $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)));
687
688
      $sql_count = "SELECT $count";
    }
Dries's avatar
   
Dries committed
689

690
691
692
693
694
695
    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
696
697
698
699
700
701
702
703
704
705
706
707
  }

  return $result;
}

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

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

Dries's avatar
   
Dries committed
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
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
729
function taxonomy_page() {
Dries's avatar
   
Dries committed
730

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

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

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

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

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

Kjartan's avatar
Kjartan committed
770
/*
Dries's avatar
   
Dries committed
771
772
773
** admin
*/

Kjartan's avatar
Kjartan committed
774
function taxonomy_admin() {
Dries's avatar
   
Dries committed
775
776
  $op = $_POST["op"];
  $edit = $_POST["edit"];
Kjartan's avatar
Kjartan committed
777

Dries's avatar
   
Dries committed
778
779
780
  if (empty($op)) {
    $op = arg(2);
  }
Dries's avatar
   
Dries committed
781

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

Dries's avatar
   
Dries committed
837
  print theme("page", $output);
Kjartan's avatar
Kjartan committed
838
839
}

Dries's avatar
   
Dries committed
840
function taxonomy_help($section = "admin/help#taxonomy") {
Dries's avatar
   
Dries committed
841
  $output = "";
Dries's avatar
   
Dries committed
842

Dries's avatar
   
Dries committed
843
  switch ($section) {
Dries's avatar
   
Dries committed
844
    case 'admin/system/modules#description':
Dries's avatar
   
Dries committed
845
      $output = t("Enables the organization of content into categories.");
Dries's avatar
   
Dries committed
846
      break;
Dries's avatar
   
Dries committed
847
    case 'admin/taxonomy':
Dries's avatar
   
Dries committed
848
      $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
849
      break;
Dries's avatar
   
Dries committed
850
    case 'admin/taxonomy/add/vocabulary':
Dries's avatar
   
Dries committed
851
      $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
852
      break;
Dries's avatar
   
Dries committed
853