drupal/modules/blog.module

460 lines
16 KiB
Plaintext
Raw Normal View History

<?php
class Blog {
function Blog($blog) {
global $user;
$this = new Node($blog);
$this->body = $blog[body];
}
}
function blog_help() {
?>
<p>Drupal's blog module allows registered users to maintain an online blog or diary. It provides easy-to-write and easy-to-read online diaries or journals that can be filled with daily thoughts, poetry, boneless blabber, spiritual theories, intimate details, valuable experiences, cynical rants, semi-coherent comments, writing experiments, artistic babblings, critics on current facts, fresh insights, diverse dreams, chronicles and mumbling madness available for public consumption.</p>
<?php
}
function blog_perm() {
return array("administer blogs", "access blogs", "post blogs");
}
function blog_status() {
return array(dumped, posted);
}
function blog_summary($node) {
return $node->body;
}
2001-09-16 11:33:14 +00:00
function blog_feed_user($uid = 0, $date = 0) {
global $user;
2001-09-16 11:33:14 +00:00
if ($uid) {
$account = user_load(array("uid" => $uid, "status" => 1));
}
else {
$account = $user;
}
if (!$date) {
$date = time();
}
2001-09-16 11:33:14 +00:00
$result = db_query("SELECT n.nid, n.title, n.timestamp, b.body, u.name, u.uid FROM blog b LEFT JOIN node n ON b.nid = n.nid LEFT JOIN user u ON n.author = u.uid WHERE u.uid = '$uid' AND n.timestamp > '". ($date - 2592000) ."' ORDER BY b.lid DESC LIMIT 15");
while ($blog = db_fetch_object($result)) {
$items .= format_rss_item($blog->title, path_uri() ."node.php?id=$blog->nid", $blog->body);
}
$output .= "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n";
$output .= "<rss version=\"0.91\">\n";
2001-09-16 11:33:14 +00:00
$output .= format_rss_channel("$account->name's blog", path_uri() ."module.php?mod=blog&op=view&id=$account->uid", "$account->name's blog", $items);
$output .= "</rss>\n";
header("Content-Type: text/xml");
print $output;
}
function blog_feed_last() {
2001-09-16 11:33:14 +00:00
$result = db_query("SELECT n.nid, n.title, n.timestamp, b.body, u.name, u.uid FROM blog b LEFT JOIN node n ON b.nid = n.nid LEFT JOIN user u ON n.author = u.uid ORDER BY b.lid DESC LIMIT 15");
while ($blog = db_fetch_object($result)) {
2001-09-16 11:33:14 +00:00
$items .= format_rss_item($blog->title, path_uri() ."module.php?mod=blog&op=view&id=". urlencode($blog->uid), $blog->body);
}
$output .= "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n";
$output .= "<rss version=\"0.91\">\n";
$output .= format_rss_channel(variable_get("site_name", "drupal") .": user blogs", path_uri() ."module.php?mod=blog", "Recently updated blogs.", $items);
$output .= "</rss>\n";
header("Content-Type: text/xml");
print $output;
}
2001-09-16 11:33:14 +00:00
function blog_page_user($uid = 0, $date = 0) {
global $theme, $user;
2001-09-16 11:33:14 +00:00
if ($uid) {
$account = user_load(array("uid" => $uid, "status" => 1));
}
else {
$account = $user;
}
2001-09-16 11:33:14 +00:00
if (!$date) {
$date = time();
}
$result = db_query("SELECT n.nid, n.title, n.comment, COUNT(c.cid) AS comments, n.timestamp, b.body, u.uid, u.name FROM blog b LEFT JOIN node n ON b.nid = n.nid LEFT JOIN user u ON n.author = u.uid LEFT JOIN comments c ON n.nid = c.lid WHERE u.uid = '$account->uid' AND n.timestamp <= '$date' AND n.timestamp >= '". ($date - 2592000) ."' GROUP BY n.nid ORDER BY n.nid DESC LIMIT 20");
$output .= "<table border=\"0\" cellpadding=\"4\" cellspacing=\"4\">";
2001-08-05 14:33:53 +00:00
while ($blog = db_fetch_object($result)) {
2001-08-05 14:33:53 +00:00
$links = array();
if ($date != date("dny", $blog->timestamp)) {
$date = date("dny", $blog->timestamp);
2001-09-16 11:33:14 +00:00
$output .= "<tr><td colspan=\"2\"><b><a href=\"module.php?mod=blog&id=$blog->uid&date=". mktime(23, 59, 59, date("n", $blog->timestamp), date("d", $blog->timestamp), date("Y", $blog->timestamp)) ."\">". format_date($blog->timestamp, custom, "d M Y") .":</a></b></td></tr>";
2001-08-05 14:33:53 +00:00
}
2001-09-16 11:33:14 +00:00
if ($user->uid && $user->name == $name) {
2001-08-05 14:33:53 +00:00
$links[] = "<a href=\"submit.php?mod=blog&op=edit&id=$blog->nid\">". t("edit") ."</a>";
}
2001-09-16 11:33:14 +00:00
if ($user->uid && user_access("post blogs")) {
$links[] = "<a href=\"submit.php?mod=blog&type=blog&id=$blog->nid\">". t("blog it") ."</a>";
2001-08-05 14:33:53 +00:00
}
if ($blog->comment) {
$links[] = "<a href=\"node.php?id=$blog->nid\">". format_plural($blog->comments, t("comment"), t("comments")) ."</a>";
2001-08-05 14:33:53 +00:00
}
$output .= "<tr><td><div style=\"margin-left: 20px;\"><b>". check_output($blog->title) ."</b></div></td><td align=\"right\">". $theme->links($links) ."</td></tr>";
$output .= "<tr><td colspan=\"2\"><div style=\"margin-left: 40px;\">". check_output($blog->body, 1) ."</div><br /></td></tr>";
}
2001-08-05 14:33:53 +00:00
$output .= "</table>";
2001-09-16 11:33:14 +00:00
$output .= "<a href=\"module.php?mod=blog&op=feed&id=$account->uid\"><img src=\"". $theme->image("xml.gif") ."\" width=\"36\" height=\"14\" align=\"right\" border=\"0\" /></a>\n";
2001-09-16 11:33:14 +00:00
$theme->box(sprintf(t("%s's blog"), $account->name), $output, "main");
}
2001-07-14 14:19:45 +00:00
function blog_page_last() {
2001-08-05 14:33:53 +00:00
global $theme, $user;
2001-09-16 11:33:14 +00:00
$result = db_query("SELECT n.nid, n.title, n.comment, COUNT(c.cid) AS comments, n.timestamp, b.body, u.uid, u.name FROM blog b LEFT JOIN node n ON b.nid = n.nid LEFT JOIN user u ON n.author = u.uid LEFT JOIN comments c ON n.nid = c.lid GROUP BY n.nid ORDER BY n.nid DESC LIMIT 20");
$output .= "<table border=\"0\" cellpadding=\"4\" cellspacing=\"4\">";
2001-08-05 14:33:53 +00:00
while ($blog = db_fetch_object($result)) {
2001-08-05 14:33:53 +00:00
$links = array();
2001-09-16 11:33:14 +00:00
$links[] = "<a href=\"module.php?mod=blog&op=view&id=$blog->uid\">". sprintf("%s's blog", $blog->name) ."</a>";
2001-08-05 14:33:53 +00:00
2001-09-16 11:33:14 +00:00
if ($blog->uid == $user->uid) {
2001-08-05 14:33:53 +00:00
$links[] = "<a href=\"submit.php?mod=blog&op=edit&id=$blog->nid\">". t("edit") ."</a>";
}
2001-09-16 11:33:14 +00:00
if ($user->uid && user_access("post blogs")) {
$links[] = "<a href=\"submit.php?mod=blog&type=blog&id=$blog->nid\">". t("blog it") ."</a>";
2001-08-05 14:33:53 +00:00
}
if ($blog->comment) {
$links[] = "<a href=\"node.php?id=$blog->nid\">". format_plural($blog->comments, t("comment"), t("comments")) ."</a>";
2001-08-05 14:33:53 +00:00
}
$output .= "<tr><td><b>". check_output($blog->title) ."</b></td><td align=\"right\">". $theme->links($links) ."</td></tr>";
$output .= "<tr><td colspan=\"2\"><div style=\"margin-left: 20px;\">". check_output($blog->body, 1) ."</div><br /></td></tr>";
2001-08-05 14:33:53 +00:00
}
2001-08-05 14:33:53 +00:00
$output .= "</table>";
$output .= "<a href=\"module.php?mod=blog&op=feed\"><img src=\"". $theme->image("xml.gif") ."\" width=\"36\" height=\"14\" align=\"right\" border=\"0\" /></a>\n";
$theme->box(t("User blogs"), $output, "main");
}
function blog_remove($nid) {
global $status, $user;
$blog = node_get_object(array(nid => $nid, type => "blog"));
2001-09-16 11:33:14 +00:00
if ($blog && $blog->uid == $user->uid) {
node_save(array(nid => $nid), array(status => $status[dumped]));
node_del(array(type => "blog", nid => $nid));
}
}
function blog_view($node, $main = 0) {
global $theme;
$theme->node($node, $main);
}
function blog_form($edit = array()) {
global $REQUEST_URI, $id, $mod, $type, $user, $theme;
2001-09-16 11:33:14 +00:00
if ($user->uid && (user_access("administer blogs") || user_access("post blogs"))) {
if ($mod == "node" || $edit[type] == "blog") {
// do nothing
}
else if ($type == "blog") {
$item = node_get_object(array(type => "blog", nid => $id));
$edit["title"] = $item->title;
$edit["body"] = "<i>". $item->body ."</i> [<a href=\"module.php?mod=blog&name=". urlencode($item->name) ."&date=$item->timestamp\">$item->name</a>]";
}
else if ($type == "import") {
$item = db_fetch_object(db_query("SELECT i.*, f.title as ftitle, f.link as flink FROM item i, feed f WHERE i.iid = '". check_input($id) ."' AND i.fid = f.fid"));
$edit["title"] = $item->title;
$edit["body"] = "<a href=\"$item->link\">$item->title</a> - <i>". check_output($item->description) ."</i> [<a href=\"$item->flink\">$item->ftitle</a>]\n";
}
if ($edit["title"]) {
$form .= blog_view(new Blog(node_preview($edit)));
}
2001-07-12 16:50:12 +00:00
$form .= form_textfield(t("Subject"), "title", $edit["title"], 50, 64);
$form .= form_textarea(t("Body"), "body", $edit["body"], 70, 15, t("Allowed HTML tags") .": ". htmlspecialchars(variable_get("allowed_html", "")));
$form .= form_hidden("type", "blog");
2001-07-12 16:50:12 +00:00
if ($edit["nid"] > 0) {
$form .= form_hidden("nid", $edit["nid"]);
}
if (!$edit) {
$form .= form_submit(t("Preview"));
}
else if ($edit && !$edit["title"]) {
$form .= "<font color=\"red\">". t("Warning: you did not supply a subject.") ."</font><p>\n";
$form .= form_submit(t("Preview"));
}
else if ($edit && !$edit["body"]) {
$form .= "<font color=\"red\">". t("Warning: you did not supply any text.") ."</font><p>\n";
$form .= form_submit(t("Preview"));
}
else {
$form .= form_submit(t("Preview"));
$form .= form_submit(t("Submit"));
}
2001-07-12 16:50:12 +00:00
return form($REQUEST_URI, $form);
}
else {
return message_access();
}
}
function blog_save($edit) {
global $status, $user;
2001-09-16 11:33:14 +00:00
if ($user->uid && (user_access("administer blogs") || user_access("post blogs"))) {
if ($edit["nid"]) {
node_save($edit, array(title, body, type => "blog"));
}
else {
2001-09-16 11:33:14 +00:00
node_save($edit, array(attributes => node_attributes_save("blog", $edit), author => $user->uid, body, comment => variable_get("blog_comment", 0), moderate => variable_get("blog_moderate", ""), promote => variable_get("blog_promote", 0), score => 0, status => variable_get("blog_status", $status[posted]), timestamp => time(), title, type => "blog", votes => 0));
}
}
}
function blog_edit_history($nid) {
global $user;
2001-09-16 11:33:14 +00:00
$result = db_query("SELECT n.nid, n.title, n.timestamp, b.body FROM blog b LEFT JOIN node n ON b.nid = n.nid WHERE n.author = '$user->uid' AND n.nid <= '". check_input($nid) ."' ORDER BY b.lid DESC LIMIT 15");
$output .= "<table cellpadding=\"3\" cellspacing=\"3\" border=\"0\" width=\"100%\">";
while ($blog = db_fetch_object($result)) {
$output .= "<tr><td><b>". check_output($blog->title) ."</b><br />". check_output($blog->body, 1) ."</td><td><a href=\"submit.php?mod=blog&op=edit&id=$blog->nid\">". t("edit") ."</a></td><td><a href=\"submit.php?mod=blog&op=delete&id=$blog->nid\">". t("delete") ."</a></td></tr>\n";
}
$output .= "</table>";
return $output;
}
function blog_page() {
2001-09-16 11:33:14 +00:00
global $theme, $id, $op, $date;
2001-07-14 14:19:45 +00:00
if (user_access("access blogs")) {
switch ($op) {
case "feed":
2001-09-16 11:33:14 +00:00
if ($id) {
blog_feed_user($id, $date);
}
else {
blog_feed_last();
}
break;
default:
2001-07-14 15:09:56 +00:00
$theme->header();
2001-09-16 11:33:14 +00:00
if ($id) {
blog_page_user($id, $date);
}
else {
blog_page_last();
}
2001-07-14 15:09:56 +00:00
$theme->footer();
}
}
else {
2001-07-14 15:09:56 +00:00
$theme->header();
2001-07-14 14:19:45 +00:00
$theme->box(t("Access denied"), message_access());
2001-07-14 15:09:56 +00:00
$theme->footer();
}
2001-07-14 14:19:45 +00:00
}
function blog_user() {
global $op, $id, $edit, $theme, $user;
if (user_access("post blogs")) {
switch ($op) {
case "delete":
blog_remove($id);
2001-09-16 11:33:14 +00:00
blog_page_user($user->uid, time());
break;
case "edit":
$theme->box(t("Submit a blog"), blog_form(node_get_array(array("nid" => $id, "type" => "blog"))), "main");
$theme->box(t("Older blogs"), blog_edit_history($id), "main");
break;
case t("Preview"):
$theme->box(t("Preview Blog"), blog_form($edit), "main");
break;
case t("Submit"):
blog_save($edit);
2001-09-16 11:33:14 +00:00
blog_page_user($user->uid, time());
break;
default:
$theme->box(t("Submit a blog"), blog_form($edit), "main");
}
}
}
function blog_link($type, $node = 0) {
global $user;
if ($type == "page" && user_access("access blogs")) {
$links[] = "<a href=\"module.php?mod=blog\">". t("user blogs") ."</a>";
}
if ($type == "menu" && user_access("post blogs")) {
$links[] = "<a href=\"submit.php?mod=blog\">". t("add blog entry") ."</a>";
2001-09-16 11:33:14 +00:00
$links[] = "<a href=\"module.php?mod=blog&op=view&id=$user->uid\">". t("view your blog") ."</a>";
}
if ($type == "node" && $node->type == "blog") {
2001-09-16 11:33:14 +00:00
$links[] = "<a href=\"module.php?mod=blog&op=view&id=$node->uid\">". strtr(t("%a's blog"), array("%a" => $node->name)) ."</a>";
}
return $links ? $links : array();
}
function blog_block() {
2001-09-16 11:33:14 +00:00
global $user;
$result = db_query("SELECT u.uid, u.name, n.timestamp, n.title, n.nid FROM node n LEFT JOIN user u ON n.author = u.uid WHERE n.type = 'blog' ORDER BY n.nid DESC LIMIT 10");
while ($node = db_fetch_object($result)) {
2001-09-16 11:33:14 +00:00
$output .= "<a href=\"module.php?mod=blog&op=view&id=$node->nid\">". check_output($node->title) ."</a><br />\n";
}
$block[0]["subject"] = "<a href=\"module.php?mod=blog\">". t("User blogs") ."</a>";
$block[0]["content"] = $output;
$block[0]["info"] = t("User blogs");
$block[0]["link"] = "module.php?mod=blog";
return $block;
}
function blog_search($keys) {
global $PHP_SELF, $status;
2001-09-16 11:33:14 +00:00
$result = db_query("SELECT n.*, b.* FROM blog b LEFT JOIN node n ON n.nid = b.nid AND n.lid = b.lid WHERE (n.title LIKE '%$keys%' OR b.body LIKE '%$keys%') ORDER BY n.timestamp DESC LIMIT 20");
while ($blog = db_fetch_object($result)) {
$find[$i++] = array("title" => check_output($blog->title), "link" => ($PHP_SELF == "/admin.php" ? "admin.php?mod=node&type=blog&op=edit&id=$blog->nid" : "node.php?id=$blog->nid"), "user" => $blog->name, "date" => $blog->timestamp);
}
return $find;
}
class BlogCalendar {
var $date;
var $name;
function BlogCalendar($name, $date) {
$this->name = urlencode($name);
// Prevent future dates:
$today = mktime(23, 59, 59, date("n", time()), date("d", time()), date("Y", time()));
$this->date = (($date && $date <= $today) ? $date : $today);
$this->date = mktime(23, 59, 59, date("n", $this->date), date("d", $this->date), date("Y", $this->date));
}
function display() {
// Extract information from the given date:
$month = date("n", $this->date);
$year = date("Y", $this->date);
$day = date("d", $this->date);
// Extract today's date:
$today = mktime(23, 59, 59, date("n", time()), date("d", time()), date("Y", time()));
// Extract the timestamp of the last day of today's month:
$thislast = mktime(23, 59, 59, date("n", time()), date("t", time()), date("Y", time()));
// Extract first day of the month:
$first = date("w", mktime(0, 0, 0, $month, 1, $year));
// Extract last day of the month:
$last = date("t", mktime(0, 0, 0, $month, 1, $year));
// Calculate previous and next months dates and check for shorter months (28/30 days)
$prevmonth = mktime(23, 59, 59, $month - 1, 1, $year);
$prev = mktime(23, 59, 59, $month - 1, min(date("t", $prevmonth), $day), $year);
$nextmonth = mktime(23, 59, 59, $month + 1, 1, $year);
$next = mktime(23, 59, 59, $month + 1, min(date("t", $nextmonth), $day), $year);
// Generate calendar header:
$output .= "\n<!-- calendar -->\n";
$output .= "<TABLE WIDTH=\"100%\" BORDER=\"0\" CELLSPACING=\"0\" CELLPADDING=\"1\">\n";
$output .= " <TR><TD ALIGN=\"center\" COLSPAN=\"7\"><B><A HREF=\"module.php?mod=blog&name=". urlencode($this->name) ."&date=$prev\" STYLE=\"text-decoration: none;\">&lt;&lt;</A> &nbsp; ". date("F Y", $this->date) ." &nbsp; " . ($next <= $thislast ? "<A HREF=\"module.php?mod=blog&name=". urlencode($this->name) ."&date=$next\" STYLE=\"text-decoration: none;\">&gt;&gt;</A>" : "&gt;&gt;") . "<B></TD></TR>\n";
// Generate the days of the week:
$output .= " <TR>";
$somesunday = mktime(0, 0, 0, 3, 20, 1994);
for ($i = 0; $i < 7; $i++) {
$output .= "<TD ALIGN=\"center\">" . substr(ucfirst(t(date("l", $somesunday + $i * 86400))), 0, 1) . "</TD>";
}
$output .= "</TR>\n";
// Initialize temporary variables:
$nday = 1;
$sday = $first;
// Loop through all the days of the month:
while ($nday <= $last) {
// Set up blank days for first week of the month:
if ($first) {
$output .= " <TR><TD COLSPAN=\"$first\">&nbsp</TD>\n";
$first = 0;
}
// Start every week on a new line:
if ($sday == 0) $output .= " <TR>\n";
// Print one cell:
$date = mktime(23, 59, 59, $month, $nday, $year);
if ($date == $this->date) $output .= " <TD ALIGN=\"center\" BGCOLOR=\"#CCCCCC\"><B>$nday</B></TD>\n";
else if ($date > $today) $output .= " <TD ALIGN=\"center\">$nday</TD>\n";
else $output .= " <TD ALIGN=\"center\"><A HREF=\"module.php?mod=blog&name=". urlencode($this->name) ."&date=$date\" STYLE=\"text-decoration: none;\">$nday</A></TD>\n";
// Start every week on a new line:
if ($sday == 6) $output .= " </TR>\n";
// Update temporary variables:
$sday++;
$sday = $sday % 7;
$nday++;
}
// Complete the calendar:
if ($sday) {
$end = 7 - $sday;
$output .= " <TD COLSPAN=\"$end\">&nbsp;</TD>\n </TR>\n";
}
$output .= "</TABLE>\n\n";
// Return calendar:
return $output;
}
}
?>