From ce4993d29ca0963c51197bee5a3335fd3630091d Mon Sep 17 00:00:00 2001 From: Kjartan Mannes Date: Thu, 2 May 2002 21:41:29 +0000 Subject: - fixed indentation. - added $Id$ --- modules/taxonomy.module | 1157 ++++++++++++++++++++++++----------------------- 1 file changed, 579 insertions(+), 578 deletions(-) (limited to 'modules/taxonomy.module') diff --git a/modules/taxonomy.module b/modules/taxonomy.module index 1d2fc4660..36d334791 100644 --- a/modules/taxonomy.module +++ b/modules/taxonomy.module @@ -1,719 +1,720 @@ name; - $channel["link"] = path_uri() ."index.php?or=$or"; - $channel["description"] = $term->description; + $channel["title"] = variable_get("site_name", "drupal") ." - ". $term->name; + $channel["link"] = path_uri() ."index.php?or=$or"; + $channel["description"] = $term->description; - node_feed($result, $channel); - } + node_feed($result, $channel); } +} - function taxonomy_perm() { - return array("administer taxonomy"); - } +function taxonomy_perm() { + return array("administer taxonomy"); +} - function taxonomy_link($type) { - if ($type == "admin" && user_access("administer taxonomy")) { - $links[] = la(t("taxonomy"), array("mod" => "taxonomy")); - } - - return $links ? $links : array(); +function taxonomy_link($type) { + if ($type == "admin" && user_access("administer taxonomy")) { + $links[] = la(t("taxonomy"), array("mod" => "taxonomy")); } + return $links ? $links : array(); +} + /* ** admin pages (form, save, overview) */ - function taxonomy_form_vocabulary($edit = array()) { - foreach (module_list() as $name) { - if (module_hook($name, "node")) { - $nodetypes[$name] = $name; - } +function taxonomy_form_vocabulary($edit = array()) { + foreach (module_list() as $name) { + if (module_hook($name, "node")) { + $nodetypes[$name] = $name; } + } - $form .= form_textfield("Vocabulary name", "name", $edit["name"], 50, 64, "Required. The name for this vocabulary. Example: 'Topic'."); - $form .= form_textarea("Description", "description", $edit["description"], 60, 5, "Optional. Description of the vocabulary, can be used by modules."); - $form .= form_select("Types", "types", explode(",", $edit["types"]), $nodetypes, "Required. A list of node types you want to associate this vocabulary with.", "", 1); - $form .= form_checkbox("Related terms", "relations", 1, $edit["relations"], "Optional. Allows ". la("related terms", array("mod" => "taxonomy", "op" => "help#relatedterms")) ." in this vocabulary."); - $form .= form_select("Hierarchy", "hierarchy", $edit["hierarchy"], array("Disabled", "Single", "Multiple"), "Optional. Allows ". la("a tree-like hierarchy", array("mod" => "taxonomy", "op" => "help#hierarchy")) ." between terms of this vocabulary.", "", 0); - $form .= form_checkbox("Multiple select", "multiple", 1, $edit["multiple"], "Optional. Allows nodes to have more than one term in this vocabulary."); - $form .= form_checkbox("Required", "required", 1, $edit["required"], "If enabled every node must have at least one term in this vocabulary"); - $form .= form_textfield("Weight", "weight", $edit["weight"], 3, 3, "Optional. In listings, the heavier vocabularies will sink and the lighter vocabularies will be positioned nearer the top."); - $form .= form_submit("Submit"); - - if ($edit["vid"]) { - $form .= form_submit("Delete"); - $form .= form_hidden("vid", $edit["vid"]); - } + $form .= form_textfield("Vocabulary name", "name", $edit["name"], 50, 64, "Required. The name for this vocabulary. Example: 'Topic'."); + $form .= form_textarea("Description", "description", $edit["description"], 60, 5, "Optional. Description of the vocabulary, can be used by modules."); + $form .= form_select("Types", "types", explode(",", $edit["types"]), $nodetypes, "Required. A list of node types you want to associate this vocabulary with.", "", 1); + $form .= form_checkbox("Related terms", "relations", 1, $edit["relations"], "Optional. Allows ". la("related terms", array("mod" => "taxonomy", "op" => "help#relatedterms")) ." in this vocabulary."); + $form .= form_select("Hierarchy", "hierarchy", $edit["hierarchy"], array("Disabled", "Single", "Multiple"), "Optional. Allows ". la("a tree-like hierarchy", array("mod" => "taxonomy", "op" => "help#hierarchy")) ." between terms of this vocabulary.", "", 0); + $form .= form_checkbox("Multiple select", "multiple", 1, $edit["multiple"], "Optional. Allows nodes to have more than one term in this vocabulary."); + $form .= form_checkbox("Required", "required", 1, $edit["required"], "If enabled every node must have at least one term in this vocabulary"); + $form .= form_textfield("Weight", "weight", $edit["weight"], 3, 3, "Optional. In listings, the heavier vocabularies will sink and the lighter vocabularies will be positioned nearer the top."); + $form .= form_submit("Submit"); - return form($form); + if ($edit["vid"]) { + $form .= form_submit("Delete"); + $form .= form_hidden("vid", $edit["vid"]); } - function taxonomy_save_vocabulary($edit) { - $data = array("name" => $edit["name"], "types" => implode(",", $edit["types"]), "description" => $edit["description"], "multiple" => $edit["multiple"], "required" => $edit["required"], "hierarchy" => $edit["hierarchy"], "relations" => $edit["relations"], "weight" => $edit["weight"]); + return form($form); +} - if ($edit["vid"] && $edit["name"]) { - db_query("UPDATE vocabulary SET ". _prepare_update($data) ." WHERE vid = '". check_input($edit["vid"]) ."'"); - } - else if ($edit["vid"]) { - taxonomy_del_vocabulary($edit["vid"]); - } - else { - db_query("INSERT INTO vocabulary ". _prepare_insert($data, 1) ." VALUES ". _prepare_insert($data, 2)); - } +function taxonomy_save_vocabulary($edit) { + $data = array("name" => $edit["name"], "types" => @implode(",", $edit["types"]), "description" => $edit["description"], "multiple" => $edit["multiple"], "required" => $edit["required"], "hierarchy" => $edit["hierarchy"], "relations" => $edit["relations"], "weight" => $edit["weight"]); + + if ($edit["vid"] && $edit["name"]) { + db_query("UPDATE vocabulary SET ". _prepare_update($data) ." WHERE vid = '". check_input($edit["vid"]) ."'"); } + else if ($edit["vid"]) { + taxonomy_del_vocabulary($edit["vid"]); + } + else { + db_query("INSERT INTO vocabulary ". _prepare_insert($data, 1) ." VALUES ". _prepare_insert($data, 2)); + } +} - function taxonomy_del_vocabulary($vid) { - db_query("DELETE FROM vocabulary WHERE vid = '%s'", $vid); - $result = db_query("SELECT tid FROM term_data WHERE vid = '%s'", $vid); - while ($term = db_fetch_object($result)) { - taxonomy_del_term($term->tid); - } +function taxonomy_del_vocabulary($vid) { + db_query("DELETE FROM vocabulary WHERE vid = '%s'", $vid); + $result = db_query("SELECT tid FROM term_data WHERE vid = '%s'", $vid); + while ($term = db_fetch_object($result)) { + taxonomy_del_term($term->tid); } +} - function taxonomy_form_term($edit = array()) { - global $vocabulary_id; - if (!$vocabulary_id) { - $vocabulary_id = $edit["vid"]; - } - $vocabulary = taxonomy_get_vocabulary($vocabulary_id); - $form .= form_textfield("Term name", "name", $edit["name"], 50, 64, "Required. The name for this term. Example: 'Linux'."); - $form .= form_textarea("Description", "description", $edit["description"], 60, 5, "Optional. Description of the term, can be used by modules."); +function taxonomy_form_term($edit = array()) { + global $vocabulary_id; + if (!$vocabulary_id) { + $vocabulary_id = $edit["vid"]; + } + $vocabulary = taxonomy_get_vocabulary($vocabulary_id); + $form = form_textfield("Term name", "name", $edit["name"], 50, 64, "Required. The name for this term. Example: 'Linux'."); + $form .= form_textarea("Description", "description", $edit["description"], 60, 5, "Optional. Description of the term, can be used by modules."); - if ($vocabulary->relations) { - $form .= _taxonomy_term_select("Related terms", "relations", array_keys(taxonomy_get_related($edit["tid"])), $vocabulary_id, "Optional.", 1, "", array($edit["tid"])); - } + if ($vocabulary->relations) { + $form .= _taxonomy_term_select("Related terms", "relations", array_keys(taxonomy_get_related($edit["tid"])), $vocabulary_id, "Optional.", 1, "", array($edit["tid"])); + } - if ($vocabulary->hierarchy) { - $parent = array_keys(taxonomy_get_parents($edit["tid"])); - taxonomy_get_tree($vocabulary_id, $children, $edit["tid"]); - // you can't be son of yourself or your children - $exclude = array_keys($children); - $exclude[] = $edit["tid"]; - if ($vocabulary->hierarchy == 1) { - $form .= _taxonomy_term_select("Parent", "parent", $parent, $vocabulary_id, "Required. ". la("Parent term", array("mod" => "taxonomy", "op" => "help#parent")) .".", 0, "", $exclude); - } - elseif ($vocabulary->hierarchy == 2) { - $form .= _taxonomy_term_select("Parents", "parent", $parent, $vocabulary_id, "Required. ". la("Parent terms", array("mod" => "taxonomy", "op" => "help#parent")) .".", 1, "", $exclude); - } + if ($vocabulary->hierarchy) { + $parent = array_keys(taxonomy_get_parents($edit["tid"])); + taxonomy_get_tree($vocabulary_id, $children, $edit["tid"]); + // you can't be son of yourself or your children + $exclude = array_keys($children); + $exclude[] = $edit["tid"]; + if ($vocabulary->hierarchy == 1) { + $form .= _taxonomy_term_select("Parent", "parent", $parent, $vocabulary_id, "Required. ". la("Parent term", array("mod" => "taxonomy", "op" => "help#parent")) .".", 0, "", $exclude); } - - $form .= form_textarea("Synonyms", "synonyms", implode("\n", taxonomy_get_synonyms($edit["tid"])), 30, 5, "Optional. ". la("Synonyms", array("mod" => "taxonomy", "op" => "help#synonyms")) ." of this term, one synonym per line."); - $form .= form_textfield("Weight", "weight", $edit["weight"], 3, 3, "Optional. In listings, the heavier terms will sink and the lighter terms will be positioned nearer the top."); - $form .= form_hidden("vid", $vocabulary->vid); - $form .= form_submit("Submit"); - - if ($edit["tid"]) { - $form .= form_submit("Delete"); - $form .= form_hidden("tid", $edit["tid"]); + elseif ($vocabulary->hierarchy == 2) { + $form .= _taxonomy_term_select("Parents", "parent", $parent, $vocabulary_id, "Required. ". la("Parent terms", array("mod" => "taxonomy", "op" => "help#parent")) .".", 1, "", $exclude); } + } - return form($form); + $form .= form_textarea("Synonyms", "synonyms", implode("\n", taxonomy_get_synonyms($edit["tid"])), 30, 5, "Optional. ". la("Synonyms", array("mod" => "taxonomy", "op" => "help#synonyms")) ." of this term, one synonym per line."); + $form .= form_textfield("Weight", "weight", $edit["weight"], 3, 3, "Optional. In listings, the heavier terms will sink and the lighter terms will be positioned nearer the top."); + $form .= form_hidden("vid", $vocabulary->vid); + $form .= form_submit("Submit"); + + if ($edit["tid"]) { + $form .= form_submit("Delete"); + $form .= form_hidden("tid", $edit["tid"]); } - function taxonomy_save_term($edit) { - if ($edit["tid"] && $edit["name"]) { - $data = array("name" => $edit["name"], "description" => $edit["description"], "weight" => $edit["weight"]); + return form($form); +} - db_query("UPDATE term_data SET ". _prepare_update($data) ." WHERE tid = '%s'", $edit["tid"]); - } - else if ($edit["tid"]) { - taxonomy_del_term($edit["tid"]); - } - else { - $edit["tid"] = db_result(db_query("SELECT MAX(tid) + 1 FROM term_data")); - if (!$edit["tid"]) { - // first term - $edit["tid"] = 1; - } - $data = array("tid" => $edit["tid"], "name" => $edit["name"], "description" => $edit["description"], "vid" => $edit["vid"], "weight" => $edit["weight"]); - db_query("INSERT INTO term_data ". _prepare_insert($data, 1) ." VALUES ". _prepare_insert($data, 2)); - } +function taxonomy_save_term($edit) { + if ($edit["tid"] && $edit["name"]) { + $data = array("name" => $edit["name"], "description" => $edit["description"], "weight" => $edit["weight"]); - // relations (seem very powerful, but I have to understand it completely) - db_query("DELETE FROM term_relation WHERE tid1 = '%s' OR tid2 = '%s'", $edit["tid"], $edit["tid"]); - if ($edit["relations"]) { - foreach ($edit["relations"] as $related_id) { - if ($related_id != 0) { - $rel_q[] = "('". check_query($edit["tid"]) ."', '". check_query($related_id) ."')"; - } - } - if ($rel_q) { - $related_query = implode(", ", $rel_q); - db_query("INSERT INTO term_relation (tid1, tid2) VALUES $related_query"); - } + db_query("UPDATE term_data SET ". _prepare_update($data) ." WHERE tid = '%s'", $edit["tid"]); + } + else if ($edit["tid"]) { + taxonomy_del_term($edit["tid"]); + } + else { + $edit["tid"] = db_result(db_query("SELECT MAX(tid) + 1 FROM term_data")); + if (!$edit["tid"]) { + // first term + $edit["tid"] = 1; } + $data = array("tid" => $edit["tid"], "name" => $edit["name"], "description" => $edit["description"], "vid" => $edit["vid"], "weight" => $edit["weight"]); + db_query("INSERT INTO term_data ". _prepare_insert($data, 1) ." VALUES ". _prepare_insert($data, 2)); + } - // hierarchy - db_query("DELETE FROM term_hierarchy WHERE tid = '%s'", $edit["tid"]); - if (!isset($edit["parent"])) { - $edit["parent"] = 0; - } - if (is_array($edit["parent"])) { - foreach ($edit["parent"] as $parent) { - $sql[] = "('". check_query($edit["tid"]) ."', '". check_query($parent) ."')"; + // relations (seem very powerful, but I have to understand it completely) + db_query("DELETE FROM term_relation WHERE tid1 = '%s' OR tid2 = '%s'", $edit["tid"], $edit["tid"]); + if ($edit["relations"]) { + foreach ($edit["relations"] as $related_id) { + if ($related_id != 0) { + $rel_q[] = "('". check_query($edit["tid"]) ."', '". check_query($related_id) ."')"; } - db_query("INSERT INTO term_hierarchy (tid, parent) VALUES ". implode(", ", $sql)); } - else { - db_query("INSERT INTO term_hierarchy (tid, parent) VALUES ('%s', '%s')", $edit["tid"], $edit["parent"][0]); + if ($rel_q) { + $related_query = implode(", ", $rel_q); + db_query("INSERT INTO term_relation (tid1, tid2) VALUES $related_query"); } + } - // synonyms (very cool idea indeed) - db_query("DELETE FROM term_synonym WHERE tid = '%s'", $edit["tid"]); - if ($edit["synonyms"]) { - foreach (explode ("\n", $edit["synonyms"]) as $synonym) { - $syn_q[] = "('". check_query($edit["tid"]) ."', '". check_query(chop($synonym)) ."')"; - } - $synonyms_query = implode(", ", $syn_q); - db_query("INSERT INTO term_synonym (tid, name) VALUES $synonyms_query"); + // hierarchy + db_query("DELETE FROM term_hierarchy WHERE tid = '%s'", $edit["tid"]); + if (!isset($edit["parent"])) { + $edit["parent"] = 0; + } + if (is_array($edit["parent"])) { + foreach ($edit["parent"] as $parent) { + $sql[] = "('". check_query($edit["tid"]) ."', '". check_query($parent) ."')"; } + db_query("INSERT INTO term_hierarchy (tid, parent) VALUES ". implode(", ", $sql)); + } + else { + db_query("INSERT INTO term_hierarchy (tid, parent) VALUES ('%s', '%s')", $edit["tid"], $edit["parent"][0]); } - function taxonomy_del_term($tid) { - db_query("DELETE FROM term_data WHERE tid = '%s'", $tid); - db_query("DELETE FROM term_hierarchy WHERE tid = '%s'", $tid); - db_query("DELETE FROM term_relation WHERE tid1 = '%s' OR tid2 = '%s'", $tid, $tid); - db_query("DELETE FROM term_synonym WHERE tid = '%s'", $tid); - db_query("DELETE FROM term_node WHERE tid = '%s'", $tid); + // synonyms (very cool idea indeed) + db_query("DELETE FROM term_synonym WHERE tid = '%s'", $edit["tid"]); + if ($edit["synonyms"]) { + foreach (explode ("\n", $edit["synonyms"]) as $synonym) { + $syn_q[] = "('". check_query($edit["tid"]) ."', '". check_query(chop($synonym)) ."')"; + } + $synonyms_query = implode(", ", $syn_q); + db_query("INSERT INTO term_synonym (tid, name) VALUES $synonyms_query"); } +} - function taxonomy_overview() { - global $tree; +function taxonomy_del_term($tid) { + db_query("DELETE FROM term_data WHERE tid = '%s'", $tid); + db_query("DELETE FROM term_hierarchy WHERE tid = '%s'", $tid); + db_query("DELETE FROM term_relation WHERE tid1 = '%s' OR tid2 = '%s'", $tid, $tid); + db_query("DELETE FROM term_synonym WHERE tid = '%s'", $tid); + db_query("DELETE FROM term_node WHERE tid = '%s'", $tid); +} - $output .= "

vocabularies overview

"; - $output .= "\n"; - $output .= " \n"; +function taxonomy_overview() { + global $tree; - $vocabularies = taxonomy_get_vocabularies(); - foreach ($vocabularies as $vocabulary) { - $links = array(); - $links[] = la(t("edit vocabulary"), array("mod" => "taxonomy", "type" => "vocabulary", "op" => "edit", "id" => $vocabulary->vid)); - $links[] = la(t("add term"), array("mod" => "taxonomy", "op" => "add", "type" => "leaf", "vocabulary_id" => $vocabulary->vid)); - $links[] = la(t("preview form"), array("mod" => "taxonomy", "type" => "vocabulary", "op" => "preview", "id" => $vocabulary->vid)); + $output .= "

vocabularies overview

"; + $output .= "
namenode typesoperations
\n"; + $output .= " \n"; - $output .= " \n"; + $vocabularies = taxonomy_get_vocabularies(); + foreach ($vocabularies as $vocabulary) { + $links = array(); + $links[] = la(t("edit vocabulary"), array("mod" => "taxonomy", "type" => "vocabulary", "op" => "edit", "id" => $vocabulary->vid)); + $links[] = la(t("add term"), array("mod" => "taxonomy", "op" => "add", "type" => "leaf", "vocabulary_id" => $vocabulary->vid)); + $links[] = la(t("preview form"), array("mod" => "taxonomy", "type" => "vocabulary", "op" => "preview", "id" => $vocabulary->vid)); - unset($tree); - taxonomy_get_tree($vocabulary->vid, $tree); - if ($tree) { - $output .= "\n"; + $output .= " \n"; + + unset($tree); + taxonomy_get_tree($vocabulary->vid, $tree); + if ($tree) { + $output .= "\n"; } - $output .= "
namenode typesoperations
". check_output($vocabulary->name) ."". check_output($vocabulary->types) ."". implode(" | ", $links) ."
"; - } - $output .= "
"; - foreach ($tree as $term) { - $output .= "
". la(_taxonomy_depth($term->depth).check_output($term->name), array("mod" => "taxonomy", "op" => "edit", "type" => "term", "id" => check_output($term->tid))) ."
". check_output($vocabulary->name) ."". check_output($vocabulary->types) ."". implode(" | ", $links) ."
"; } + $output .= "
"; + foreach ($tree as $term) { + $output .= "
". la(_taxonomy_depth($term->depth) . check_output($term->name), array("mod" => "taxonomy", "op" => "edit", "type" => "term", "id" => check_output($term->tid))) ."
\n"; - - return $output; } + $output .= "\n"; - function taxonomy_form($vocabulary_id, $value = 0) { - $vocabulary = taxonomy_get_vocabulary($vocabulary_id); - if ($vocabulary->required) { - $verb = "must"; - $blank = 0; - } - else { - $verb = "can"; - $blank = ""; - } - if ($vocabulary->multiple) { - $description = "You $verb choose one or more terms for this node"; - $multiple = 1; - } - else { - $description = "You $verb choose one term for this node"; - $multiple = 0; - } - return _taxonomy_term_select($vocabulary->name, "taxonomy", $value, $vocabulary_id, $description, $multiple, $blank); + return $output; +} + +function taxonomy_form($vocabulary_id, $value = 0) { + $vocabulary = taxonomy_get_vocabulary($vocabulary_id); + if ($vocabulary->required) { + $verb = "must"; + $blank = 0; + } + else { + $verb = "can"; + $blank = ""; + } + if ($vocabulary->multiple) { + $description = "You $verb choose one or more terms for this node"; + $multiple = 1; } + else { + $description = "You $verb choose one term for this node"; + $multiple = 0; + } + return _taxonomy_term_select($vocabulary->name, "taxonomy", $value, $vocabulary_id, $description, $multiple, $blank); +} /* ** API functions */ - // return array of vocabularies, as objects - function taxonomy_get_vocabularies($type = '', $key = "vid") { - if ($type) { - $result = db_query("SELECT * FROM vocabulary WHERE types LIKE '%%%s%%' ORDER BY weight, name", $type); - } - else { - $result = db_query("SELECT * FROM vocabulary ORDER BY weight, name"); - } - $vocabularies = array(); - while ($voc = db_fetch_object($result)) { - $vocabularies[$voc->$key] = $voc; - } - return $vocabularies; +// return array of vocabularies, as objects +function taxonomy_get_vocabularies($type = '', $key = "vid") { + if ($type) { + $result = db_query("SELECT * FROM vocabulary WHERE types LIKE '%%%s%%' ORDER BY weight, name", $type); + } + else { + $result = db_query("SELECT * FROM vocabulary ORDER BY weight, name"); + } + $vocabularies = array(); + while ($voc = db_fetch_object($result)) { + $vocabularies[$voc->$key] = $voc; } + return $vocabularies; +} - // 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)); - } - else { - $terms = 0; - } +// 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)); } else { - $terms = $node->taxonomy; + $terms = 0; } + } + else { + $terms = $node->taxonomy; + } - $c = db_query("SELECT * FROM vocabulary WHERE types LIKE '%%%s%%' ORDER BY weight, name", $type); - while ($vocabulary = db_fetch_object($c)) { - $result[] .= taxonomy_form($vocabulary->vid, $terms); - } - return $result ? $result : array(); + $c = db_query("SELECT * FROM vocabulary WHERE types LIKE '%%%s%%' ORDER BY weight, name", $type); + while ($vocabulary = db_fetch_object($c)) { + $result[] .= taxonomy_form($vocabulary->vid, $terms); } + return $result ? $result : array(); +} - // 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) { - $term_name = db_result(db_query("SELECT name FROM term_data WHERE tid = '%s'", $tid)); +// 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) { + $term_name = db_result(db_query("SELECT name FROM term_data WHERE tid = '%s'", $tid)); - return db_result(db_query("SELECT COUNT(n.nid) FROM node n WHERE n.nid = '%s' AND ((n.body LIKE '%%%s%%') OR (n.body LIKE '%%%s%%'))", $nid, $term_name, $term_name)); + return db_result(db_query("SELECT COUNT(n.nid) FROM node n WHERE n.nid = '%s' AND ((n.body LIKE '%%%s%%') OR (n.body LIKE '%%%s%%'))", $nid, $term_name, $term_name)); +} + +// 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") { + $result = db_query("SELECT t.* FROM term_data t, term_node r WHERE t.tid = r.tid AND t.vid = '%s' AND r.nid = '%s' ORDER BY weight", $vid, $nid); + $terms = array(); + while ($term = db_fetch_object($result)) { + $terms[$term->$key] = $term; } + return $terms; +} + +// return array of terms of a node +function taxonomy_node_get_terms($nid, $key = "tid") { + static $terms; - // 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") { - $result = db_query("SELECT t.* FROM term_data t, term_node r WHERE t.tid = r.tid AND t.vid = '%s' AND r.nid = '%s' ORDER BY weight", $vid, $nid); - $terms = array(); + if (!$terms[$nid]) { + $result = db_query("SELECT t.* FROM term_data t, term_node r WHERE r.tid = t.tid AND r.nid = '%s' ORDER BY weight", $nid); + $terms[$nid] = array(); while ($term = db_fetch_object($result)) { - $terms[$term->$key] = $term; + $terms[$nid][$term->$key] = $term; } - return $terms; } + return $terms[$nid]; +} - // return array of terms of a node - function taxonomy_node_get_terms($nid, $key = "tid") { - static $terms; +// save terms of a node +function taxonomy_node_save($nid, $terms) { + taxonomy_node_delete($nid); - if (!$terms[$nid]) { - $result = db_query("SELECT t.* FROM term_data t, term_node r WHERE r.tid = t.tid AND r.nid = '%s' ORDER BY weight", $nid); - $terms[$nid] = array(); - while ($term = db_fetch_object($result)) { - $terms[$nid][$term->$key] = $term; - } + if ($terms) { + foreach ($terms as $t) { + $query[] = "('". check_query($nid) ."', '". check_query($t) ."')"; } - return $terms[$nid]; + db_query("INSERT INTO term_node (nid, tid) VALUES ". implode(", ", $query)); } +} - // save terms of a node - function taxonomy_node_save($nid, $terms) { - taxonomy_node_delete($nid); +// clean up terms +function taxonomy_node_delete($nid) { + db_query("DELETE FROM term_node WHERE nid = '%s'", $nid); +} - if ($terms) { - foreach ($terms as $t) { - $query[] = "('". check_query($nid) ."', '". check_query($t) ."')"; - } - db_query("INSERT INTO term_node (nid, tid) VALUES ". implode(", ", $query)); +// relations: return array of related terms +function taxonomy_get_related($tid, $key = "tid") { + if ($tid) { + $result = db_query("SELECT t.*, tid1, tid2 FROM term_relation, term_data t WHERE (t.tid = tid1 OR t.tid = tid2) AND (tid1 = '%s' OR tid2 = '%s') ORDER BY weight", $tid, $tid); + $related = array(); + while ($term = db_fetch_object($result)) { + $related[$term->$key] = $term; } + return $related; } - - // clean up terms - function taxonomy_node_delete($nid) { - db_query("DELETE FROM term_node WHERE nid = '%s'", $nid); + else { + return array(); } +} - // relations: return array of related terms - function taxonomy_get_related($tid, $key = "tid") { - if ($tid) { - $result = db_query("SELECT t.*, tid1, tid2 FROM term_relation, term_data t WHERE (t.tid = tid1 OR t.tid = tid2) AND (tid1 = '%s' OR tid2 = '%s') ORDER BY weight", $tid, $tid); - $related = array(); - while ($term = db_fetch_object($result)) { - $related[$term->$key] = $term; - } - return $related; - } - else { - return array(); +// hierarchy: get parent terms +function taxonomy_get_parents($tid, $key = "tid") { + if ($tid) { + $result = db_query("SELECT t.* FROM term_hierarchy h, term_data t WHERE h.parent = t.tid AND h.tid = '%s' ORDER BY weight, name", $tid); + $parents = array(); + while ($parent = db_fetch_object($result)) { + $parents[$parent->$key] = $parent; } + return $parents; } + else { + return array(); + } +} - // hierarchy: get parent terms - function taxonomy_get_parents($tid, $key = "tid") { - if ($tid) { - $result = db_query("SELECT t.* FROM term_hierarchy h, term_data t WHERE h.parent = t.tid AND h.tid = '%s' ORDER BY weight, name", $tid); - $parents = array(); - while ($parent = db_fetch_object($result)) { - $parents[$parent->$key] = $parent; - } - return $parents; - } - else { - return array(); - } +// hierarchy: get children +function taxonomy_get_children($tid, $vid = 0, $key = "tid") { + if ($vid) { + $result = db_query("SELECT t.* FROM term_hierarchy h, term_data t WHERE t.vid = '%s' AND h.tid = t.tid AND h.parent = '%s' ORDER BY weight, name", $vid, $tid); } + else { + $result = db_query("SELECT t.* FROM term_hierarchy h, term_data t WHERE h.tid = t.tid AND parent = '%s' ORDER BY weight", $tid); + } + $children = array(); + while ($term = db_fetch_object($result)) { + $children[$term->$key] = $term; + } + return $children; +} - // hierarchy: get children - function taxonomy_get_children($tid, $vid = 0, $key = "tid") { - if ($vid) { - $result = db_query("SELECT t.* FROM term_hierarchy h, term_data t WHERE t.vid = '%s' AND h.tid = t.tid AND h.parent = '%s' ORDER BY weight, name", $vid, $tid); - } - else { - $result = db_query("SELECT t.* FROM term_hierarchy h, term_data t WHERE h.tid = t.tid AND parent = '%s' ORDER BY weight", $tid); - } +// hierarchy: get whole family, with tid, parent and depth; useful to show +function taxonomy_get_tree($vocabulary_id, &$tree, $parent = 0, $depth = -1, $key = "tid") { + static $children, $terms; + if ($depth == -1) { $children = array(); - while ($term = db_fetch_object($result)) { - $children[$term->$key] = $term; - } - return $children; + $tree = array(); + // $terms = array(); // we should be able to safely do this } - - // hierarchy: get whole family, with tid, parent and depth; useful to show - function taxonomy_get_tree($vocabulary_id, &$tree, $parent = 0, $depth = -1, $key = "tid") { - static $children, $terms; - if ($depth == -1) { - $children = array(); - $tree = array(); - // $terms = array(); // we should be able to safely do this - } - $depth++; - if ($vocabulary_id) { - if (!$children) { - $result = db_query("SELECT t.*, parent FROM term_data t, term_hierarchy h WHERE t.tid = h.tid AND t.vid = '%s' ORDER BY weight, name", $vocabulary_id); - while ($term = db_fetch_object($result)) { - $children[$term->parent][] = $term->tid; - $terms[$term->tid] = $term; - } - } - if ($children[$parent]) { - foreach ($children[$parent] as $child) { - $terms[$child]->depth = $depth; - $tree[] = $terms[$child]; - taxonomy_get_tree($vocabulary_id, $tree, $child, $depth, $key); - } + $depth++; + if ($vocabulary_id) { + if (!$children) { + $result = db_query("SELECT t.*, parent FROM term_data t, term_hierarchy h WHERE t.tid = h.tid AND t.vid = '%s' ORDER BY weight, name", $vocabulary_id); + while ($term = db_fetch_object($result)) { + $children[$term->parent][] = $term->tid; + $terms[$term->tid] = $term; } } - else { - return 0; + if ($children[$parent]) { + foreach ($children[$parent] as $child) { + $terms[$child]->depth = $depth; + $tree[] = $terms[$child]; + taxonomy_get_tree($vocabulary_id, $tree, $child, $depth, $key); + } } } + else { + return 0; + } +} - // synonyms: return array of synonyms - function taxonomy_get_synonyms($tid) { - if ($tid) { - $result = db_query("SELECT name FROM term_synonym WHERE tid = '%s'", $tid); - while ($synonym = db_fetch_array($result)) { - $synonyms[] = $synonym["name"]; - } - return $synonyms ? $synonyms : array(); - } - else { - return array(); +// synonyms: return array of synonyms +function taxonomy_get_synonyms($tid) { + if ($tid) { + $result = db_query("SELECT name FROM term_synonym WHERE tid = '%s'", $tid); + while ($synonym = db_fetch_array($result)) { + $synonyms[] = $synonym["name"]; } + return $synonyms ? $synonyms : array(); } - - // synonyms: return original term - function taxonomy_get_synonym_root($term) { - return db_fetch_object(db_query("SELECT * FROM term_synonym s, term_data t WHERE t.tid = s.tid AND s.name = '%s'", $term)); + else { + return array(); } +} - // given a term id, count number of nodes in it - function taxonomy_term_count_nodes($tid) { - static $count; +// synonyms: return original term +function taxonomy_get_synonym_root($term) { + return db_fetch_object(db_query("SELECT * FROM term_synonym s, term_data t WHERE t.tid = s.tid AND s.name = '%s'", $term)); +} - if (!$count) { - $result = db_query("SELECT tid, COUNT(*) AS c FROM term_node GROUP BY tid"); - while ($term = db_fetch_object($result)) { - $count[$term->tid] = $term->c; - } - } +// given a term id, count number of nodes in it +function taxonomy_term_count_nodes($tid) { + static $count; - foreach (_taxonomy_term_children($tid) as $c) { - $children_count += taxonomy_term_count_nodes($c); + if (!$count) { + $result = db_query("SELECT tid, COUNT(*) AS c FROM term_node GROUP BY tid"); + while ($term = db_fetch_object($result)) { + $count[$term->tid] = $term->c; } - return $count[$tid] + $children_count; } - // helper for above function - function _taxonomy_term_children($tid) { - static $children; + foreach (_taxonomy_term_children($tid) as $c) { + $children_count += taxonomy_term_count_nodes($c); + } + return $count[$tid] + $children_count; +} + +// helper for above function +function _taxonomy_term_children($tid) { + static $children; - if (!$children) { - $result = db_query("SELECT tid, parent FROM term_hierarchy"); - while ($term = db_fetch_object($result)) { - $children[$term->parent][] = $term->tid; - } + if (!$children) { + $result = db_query("SELECT tid, parent FROM term_hierarchy"); + while ($term = db_fetch_object($result)) { + $children[$term->parent][] = $term->tid; } - return $children[$tid] ? $children[$tid] : array(); } + return $children[$tid] ? $children[$tid] : array(); +} - function taxonomy_get_vocabulary($vid) { - // simple cache using a static var? - return db_fetch_object(db_query("SELECT * FROM vocabulary WHERE vid = '%s'", $vid)); - } +function taxonomy_get_vocabulary($vid) { + // simple cache using a static var? + return db_fetch_object(db_query("SELECT * FROM vocabulary WHERE vid = '%s'", $vid)); +} - function taxonomy_get_term($tid) { - // simple cache using a static var? - return db_fetch_object(db_query("SELECT * FROM term_data WHERE tid = '%s'", $tid)); - } +function taxonomy_get_term($tid) { + // simple cache using a static var? + return db_fetch_object(db_query("SELECT * FROM term_data WHERE tid = '%s'", $tid)); +} /* ** service functions */ - function _taxonomy_term_select($title, $name, $value, $vocabulary_id, $description, $multiple, $blank, $exclude = array()) { - taxonomy_get_tree($vocabulary_id, $tree); +function _taxonomy_term_select($title, $name, $value, $vocabulary_id, $description, $multiple, $blank, $exclude = array()) { + taxonomy_get_tree($vocabulary_id, $tree); - if ($blank) { - $options[0] = $blank; - } + if ($blank) { + $options[0] = $blank; + } - if ($tree) { - foreach ($tree as $term) { - if (!in_array($term->tid, $exclude)) { - $options[$term->tid] = _taxonomy_depth($term->depth, '-').$term->name; - } - } - if (!$blank && !$value) { - // required but without a predefined value, so set first as predefined - $value = $tree[0]->tid; + if ($tree) { + foreach ($tree as $term) { + if (!in_array($term->tid, $exclude)) { + $options[$term->tid] = _taxonomy_depth($term->depth, '-').$term->name; } } + if (!$blank && !$value) { + // required but without a predefined value, so set first as predefined + $value = $tree[0]->tid; + } + } - if (count($options) > 0) { - foreach ($options as $key=>$choice) { - $select .= ""; - } + if (count($options) > 0) { + foreach ($options as $key=>$choice) { + $select .= ""; + } - // min 8, possibly options/3 (set max too?) - $size = max(8, round(count($options)) / 3); + // min 8, possibly options/3 (set max too?) + $size = max(8, round(count($options)) / 3); - return form_item($title, "", $description); - } + return form_item($title, "", $description); } +} - function _taxonomy_depth($depth, $graphic = '--') { - for ($n = 0; $n < $depth; $n++) { - $result .= $graphic; - } - return $result; +function _taxonomy_depth($depth, $graphic = '--') { + for ($n = 0; $n < $depth; $n++) { + $result .= $graphic; } + return $result; +} - function _prepare_update($data) { - foreach ($data as $key => $value) { - $q[] = "$key = '". check_query($value) ."'"; - } - $result = implode(", ", $q); - return $result; +function _prepare_update($data) { + foreach ($data as $key => $value) { + $q[] = "$key = '". check_query($value) ."'"; } + $result = implode(", ", $q); + return $result; +} - function _prepare_insert($data, $stage) { - if ($stage == 1) { - $result = implode(", ", array_keys($data)); - } - else { - foreach (array_values($data) as $value) { - $q[] = "'". check_query($value) ."'"; - } - $result = implode(", ", $q); +function _prepare_insert($data, $stage) { + if ($stage == 1) { + $result = implode(", ", array_keys($data)); + } + else { + foreach (array_values($data) as $value) { + $q[] = "'". check_query($value) ."'"; } - return "($result)"; + $result = implode(", ", $q); } + return "($result)"; +} - function taxonomy_page() { - global $op; +function taxonomy_page() { + global $op; - switch ($op) { - case "feed": - taxonomy_feed(); - break; - default: - // TODO: pretty display of all vocabularies - } + switch ($op) { + case "feed": + taxonomy_feed(); + break; + default: + // TODO: pretty display of all vocabularies } +} - /* +/* ** admin */ - function taxonomy_admin() { - global $edit, $type, $op, $id, $tree; - - if (user_access("administer taxonomy")) { - $links[] = la(t("add new vocabulary"), array("mod" => "taxonomy", "op" => "add", "type" => "vocabulary")); - $links[] = la(t("overview"), array("mod" => "taxonomy")); - $links[] = la(t("help"), array("mod" => "taxonomy", "op" => "help")); - - print "". implode(" | ", $links) ."
\n"; - - switch ($op) { - case "add": - if ($type == "vocabulary") - print taxonomy_form_vocabulary(); - else - print taxonomy_form_term(); - break; - case "edit": - if ($type == "vocabulary") - print taxonomy_form_vocabulary(object2array(taxonomy_get_vocabulary($id))); - else - print taxonomy_form_term(object2array(taxonomy_get_term($id))); - break; - case "preview": - print taxonomy_form($id); - break; - case "help": - print taxonomy_help(); - break; - case "Delete": - $edit["name"] = 0; - // fall through: - case "Submit": - if ($type == "vocabulary") - print status(taxonomy_save_vocabulary($edit)); - else - print status(taxonomy_save_term($edit)); - // fall through: - default: - print taxonomy_overview(); - } - } - else { - print message_access(); - } - } +function taxonomy_admin() { + global $edit, $type, $op, $id, $tree; + + if (user_access("administer taxonomy")) { + $links[] = la(t("add new vocabulary"), array("mod" => "taxonomy", "op" => "add", "type" => "vocabulary")); + $links[] = la(t("overview"), array("mod" => "taxonomy")); + $links[] = la(t("help"), array("mod" => "taxonomy", "op" => "help")); + + print "". implode(" | ", $links) ."
\n"; - function taxonomy_help() { - ?> -

Background

- Classifying nodes allows for the organization of content into categories and - subcategories of description. These categories can be used to organize and retrieve - similarly described content. Drupal's taxonomy.module is an extremely flexible - classification system that allows for 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). For details about - classification - types and insight into the development of taxonomy.module, see this - drupal.org discussion.
-

An Example Taxonomy - Foods

-

Dairy
- --Milk
- Drink
- --Alchohol
- --Pop
- --Milk
- Meat
- --Beef
- --Chicken
- --Lamb
- Spices
- --Sugar

-

Notes

-
    -
  • The term Milk appears within both Dairy and Drink. - This is an example of Multiple Parents for a term.
  • -
  • The order of siblings (e.g. Beef, Chicken, Lamb) in - the taxonomy may be controlled with the Weight parameter.
  • -
-

-

Vocabularies

- 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 the example Food taxonomy above. - -

Setting up a vocabulary

-

When you set up a controlled vocabulary, you will be asked to enter some descriptive - data and define the attributes of this vocabulary. For example, if you select - the Hierarchy option, you will be defining a taxonomy or a thesaurus. If - you select Related Terms option, you are allowing the definition of related - terms as in a thesaurus. Selecting Multiple Select 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.

- Vocabulary name
- Required. The name for this vocabulary. Example: Dairy.
-
- Description
- Optional. Description of the vocabulary, can be used by modules and feeds.
-
- Types
- Required. The list of node types you want to associate this vocabulary - with. Some available types are: blog, book, forum, page, story.
-
- Related Terms
- Allows relationships between terms within this vocabulary. Think of these as - See also references.
-
- Hierarchy
- Allows a tree-like taxonomy, as in our Foods example above
-
- Multiple Select
- Allows nodes to be described using more than one term. Nodes may then appear on - multiple taxonomy pages.
-

Adding terms to a vocabulary

- The options you see when adding a term to a vocabulary will depend on what you - selected for Related Terms, Hierarchy and Multiple Select - when you created the corrosponding vocabulary.
-
- Term name
- Required. The name for this term. Example: Milk
-
+ switch ($op) { + case "add": + if ($type == "vocabulary") + print taxonomy_form_vocabulary(); + else + print taxonomy_form_term(); + break; + case "edit": + if ($type == "vocabulary") + print taxonomy_form_vocabulary(object2array(taxonomy_get_vocabulary($id))); + else + print taxonomy_form_term(object2array(taxonomy_get_term($id))); + break; + case "preview": + print taxonomy_form($id); + break; + case "help": + print taxonomy_help(); + break; + case "Delete": + $edit["name"] = 0; + // fall through: + case "Submit": + if ($type == "vocabulary") + print status(taxonomy_save_vocabulary($edit)); + else + print status(taxonomy_save_term($edit)); + // fall through: + default: + print taxonomy_overview(); + } + } + else { + print message_access(); + } +} + +function taxonomy_help() { + ?> +

Background

+ Classifying nodes allows for the organization of content into categories and + subcategories of description. These categories can be used to organize and retrieve + similarly described content. Drupal's taxonomy.module is an extremely flexible + classification system that allows for 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). For details about +classification +types and insight into the development of taxonomy.module, see this +drupal.org discussion.
+

An Example Taxonomy - Foods

+

Dairy
+ --Milk
+ Drink
+ --Alchohol
+ --Pop
+ --Milk
+ Meat
+ --Beef
+ --Chicken
+ --Lamb
+ Spices
+ --Sugar

+

Notes

+
    +
  • The term Milk appears within both Dairy and Drink. + This is an example of Multiple Parents for a term.
  • +
  • The order of siblings (e.g. Beef, Chicken, Lamb) in + the taxonomy may be controlled with the Weight parameter.
  • +
+

+

Vocabularies

+ 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 the example Food taxonomy above. + +

Setting up a vocabulary

+

When you set up a controlled vocabulary, you will be asked to enter some descriptive +data and define the attributes of this vocabulary. For example, if you select +the Hierarchy option, you will be defining a taxonomy or a thesaurus. If +you select Related Terms option, you are allowing the definition of related +terms as in a thesaurus. Selecting Multiple Select 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.

+ Vocabulary name
+ Required. The name for this vocabulary. Example: Dairy.
+
Description
- Optional. Description of the term that may be used by modules and RSS feeds. - This is synonymous with a 'Scope note'.
-
- Parent
- 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.
-
- Synonyms
- 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. unauthorized - terms).
- -

Displaying Nodes Organized by Term(s)

-

In order to view the nodes associated with a term or a collection of terms, you - should browse to a properly formed URL. For example, see - "node", "or" => "1,2"), "module"); ?>"> "node", "or" => "1,2"), "module"); ?>. - Taxonomy URLs always contain a termID or list of termIDs at the end of the URL (aka querystring). - You may learn the termID for a given term by hovering over that term in the "taxonomy")) ?> page in the Admin and noting the number after the querystring parameter called tid. - If you wish to see nodes from a collection of termIDs, separate each termID with a comma. - Also, the name of the querystring parameter may be or or and. - or shows nodes which appear in any of the termIDs while and shows nodes in all the specified termIDs. - Thus, or is less specific than and. -

- -

RSS Feeds

-

Every term, or collection of terms, provides an RSS feed to which interested - users may subscribe. The URL format for an sample RSS feed is - "node", "op" => "feed", "or" => "1,2"), "module"); ?>"> "node", "op" => "feed", "or" => "1,2"), "module"); ?>.

- +
+ Types
+ Required. The list of node types you want to associate this vocabulary + with. Some available types are: blog, book, forum, page, story.
+
+ Related Terms
+ Allows relationships between terms within this vocabulary. Think of these as + See also references.
+
+ Hierarchy
+ Allows a tree-like taxonomy, as in our Foods example above
+
+ Multiple Select
+Allows nodes to be described using more than one term. Nodes may then appear on +multiple taxonomy pages.
+

Adding terms to a vocabulary

+The options you see when adding a term to a vocabulary will depend on what you +selected for Related Terms, Hierarchy and Multiple Select +when you created the corrosponding vocabulary.
+
+Term name
+ Required. The name for this term. Example: Milk
+
+Description
+Optional. Description of the term that may be used by modules and RSS feeds. +This is synonymous with a 'Scope note'.
+
+Parent
+ 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.
+
+Synonyms
+ 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. unauthorized + terms).
+ +

Displaying Nodes Organized by Term(s)

+

In order to view the nodes associated with a term or a collection of terms, you + should browse to a properly formed URL. For example, see + "node", "or" => "1,2"), "module"); ?>"> "node", "or" => "1,2"), "module"); ?>. + Taxonomy URLs always contain a termID or list of termIDs at the end of the URL (aka querystring). + You may learn the termID for a given term by hovering over that term in the "taxonomy")) ?> page in the Admin and noting the number after the querystring parameter called tid. + If you wish to see nodes from a collection of termIDs, separate each termID with a comma. + Also, the name of the querystring parameter may be or or and. + or shows nodes which appear in any of the termIDs while and shows nodes in all the specified termIDs. + Thus, or is less specific than and. +

+ +

RSS Feeds

+

Every term, or collection of terms, provides an RSS feed to which interested + users may subscribe. The URL format for an sample RSS feed is + "node", "op" => "feed", "or" => "1,2"), "module"); ?>"> "node", "op" => "feed", "or" => "1,2"), "module"); ?>.

+ -- cgit v1.2.3