Commit d8cd5496 authored by Dries's avatar Dries

- Added Marco's long-awaited taxonmy module and patches - a replacement
  for the meta system.  The patches add some extra functionality to the
  comment system (for example, comments can be set read-only) and fix a
  couple of small problems.

  + I integrated the required SQL updates from the varius *.mysql files
    into the "update.php" script.  Upgrading should be easy ...

  + I did not apply/commit the "user.diff" as requested by Marco ...

  + I didn't know what to do with "forum.module" and "forum2.module":
    what do you want me to do with it Marco?  Which one should go in?

  + Can we remove "node_index()" now; both from "node.module" and the
    themes?

  + Thanks Marco!
parent e5fd6713
......@@ -78,9 +78,13 @@ function object2array($node) {
return $array;
}
function path_uri() {
function path_uri($brief = 0) {
global $HTTP_HOST, $REQUEST_URI;
return "http://". $HTTP_HOST . substr($REQUEST_URI, 0, strrpos($REQUEST_URI, "/")) ."/";
$path = $HTTP_HOST . substr($REQUEST_URI, 0, strrpos($REQUEST_URI, "/")) ."/";
if (!$brief) {
$path = "http://". $path;
}
return $path;
}
function path_img() {
......@@ -256,6 +260,22 @@ function search_type($type = 0, $action = 0, $query = 0, $options = 0) {
return search_form($action, $query, $options) . search_data();
}
function drupal_str_replace($from, $to, $subject) {
/*
** Multiple item replace which works for *all* PHP versions
** (PHP 4.05+ supports this natively using similar syntax).
** $from and $to should be same sized arrays, $subject is the
** source text.
*/
for ($i = 0; $i < count($from); $i++) {
$subject = str_replace($from[$i], $to[$i], $subject);
}
return $subject;
}
function drupal_goto($url) {
/*
......@@ -551,12 +571,12 @@ function form_textarea($title, $name, $value, $cols, $rows, $description = 0) {
return form_item($title, "<textarea wrap=\"virtual\" cols=\"$cols\" rows=\"$rows\" name=\"edit[$name]\">". check_form($value) ."</textarea>", $description);
}
function form_select($title, $name, $value, $options, $description = 0, $extra = 0) {
function form_select($title, $name, $value, $options, $description = 0, $extra = 0, $multiple = 0) {
if (count($options) > 0) {
foreach ($options as $key => $choice) {
foreach ($options as $key=>$choice) {
$select .= "<option value=\"$key\"". (is_array($value) ? (in_array($key, $value) ? " selected=\"selected\"" : "") : ($key == $value ? " selected=\"selected\"" : "")) .">". check_form($choice) ."</option>";
}
return form_item($title, "<select name=\"edit[$name]\"". ($extra ? " $extra" : "") .">$select</select>", $description);
return form_item($title, "<select name=\"edit[$name]".($multiple ? "[]" : "")."\"" .($multiple ? " multiple " : "").($extra ? " $extra" : "") .">$select</select>", $description);
}
}
......
......@@ -243,6 +243,8 @@ function blog_form(&$node, &$help, &$error) {
$output .= form_textarea(t("Teaser"), "teaser", $node->teaser, 60, 5, $error["teaser"]);
}
$output .= implode("<p>", taxonomy_node_form("blog", $node));
$output .= form_textarea(t("Body"), "body", $node->body, 60, 15, $error["body"] ? $error["body"] : t("Allowed HTML tags") .": ". htmlspecialchars(variable_get("allowed_html", "")));
return $output;
......
......@@ -243,6 +243,8 @@ function blog_form(&$node, &$help, &$error) {
$output .= form_textarea(t("Teaser"), "teaser", $node->teaser, 60, 5, $error["teaser"]);
}
$output .= implode("<p>", taxonomy_node_form("blog", $node));
$output .= form_textarea(t("Body"), "body", $node->body, 60, 15, $error["body"] ? $error["body"] : t("Allowed HTML tags") .": ". htmlspecialchars(variable_get("allowed_html", "")));
return $output;
......
......@@ -145,8 +145,11 @@ function comment_edit($cid) {
}
function comment_reply($pid, $nid) {
global $theme;
global $theme, $node;
// we must provide a taxonomy context for user_access()
$context->nid = $nid;
if (user_access("access comments", $context)) {
if ($pid) {
$comment = db_fetch_object(db_query("SELECT c.*, u.uid, u.name FROM comments c LEFT JOIN users u ON c.uid = u.uid WHERE c.cid = '$pid'"));
comment_view($comment, t("reply to this comment"));
......@@ -156,12 +159,17 @@ function comment_reply($pid, $nid) {
$pid = 0;
}
if (user_access("post comments")) {
if (node_comment_mode($nid) == 1) {
$theme->box(t("Reply"), t("This discussion is closed: you can't post new comments."));
} else if (user_access("post comments", $context)) {
$theme->box(t("Reply"), comment_form(array("pid" => $pid, "nid" => $nid)));
}
else {
$theme->box(t("Reply"), t("You are not authorized to post comments."));
}
} else {
$theme->box(t("Reply"), t("You are not authorized to view comments."));
}
}
function comment_preview($edit) {
......@@ -205,7 +213,8 @@ function comment_preview($edit) {
function comment_post($edit) {
global $theme, $user;
if (user_access("post comments")) {
$context->nid = $edit["nid"];
if (user_access("post comments", $context) && node_comment_mode($edit["nid"]) == 2) {
/*
** Validate the comment's subject. If not specified, extract
......@@ -378,6 +387,11 @@ function comment_links($comment, $return = 1) {
$links[] = "<a href=\"admin.php?mod=comment&op=edit&id=$comment->cid\" title=\"". t("Administer this comment.") ."\"><span style=\"color: $theme->type;\">". t("administer") ."</span></a>";
}
// here we should check if this node has read-only comments, but we already check on submit
// and this way we save a query. it's just a cosmetic issue. otherwise just uncomment next
// line and related bracket some lines below
//if (node_comment_mode($comment->nid)) {
if (user_access("post comments")) {
if (comment_access("edit", $comment)) {
$links[] = "<a href=\"module.php?mod=comment&op=edit&id=$comment->cid\" title=\"". t("Make changes to your comment.") ."\"><span style=\"color: $theme->type\">". t("edit your comment") ."</span></a>";
......@@ -386,6 +400,7 @@ function comment_links($comment, $return = 1) {
$links[] = "<a href=\"module.php?mod=comment&op=reply&id=$comment->nid&pid=$comment->cid\" title=\"". t("Reply to this comment.") ."\"><span style=\"color: $theme->type;\">". t("reply to this comment") ."</span></a>";
}
}
//}
return $theme->links($links);
......@@ -597,11 +612,15 @@ function comment_link($type, $node = 0, $main = 0) {
else {
/*
** Node page: add a "post comment" link if the user is allowed to
** post comments.
** post comments and if this node is not read-only
*/
if (user_access("post comments")) {
if ($node->comment == 2) {
$links[] = "<a href=\"module.php?mod=comment&op=reply&id=$node->nid#comment\" title=\"". t("Share your thoughts and opinions related to this posting.") ."\">". t("add new comment") ."</a>";
} else {
$links[] = t("This discussion is closed: you can't post new comments.");
}
}
}
}
......
......@@ -145,8 +145,11 @@ function comment_edit($cid) {
}
function comment_reply($pid, $nid) {
global $theme;
global $theme, $node;
// we must provide a taxonomy context for user_access()
$context->nid = $nid;
if (user_access("access comments", $context)) {
if ($pid) {
$comment = db_fetch_object(db_query("SELECT c.*, u.uid, u.name FROM comments c LEFT JOIN users u ON c.uid = u.uid WHERE c.cid = '$pid'"));
comment_view($comment, t("reply to this comment"));
......@@ -156,12 +159,17 @@ function comment_reply($pid, $nid) {
$pid = 0;
}
if (user_access("post comments")) {
if (node_comment_mode($nid) == 1) {
$theme->box(t("Reply"), t("This discussion is closed: you can't post new comments."));
} else if (user_access("post comments", $context)) {
$theme->box(t("Reply"), comment_form(array("pid" => $pid, "nid" => $nid)));
}
else {
$theme->box(t("Reply"), t("You are not authorized to post comments."));
}
} else {
$theme->box(t("Reply"), t("You are not authorized to view comments."));
}
}
function comment_preview($edit) {
......@@ -205,7 +213,8 @@ function comment_preview($edit) {
function comment_post($edit) {
global $theme, $user;
if (user_access("post comments")) {
$context->nid = $edit["nid"];
if (user_access("post comments", $context) && node_comment_mode($edit["nid"]) == 2) {
/*
** Validate the comment's subject. If not specified, extract
......@@ -378,6 +387,11 @@ function comment_links($comment, $return = 1) {
$links[] = "<a href=\"admin.php?mod=comment&op=edit&id=$comment->cid\" title=\"". t("Administer this comment.") ."\"><span style=\"color: $theme->type;\">". t("administer") ."</span></a>";
}
// here we should check if this node has read-only comments, but we already check on submit
// and this way we save a query. it's just a cosmetic issue. otherwise just uncomment next
// line and related bracket some lines below
//if (node_comment_mode($comment->nid)) {
if (user_access("post comments")) {
if (comment_access("edit", $comment)) {
$links[] = "<a href=\"module.php?mod=comment&op=edit&id=$comment->cid\" title=\"". t("Make changes to your comment.") ."\"><span style=\"color: $theme->type\">". t("edit your comment") ."</span></a>";
......@@ -386,6 +400,7 @@ function comment_links($comment, $return = 1) {
$links[] = "<a href=\"module.php?mod=comment&op=reply&id=$comment->nid&pid=$comment->cid\" title=\"". t("Reply to this comment.") ."\"><span style=\"color: $theme->type;\">". t("reply to this comment") ."</span></a>";
}
}
//}
return $theme->links($links);
......@@ -597,11 +612,15 @@ function comment_link($type, $node = 0, $main = 0) {
else {
/*
** Node page: add a "post comment" link if the user is allowed to
** post comments.
** post comments and if this node is not read-only
*/
if (user_access("post comments")) {
if ($node->comment == 2) {
$links[] = "<a href=\"module.php?mod=comment&op=reply&id=$node->nid#comment\" title=\"". t("Share your thoughts and opinions related to this posting.") ."\">". t("add new comment") ."</a>";
} else {
$links[] = t("This discussion is closed: you can't post new comments.");
}
}
}
}
......
......@@ -363,6 +363,10 @@ function node_filter_line($text) {
return trim($text);
}
function node_comment_mode($nid) {
return db_result(db_query("SELECT comment FROM node WHERE nid = '".check_query($nid)."'"));
}
function node_filter($text) {
if (variable_get("filter_html", 0)) $text = node_filter_html($text);
if (variable_get("filter_link", 0)) $text = node_filter_link($text);
......@@ -867,7 +871,7 @@ function node_form($edit) {
$output .= form_select(t("Queue for moderation"), "moderate", $edit->moderate, array("Disabled", "Enabled"));
$output .= form_select(t("Promote to front page"), "promote", $edit->promote, array("Disabled", "Enabled"));
$output .= form_select(t("Static on front page"), "static", $edit->static, array("Disabled", "Enabled"));
$output .= form_select(t("Allow users comments"), "comment", $edit->comment, array("Disabled", "Enabled"));
$output .= form_select(t("Allow users comments"), "comment", $edit->comment, array("Disabled", "Read only", "Read/Write"));
$output .= form_select(t("Create new revision"), "revision", $edit->revision, array("Disabled", "Enabled"));
}
......@@ -985,9 +989,10 @@ function node_preview($node) {
}
function node_submit($node) {
global $theme, $user;
global $theme, $user, $tid;
if (user_access("post content")) {
$context->tid = $tid;
if (user_access("post content", $context)) {
/*
** Fixup the node when required:
......@@ -1024,6 +1029,12 @@ function node_submit($node) {
$nid = node_save($node, array_merge($fields, module_invoke($node->type, "save", "update", $node)));
/*
** Update terms of the node
*/
taxonomy_node_save($nid, $node->taxonomy);
watchdog("special", "$node->type: updated '$node->title'");
$output = t("The node has been updated.");
}
......@@ -1055,14 +1066,20 @@ function node_submit($node) {
*/
if (user_access("administer nodes")) {
$fields = array("uid", "body", "comment" => 1, "promote", "moderate", "status" => 1, "teaser", "title", "type" => $node->type);
$fields = array("uid", "body", "comment" => 2, "promote", "moderate", "status" => 1, "teaser", "title", "type" => $node->type);
}
else {
$fields = array("uid" => ($user->uid ? $user->uid : 0), "body", "comment" => 1, "teaser", "title", "type" => $node->type);
$fields = array("uid" => ($user->uid ? $user->uid : 0), "body", "comment" => 2, "teaser", "title", "type" => $node->type);
}
$nid = node_save($node, array_merge($fields, module_invoke($node->type, "save", "create", $node)));
/*
** Insert terms of the node
*/
taxonomy_node_save($nid, $node->taxonomy);
watchdog("special", "$node->type: added '$node->title'");
$output = t("Thanks for your submission.");
}
......@@ -1119,6 +1136,12 @@ function node_delete($edit) {
db_query("DELETE FROM node WHERE nid = '$node->nid'");
db_query("DELETE FROM comments WHERE nid = '$node->nid'");
/*
** Delete any taxonomy terms
*/
taxonomy_node_delete($node->nid);
/*
** Call the node specific callback (if any):
*/
......@@ -1145,7 +1168,7 @@ function node_delete($edit) {
}
function node_page() {
global $op, $id, $user, $edit, $type, $theme, $meta;
global $op, $id, $user, $edit, $type, $theme, $or, $and;
if ($op == "feed") {
node_feed();
......@@ -1185,7 +1208,27 @@ function node_page() {
$theme->box($title, node_delete($edit));
break;
default:
$result = db_query("SELECT nid, type FROM node WHERE ". ($meta ? "attributes LIKE '%". check_input($meta) ."%' AND " : "") . ($id ? "nid = '$id'" : "promote = '1'") ." AND status = '1' ORDER BY static DESC, created DESC LIMIT ". ($user->nodes ? $user->nodes : variable_get("default_nodes_main", 10)));
// prepare query
if ($or) {
foreach ((explode(",", $or)) as $t) {
$terms[] = "'".check_query($t)."'";
}
} else if ($and) {
foreach ((explode(",", $and)) as $t) {
$terms[] = "'".check_query($t)."'";
}
}
if ($or) {
// this is an OR of terms
$result = db_query("SELECT DISTINCT(n.nid), type FROM node n LEFT JOIN term_node r ON n.nid = r.nid WHERE tid IN (".implode(",", $terms).") AND ". ($id ? "nid = '$id'" : "promote = '1'") ." AND status = '1' ORDER BY static DESC, created DESC LIMIT ". ($user->nodes ? $user->nodes : variable_get("default_nodes_main", 10)));
} else if ($and) {
// this is an AND
$result = db_query("SELECT n.nid, type, count(*) AS c FROM node n LEFT JOIN term_node r ON n.nid = r.nid WHERE tid IN (".implode(",", $terms).") AND ". ($id ? "nid = '$id'" : "promote = '1'") ." AND status = '1' GROUP BY n.nid HAVING c = ".count($terms)." ORDER BY static DESC, created DESC LIMIT ". ($user->nodes ? $user->nodes : variable_get("default_nodes_main", 10)));
} else {
$result = db_query("SELECT nid, type FROM node WHERE ". ($id ? "nid = '$id'" : "promote = '1'") ." AND status = '1' ORDER BY static DESC, created DESC LIMIT ". ($user->nodes ? $user->nodes : variable_get("default_nodes_main", 10)));
}
while ($node = db_fetch_object($result)) {
node_view(node_load(array("nid" => $node->nid, "type" => $node->type)), 1);
}
......
......@@ -363,6 +363,10 @@ function node_filter_line($text) {
return trim($text);
}
function node_comment_mode($nid) {
return db_result(db_query("SELECT comment FROM node WHERE nid = '".check_query($nid)."'"));
}
function node_filter($text) {
if (variable_get("filter_html", 0)) $text = node_filter_html($text);
if (variable_get("filter_link", 0)) $text = node_filter_link($text);
......@@ -867,7 +871,7 @@ function node_form($edit) {
$output .= form_select(t("Queue for moderation"), "moderate", $edit->moderate, array("Disabled", "Enabled"));
$output .= form_select(t("Promote to front page"), "promote", $edit->promote, array("Disabled", "Enabled"));
$output .= form_select(t("Static on front page"), "static", $edit->static, array("Disabled", "Enabled"));
$output .= form_select(t("Allow users comments"), "comment", $edit->comment, array("Disabled", "Enabled"));
$output .= form_select(t("Allow users comments"), "comment", $edit->comment, array("Disabled", "Read only", "Read/Write"));
$output .= form_select(t("Create new revision"), "revision", $edit->revision, array("Disabled", "Enabled"));
}
......@@ -985,9 +989,10 @@ function node_preview($node) {
}
function node_submit($node) {
global $theme, $user;
global $theme, $user, $tid;
if (user_access("post content")) {
$context->tid = $tid;
if (user_access("post content", $context)) {
/*
** Fixup the node when required:
......@@ -1024,6 +1029,12 @@ function node_submit($node) {
$nid = node_save($node, array_merge($fields, module_invoke($node->type, "save", "update", $node)));
/*
** Update terms of the node
*/
taxonomy_node_save($nid, $node->taxonomy);
watchdog("special", "$node->type: updated '$node->title'");
$output = t("The node has been updated.");
}
......@@ -1055,14 +1066,20 @@ function node_submit($node) {
*/
if (user_access("administer nodes")) {
$fields = array("uid", "body", "comment" => 1, "promote", "moderate", "status" => 1, "teaser", "title", "type" => $node->type);
$fields = array("uid", "body", "comment" => 2, "promote", "moderate", "status" => 1, "teaser", "title", "type" => $node->type);
}
else {
$fields = array("uid" => ($user->uid ? $user->uid : 0), "body", "comment" => 1, "teaser", "title", "type" => $node->type);
$fields = array("uid" => ($user->uid ? $user->uid : 0), "body", "comment" => 2, "teaser", "title", "type" => $node->type);
}
$nid = node_save($node, array_merge($fields, module_invoke($node->type, "save", "create", $node)));
/*
** Insert terms of the node
*/
taxonomy_node_save($nid, $node->taxonomy);
watchdog("special", "$node->type: added '$node->title'");
$output = t("Thanks for your submission.");
}
......@@ -1119,6 +1136,12 @@ function node_delete($edit) {
db_query("DELETE FROM node WHERE nid = '$node->nid'");
db_query("DELETE FROM comments WHERE nid = '$node->nid'");
/*
** Delete any taxonomy terms
*/
taxonomy_node_delete($node->nid);
/*
** Call the node specific callback (if any):
*/
......@@ -1145,7 +1168,7 @@ function node_delete($edit) {
}
function node_page() {
global $op, $id, $user, $edit, $type, $theme, $meta;
global $op, $id, $user, $edit, $type, $theme, $or, $and;
if ($op == "feed") {
node_feed();
......@@ -1185,7 +1208,27 @@ function node_page() {
$theme->box($title, node_delete($edit));
break;
default:
$result = db_query("SELECT nid, type FROM node WHERE ". ($meta ? "attributes LIKE '%". check_input($meta) ."%' AND " : "") . ($id ? "nid = '$id'" : "promote = '1'") ." AND status = '1' ORDER BY static DESC, created DESC LIMIT ". ($user->nodes ? $user->nodes : variable_get("default_nodes_main", 10)));
// prepare query
if ($or) {
foreach ((explode(",", $or)) as $t) {
$terms[] = "'".check_query($t)."'";
}
} else if ($and) {
foreach ((explode(",", $and)) as $t) {
$terms[] = "'".check_query($t)."'";
}
}
if ($or) {
// this is an OR of terms
$result = db_query("SELECT DISTINCT(n.nid), type FROM node n LEFT JOIN term_node r ON n.nid = r.nid WHERE tid IN (".implode(",", $terms).") AND ". ($id ? "nid = '$id'" : "promote = '1'") ." AND status = '1' ORDER BY static DESC, created DESC LIMIT ". ($user->nodes ? $user->nodes : variable_get("default_nodes_main", 10)));
} else if ($and) {
// this is an AND
$result = db_query("SELECT n.nid, type, count(*) AS c FROM node n LEFT JOIN term_node r ON n.nid = r.nid WHERE tid IN (".implode(",", $terms).") AND ". ($id ? "nid = '$id'" : "promote = '1'") ." AND status = '1' GROUP BY n.nid HAVING c = ".count($terms)." ORDER BY static DESC, created DESC LIMIT ". ($user->nodes ? $user->nodes : variable_get("default_nodes_main", 10)));
} else {
$result = db_query("SELECT nid, type FROM node WHERE ". ($id ? "nid = '$id'" : "promote = '1'") ." AND status = '1' ORDER BY static DESC, created DESC LIMIT ". ($user->nodes ? $user->nodes : variable_get("default_nodes_main", 10)));
}
while ($node = db_fetch_object($result)) {
node_view(node_load(array("nid" => $node->nid, "type" => $node->type)), 1);
}
......
......@@ -90,6 +90,8 @@ function story_form(&$node, &$help, &$error) {
$output .= form_textarea(t("Teaser"), "teaser", $node->teaser, 60, 5, $error["teaser"]);
}
$output .= implode("<p>", taxonomy_node_form("story", $node));
$output .= form_textarea(t("Body"), "body", $node->body, 60, 15, $error["body"] ? $error["body"] : t("Allowed HTML tags") .": ". htmlspecialchars(variable_get("allowed_html", "")));
return $output;
......
......@@ -90,6 +90,8 @@ function story_form(&$node, &$help, &$error) {
$output .= form_textarea(t("Teaser"), "teaser", $node->teaser, 60, 5, $error["teaser"]);
}
$output .= implode("<p>", taxonomy_node_form("story", $node));
$output .= form_textarea(t("Body"), "body", $node->body, 60, 15, $error["body"] ? $error["body"] : t("Allowed HTML tags") .": ". htmlspecialchars(variable_get("allowed_html", "")));
return $output;
......
This diff is collapsed.
This diff is collapsed.
......@@ -49,7 +49,8 @@
"2002-02-19" => "update_22",
"2002-03-05" => "update_23",
"2002-04-08" => "update_24",
"2002-03-11 : modules/themes web config" => "update_25"
"2002-04-14 : modules/themes web config" => "update_25",
"2002-04-14 : new taxonomy system" => "update_26"
);
// Update functions
......@@ -352,7 +353,57 @@ function update_25() {
update_sql("REPLACE system SET name = 'system', type = 'module', filename = 'system.module', status = '1';");
update_sql("REPLACE system SET name = 'user', type = 'module', filename = 'user.module', status = '1';");
update_sql("REPLACE system SET name = 'watchdog', type = 'module', filename = 'watchdog.module', status = '1';");
update_sql("UPDATE users SET theme = LOWER(theme);');
update_sql("UPDATE users SET theme = LOWER(theme);");
}
function update_26() {
update_sql("CREATE TABLE vocabulary (
vid int UNSIGNED NOT NULL PRIMARY KEY auto_increment,
name varchar(255) NOT NULL,
description TEXT,
relations TINYINT UNSIGNED NOT NULL,
hierarchy TINYINT UNSIGNED NOT NULL,
multiple TINYINT UNSIGNED NOT NULL,
required TINYINT UNSIGNED NOT NULL,
types TEXT,
weight TINYINT NOT NULL);");
update_sql("CREATE TABLE term_data (
tid int UNSIGNED NOT NULL PRIMARY KEY auto_increment,
vid int UNSIGNED NOT NULL,
name varchar(255) NOT NULL,
description TEXT,
weight TINYINT NOT NULL);");
update_sql("CREATE TABLE term_hierarchy (
tid int UNSIGNED NOT NULL,
parent int UNSIGNED NOT NULL
);");
update_sql("CREATE TABLE term_relation (
tid1 int UNSIGNED NOT NULL,
tid2 int UNSIGNED NOT NULL
);");
update_sql("CREATE TABLE term_synonym (
tid int UNSIGNED NOT NULL,
name varchar(255) NOT NULL
);");
update_sql("CREATE TABLE term_node (
nid int UNSIGNED NOT NULL,
tid int UNSIGNED NOT NULL
);");
update_sql("ALTER TABLE term_data ADD INDEX (vid);");
update_sql("ALTER TABLE term_hierarchy ADD INDEX (tid);");
update_sql("ALTER TABLE term_hierarchy ADD INDEX (parent);");
update_sql("ALTER TABLE term_relation ADD INDEX (tid1);");
update_sql("ALTER TABLE term_relation ADD INDEX (tid2);");
update_sql("ALTER TABLE term_synonym ADD INDEX (tid);");
update_sql("ALTER TABLE term_synonym ADD INDEX (name(3));");
update_sql("ALTER TABLE term_node ADD INDEX (nid);");
update_sql("ALTER TABLE term_node ADD INDEX (tid);");
}
/*
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment