一直以来对于 Drupal 最不满意的就是必须用email注册来回复否则只能匿名回复,毕竟 Drupal 是一个以 blog 为主的系统,不是论坛,所以决定把Blog的评论模式还给 Drupal,按照 movabletype 的样式重新打造评论模块。
两点说明:1、方法非官方,事先请备份文件。2、参考自davidnunez的Anonymous Comments Hack
具体方法:
1.在数据库中的comments表添加3列:cnme, ceml, curl
sql语句:
ALTER TABLE comments ADD cnme varchar(60) DEFAULT NULL;
ALTER TABLE comments ADD ceml varchar(64) DEFAULT NULL;
ALTER TABLE comments ADD curl varchar(255) DEFAULT NULL;
2.改includes/common.inc
将其中的format_name方法替换为:
function format_name($object) {
if ($object->uid && $object->name) {
/*
** Shorten the name when it is too long or it will break many
** tables.
*/
if (strlen($object->name) > 20) {
$name = truncate_utf8($object->name, 15) .”…”;
}
else {
$name = $object->name;
}
if (arg(0) == “admin” and user_access(“administer users”)) {
$output = l($name, “admin/user/edit/$object->uid”, array(“title” => t(“Administer user profile.”)));
}
else {
$output = l($name, “user/view/$object->uid”, array(“title” => t(“View user profile.”)));
}
}
else if ($object->name) {
/*
** Sometimes modules display content composed by people who are
** not registers members of the site (i.e. mailing list or news
** aggregator modules). This clause enables modules to display
** the true author of the content.
*/
$output = $object->name;
}
//******HACK
else if ($object->cnme) {
if ($object->curl) {
$pos = strpos($object->curl, “http://”);
if (is_int($pos)) {
$output = l($object->cnme, “$object->curl”);
}
else {
$output = l($object->cnme, “curl/” _fcksavedurl=””>curl/”>http://$object->curl”);
}
}
else {
$output = $object->cnme;
}
}
//******END HACK
else {
$output = t(variable_get(“anonymous”, “Anonymous”));
}
return $output;
}
3.将modules/comment.module里的theme_comment_form方法替换为:
function theme_comment_form($edit, $title) {
global $user;
$form .= “n”;
//******HACKED
// name field:
//$form .= form_item(t(“Your name”), format_name($user));
if (!empty($user->name)) {
$form .= form_item(t(“Your name”), format_name($user));
} else {
$form .= form_textfield(t(“Your name”), “cnme”, $edit[“cnme”], 50, 64);
$form .= form_textfield(t(“E-Mail (Optional)”), “ceml”, $edit[“ceml”], 50,64);
$form .= form_textfield(t(“Web Site (Optional)”), “curl”, $edit[“curl”], 50,64, “Be sure to start with http://”);
}
//******
// subject field:
$form .= form_textfield(t(“Subject”), “subject”, $edit[“subject”], 50, 64);
// comment field:
$form .= form_textarea(t(“Comment”), “comment”, $edit[“comment”] ? $edit[“comment”] : $user->signature, 70, 10, filter_tips_short());
// preview button:
$form .= form_hidden(“cid”, $edit[“cid”]);
$form .= form_hidden(“pid”, $edit[“pid”]);
$form .= form_hidden(“nid”, $edit[“nid”]);
if (!$edit[“comment”] && variable_get(“comment_preview”, 1)) {
$form .= form_submit(t(“Preview comment”));
}
else {
$form .= form_submit(t(“Preview comment”));
$form .= form_submit(t(“Post comment”));
}
return theme(“box”, $title, form($form, “post”, url(“comment/reply/”. $edit[“nid”])));
}
4.将modules/comment.module中的对应语句替换(注意是db_query的INSERT INTO语句
db_query(“INSERT INTO {comments} (cid, nid, pid, uid, subject, comment, hostname, timestamp, status, score, users, thread, cnme, ceml, curl)
VALUES (%d, %d, %d, %d, ‘%s’, ‘%s’, ‘%s’, %d, %d, %d, ‘%s’, ‘%s’, ‘%s’, ‘%s’, ‘%s’)”, $edit[“cid”], $edit[“nid”],
$edit[“pid”], $user->uid, $edit[“subject”], $edit[“comment”],
$_SERVER[‘REMOTE_ADDR’], time(), $status, $score, $users, $thread, $edit[“cnme”], $edit[“ceml”], $edit[“curl”]);
5.更改所使用的theme模板文件
如果使用的是xtemplate更改xtemplate.theme内相应方法:
function xtemplate_comment($comment, $links = 0) {
global $xtemplate;
//**********HACK
$result = db_fetch_object(db_query(“SELECT * FROM comments WHERE cid = %d”, $comment->cid));
$comment->cnme=$result->cnme;
$comment->curl=$result->curl;
$comment->ceml=$result->ceml;
//**********END HACK
$xtemplate->template->assign(array (
“new” => t(“new”),
“submitted” => t(“Submitted by %a on %b.”,
array(“%a” => format_name($comment),
“%b” => format_date($comment->timestamp))),
“title” => $comment->subject,
“author” => format_name($comment),
“date” => format_date($comment->timestamp),
“content” => $comment->comment
));
if ($comment->new) {
$xtemplate->template->parse(“comment.new”);
}
if ($picture = theme(‘user_picture’, $comment)) {
$xtemplate->template->assign(“picture”, $picture);
$xtemplate->template->parse(“comment.picture”);
}
if ($links) {
$xtemplate->template->assign(“links”, $links);
$xtemplate->template->parse(“comment.links”);
}
$xtemplate->template->parse(“comment”);
$output = $xtemplate->template->text(“comment”);
$xtemplate->template->reset(“comment”);
return $output;
}
如果使用phptemplate将phptemplate.theme内对应方法改为:
function phptemplate_comment_view($comment, $links = “”, $visible = 1) {
//**********HACK
$result = db_fetch_object(db_query(“SELECT * FROM comments WHERE cid = %d”, $comment->cid));
$comment->cnme=$result->cnme;
$comment->curl=$result->curl;
$comment->ceml=$result->ceml;
//**********END HACK
$output = “”;
if (node_is_new($comment->nid, $comment->timestamp)) {
$comment->new = 1;
}
if ($visible) {
$comment->comment = check_output($comment->comment);
$output .= theme(“comment”, $comment, $links);
}
else {
$output .= theme(“comment_folded”, $comment);
}
return $output;
}
Done!