blog.module 15 KB
Newer Older
Dries's avatar
 
Dries committed
1
<?php
2
// $Id$
Dries's avatar
 
Dries committed
3

4
function blog_system($field){
5
  $system["description"] = t("Enables keeping a blog or easily and regularly updated web page.");
6 7 8 9
  return $system[$field];
}


Dries's avatar
 
Dries committed
10
function blog_conf_options() {
Dries's avatar
 
Dries committed
11 12 13
  $output = form_textarea(t("Explanation or submission guidelines"), "blog_help", variable_get("blog_help", ""), 55, 4, t("This text is displayed at the top of the blog submission form.  It's useful for helping or instructing your users."));
  $words = t("words");
  $output .= form_select(t("Minimum number of words in a blog entry"), "minimum_blog_size", variable_get("minimum_blog_size", 0), array(0 => "0 $words", 10 => "10 $words", 25 => "25 $words",  50 => "50 $words", 75 => "75 $words", 100 => "100 $words", 125 => "125 $words",  150 => "150 $words", 175 => "175 $words", 200 => "200 $words"), t("The minimum number of words a personal blog entry should contain.  This is useful to rule out submissions that do not meet the site's standards, such as short test posts."));
Dries's avatar
 
Dries committed
14

15
  return $output;
Dries's avatar
 
Dries committed
16 17
}

Dries's avatar
 
Dries committed
18 19 20
function blog_node($field) {
  global $user;

Dries's avatar
 
Dries committed
21
  $info["name"] = t("personal blog entry");
22
  $info["description"] = t("A blog is a regularly updated web page that is similar to a diary -- that (generally) anyone in the world can see.  It is made up of individual entries, often called posts, that are time stamped and typically arranged by the day, with the newest on top (a diary is the reverse).  Blogs often contain links to things you've seen, or on which you agree/disagree.   Some blogs also contain original material written solely for the blog.  Since a Blog is personal, you and only you have full control on what you publish.  The most interesting blog entries or those blog entries that fit the site's topic well might get promoted to the front page by the community or the people with access to do this.");
Dries's avatar
 
Dries committed
23 24 25 26 27 28 29 30

  return $info[$field];
}

function blog_access($op, $node) {
  global $user;

  if ($op == "view") {
Dries's avatar
 
Dries committed
31
    return $node->status;
Dries's avatar
 
Dries committed
32 33 34 35 36 37 38
  }

  if ($op == "create") {
    return $user->uid;
  }

  if ($op == "update") {
Dries's avatar
 
Dries committed
39
    return ($user->uid == $node->uid);
Dries's avatar
 
Dries committed
40 41 42
  }

  if ($op == "delete") {
Dries's avatar
 
Dries committed
43
    return ($user->uid == $node->uid);
Dries's avatar
 
Dries committed
44 45 46 47
  }

}

48 49 50 51
function blog_user($type, &$edit, &$user) {
  switch ($type) {
    case "view_public":
    case "view_private":
Dries's avatar
 
Dries committed
52
      return form_item(t("Blog"), lm(t("view recent entries"), array("mod" => "blog", "id" => $user->uid), "", array("title" => t("View recent blog entries."))) ."<br />". lm(t("view all entries"), array("mod" => "blog", "id" => $user->uid, "all" => 1), "", array("title" => t("View all blog entries."))));
53 54 55
  }
}

Dries's avatar
 
Dries committed
56 57 58 59 60 61
function blog_save($op, $node) {
  if ($op == "approve") {
    return array("promote" => 1);
  }

  if ($op == "create") {
Dries's avatar
 
Dries committed
62
    if (user_access("administer nodes")) {
63
      return array("body" => filter($node->body), "teaser" => filter($node->teaser));
Dries's avatar
 
Dries committed
64 65 66 67
    }
    else {
      return array("body" => filter($node->body), "promote" => 0, "moderate" => 1, "status" => 1, "teaser" => filter($node->teaser));
    }
Dries's avatar
 
Dries committed
68 69 70 71 72 73 74
  }

  if ($op == "decline") {
    return array("promote" => 0);
  }

  if ($op == "update") {
Dries's avatar
 
Dries committed
75
    if (user_access("administer nodes")) {
Dries's avatar
 
Dries committed
76
      /*
Dries's avatar
 
Dries committed
77 78
      ** When an administrator updates blog entries through the admin
      ** pages, they will not be changed unless explicitly specified.
Dries's avatar
 
Dries committed
79 80
      */

81
      return array("body" => filter($node->body), "teaser" => filter($node->teaser));
Dries's avatar
 
Dries committed
82
    }
Dries's avatar
 
Dries committed
83
    else {
Dries's avatar
 
Dries committed
84
      /*
Dries's avatar
 
Dries committed
85 86
      ** Updating your own blog entry will demote it (if promoted),
      ** and will queue it in the moderation queue for promotion.
Dries's avatar
 
Dries committed
87 88
      */

Dries's avatar
 
Dries committed
89
      return array("body" => filter($node->body), "promote" => 0, "moderate" => 1, "score" => 0, "teaser" => filter($node->teaser), "votes" => 0, "users" => 0);
Dries's avatar
 
Dries committed
90
    }
Dries's avatar
 
Dries committed
91 92 93 94
  }

}

Dries's avatar
 
Dries committed
95

Dries's avatar
 
Dries committed
96 97
function blog_help() {
 ?>
Dries's avatar
 
Dries committed
98 99 100 101
  <p>Drupal's blog module allows registered users to maintain an online blog, often referred to as an online journal or diary.  They 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.  It is made up of individual entries that are timestamped and are typically viewed by day as you would a diary.  Blogs often contain links to things you've seen, or agree/disagree with.  A typical example of a long term blog can be seen at <a href="http://www.scripting.com/">http://www.scripting.com/</a>.</p>
  <p>The blog module adds a couple of menu options.  Everyone gets to see the "latest blogs", a page that displays the most recent blog entries from every participant.  If you are logged in, your personal menu also has "submit a blog" link which will lead you to a submission form.  You are also presented a "view personal blog" menu option that displays your blog entries as other people will see it.  For you only, there is an edit link at the bottom left of a page that lets you edit or delete old entries.</p>
  <p>Both in the import module (news aggregator) and the blog module displays glyphs that looks like a pinboard stickit note.  Click on this and you are taken to the blog submission form.  The system helpfully copies the title, a link to the item, and a link to the source into the body text ready for you to add your explanation.  This actively encourages people to add blog entries about things they see and hear elsewhere in the Drupal site.</p>
  <p>For Drupal administrators a blog entry is just another node that can be administered from the "content management" page in the administration pages.</p>
Dries's avatar
 
Dries committed
102 103 104
 <?php
}

Dries's avatar
 
Dries committed
105
function blog_feed_user($uid = 0, $date = 0) {
Dries's avatar
 
Dries committed
106 107
  global $user;

Dries's avatar
 
Dries committed
108 109 110 111 112 113 114 115 116 117
  if ($uid) {
    $account = user_load(array("uid" => $uid, "status" => 1));
  }
  else {
    $account = $user;
  }

  if (!$date) {
    $date = time();
  }
Dries's avatar
 
Dries committed
118

Dries's avatar
 
Dries committed
119
  $result = db_query("SELECT n.nid, n.title, n.teaser, n.created, u.name, u.uid FROM node n LEFT JOIN users u ON n.uid = u.uid WHERE n.type = 'blog' AND u.uid = '$uid' AND n.created > '". ($date - 2592000) ."' ORDER BY n.nid DESC LIMIT 15");
Dries's avatar
 
Dries committed
120
  while ($blog = db_fetch_object($result)) {
Dries's avatar
 
Dries committed
121
    $items .= format_rss_item($blog->title, path_uri() . drupal_url(array("id" => $blog->nid)), $blog->teaser);
Dries's avatar
 
Dries committed
122 123
  }

Dries's avatar
 
Dries committed
124
  $output .= "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n";
Dries's avatar
 
Dries committed
125
  // $output .= "<!DOCTYPE rss [<!ENTITY % HTMLlat1 PUBLIC \"-//W3C//ENTITIES Latin 1 for XHTML//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent\">\n";
Dries's avatar
 
Dries committed
126
  $output .= "<rss version=\"0.91\">\n";
Dries's avatar
 
Dries committed
127
  $output .= format_rss_channel("$account->name's blog", path_uri() . drupal_url(array("mod" => "blog", "op" => "view", "id" => $account->uid), "module"), "$account->name's blog", $items);
Dries's avatar
 
Dries committed
128 129
  $output .= "</rss>\n";

Dries's avatar
 
Dries committed
130 131
  header("Content-Type: text/xml");

Dries's avatar
 
Dries committed
132 133 134 135 136
  print $output;

}

function blog_feed_last() {
Dries's avatar
 
Dries committed
137 138
  $result = db_query("SELECT n.nid, n.title, n.teaser, n.created, u.name, u.uid FROM node n LEFT JOIN users u ON n.uid = u.uid WHERE n.type = 'blog' ORDER BY n.nid DESC LIMIT 15");

Dries's avatar
 
Dries committed
139
  while ($blog = db_fetch_object($result)) {
Dries's avatar
 
Dries committed
140
    $items .= format_rss_item($blog->title, path_uri() . drupal_url(array("id" => $blog->nid)), $blog->teaser);
Dries's avatar
 
Dries committed
141 142 143 144
  }

  $output .= "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n";
  $output .= "<rss version=\"0.91\">\n";
Dries's avatar
 
Dries committed
145
  $output .= format_rss_channel(variable_get("site_name", "drupal") .": user blogs", path_uri() . drupal_url(array("mod" => "blog"), "module"), "Recently updated blogs.", $items);
Dries's avatar
 
Dries committed
146 147
  $output .= "</rss>\n";

Dries's avatar
 
Dries committed
148 149
  header("Content-Type: text/xml");

Dries's avatar
 
Dries committed
150 151 152 153
  print $output;

}

Dries's avatar
 
Dries committed
154
function blog_page_user($uid = 0, $date = 0, $all = 0) {
Dries's avatar
 
Dries committed
155 156
  global $theme, $user;

Dries's avatar
 
Dries committed
157 158 159 160 161 162
  if ($uid) {
    $account = user_load(array("uid" => $uid, "status" => 1));
  }
  else {
    $account = $user;
  }
Dries's avatar
 
Dries committed
163

Dries's avatar
 
Dries committed
164 165 166 167
  if (!$date) {
    $date = time();
  }

Dries's avatar
 
Dries committed
168
  $result = db_query("SELECT nid FROM node WHERE type = 'blog' AND uid = '$account->uid' AND created <= '$date' ORDER BY nid DESC". ($all ? "" : " LIMIT 20"));
Dries's avatar
 
Dries committed
169

Dries's avatar
 
Dries committed
170
  $output .= "<table border=\"0\" cellpadding=\"4\" cellspacing=\"4\">";
Dries's avatar
 
Dries committed
171

Dries's avatar
 
Dries committed
172 173 174
  while ($node = db_fetch_object($result)) {

    $blog = node_load(array("nid" => $node->nid));
Dries's avatar
 
Dries committed
175

Dries's avatar
 
Dries committed
176 177
    if ($date != date("dny", $blog->created)) {
      $date = date("dny", $blog->created);
Kjartan's avatar
Kjartan committed
178
      $output .= "<tr><td colspan=\"3\"><b>". lm(format_date($blog->created, "small", "d M Y"), array("mod" => "blog", "id" => $blog->uid, "date" => mktime(23, 59, 59, date("n", $blog->created), date("d", $blog->created), date("Y", $blog->created))), "", array("title" => t("Permanent link to this date."))) ."</b></td></tr>";
Dries's avatar
 
Dries committed
179 180
    }

Dries's avatar
 
Dries committed
181
    $links = link_node($blog, 1);
Dries's avatar
 
Dries committed
182

Dries's avatar
 
Dries committed
183
    $output .= "<tr><td><div style=\"margin-left: 20px;\"><b>". check_output($blog->title) ."</b></div></td><td align=\"right\">". $theme->links($links) ."</td><td>". l('<img src="misc/blog.gif" width="12" height="16" border="0" align="top">', array("id" => $node->nid), "node", "", array("title" => t("Permanent link to this blog entry."))) ."</td></tr>";
Kjartan's avatar
Kjartan committed
184
    $output .= "<tr><td colspan=\"3\"><div style=\"margin-left: 40px;\">". check_output($blog->teaser, 1) ."</div><br /></td></tr>";
Dries's avatar
 
Dries committed
185

Dries's avatar
 
Dries committed
186
  }
Dries's avatar
 
Dries committed
187

Dries's avatar
 
Dries committed
188
  $output .= "</table>";
Kjartan's avatar
Kjartan committed
189
  $output .= lm("<img src=\"". $theme->image("xml.gif") ."\" width=\"36\" height=\"14\" align=\"right\" border=\"0\" />", array("mod" => "blog", "op" => "feed", "id" => $account->uid), "", array("title" => t("Read the XML version of this page."))) ."\n";
190
  if (!$all && $date) {
Dries's avatar
 
Dries committed
191
    $output .= lm(t("show all blogs"), array("mod" => "blog", "op" => "view", "id" => $account->uid, "all" => 1), "", array("title" => t("Show all blogs by this user.")));
Dries's avatar
 
Dries committed
192 193
  }
  else {
Dries's avatar
 
Dries committed
194
    $output .= lm(t("show recent blogs"), array("mod" => "blog", "op" => "view", "id" => $account->uid), "", array("title" => t("Show recent blogs by this user.")));
Dries's avatar
 
Dries committed
195
  }
Dries's avatar
 
Dries committed
196

Dries's avatar
 
Dries committed
197
  $theme->box(t("%username's blog", array("%username" => $account->name)), $output);
Dries's avatar
 
Dries committed
198 199
}

Dries's avatar
Dries committed
200
function blog_page_last() {
Dries's avatar
 
Dries committed
201
  global $theme, $user;
Dries's avatar
 
Dries committed
202

Dries's avatar
 
Dries committed
203
  $result = db_query("SELECT nid FROM node WHERE type = 'blog' ORDER BY nid DESC LIMIT 20");
Dries's avatar
 
Dries committed
204

Dries's avatar
 
Dries committed
205
  $output .= "<table border=\"0\" cellpadding=\"4\" cellspacing=\"4\">";
Dries's avatar
 
Dries committed
206

Dries's avatar
 
Dries committed
207 208
  while ($node = db_fetch_object($result)) {
    $blog = node_load(array("nid" => $node->nid));
Dries's avatar
 
Dries committed
209

Dries's avatar
 
Dries committed
210
    $links = link_node($blog, 1);
Dries's avatar
 
Dries committed
211

212 213
    $output .= "<tr><td><b>". check_output($blog->title) ."</b></td><td align=\"right\">". $theme->links($links) ."</td><td>". l('<img src="misc/blog.gif" width="12" height="16" border="0" align="top">', array("id" => $node->nid), "node", "", array("title" => t("Permanent link to this blog entry"))) ."</td></tr>";
    $output .= "<tr><td colspan=\"3\"><div style=\"margin-left: 20px;\">". check_output($blog->teaser, 1) ."</div><br /></td></tr>";
Dries's avatar
 
Dries committed
214
  }
Dries's avatar
 
Dries committed
215

Dries's avatar
 
Dries committed
216
  $output .= "</table>";
Kjartan's avatar
Kjartan committed
217
  $output .= lm("<img src=\"". $theme->image("xml.gif") ."\" width=\"36\" height=\"14\" align=\"right\" border=\"0\" />", array("mod" => "blog", "op" => "feed"), "", array("title" => t("Read the XML version of this page."))) ."\n";
Dries's avatar
 
Dries committed
218

Dries's avatar
 
Dries committed
219
  $theme->box(t("User blogs"), $output, "main");
Dries's avatar
 
Dries committed
220 221
}

222
function blog_form(&$node, &$help, &$error) {
Dries's avatar
 
Dries committed
223 224
  global $nid, $iid;

Dries's avatar
 
Dries committed
225 226 227 228 229 230 231
  if (isset($node->body)) {

    /*
    ** Validate the size of the blog:
    */

    if (count(explode(" ", $node->body)) < variable_get("minimum_blog_size", 0)) {
Dries's avatar
 
Dries committed
232
      $error["body"] = theme_invoke("theme_error", t("The body of your blog is too short."));
Dries's avatar
 
Dries committed
233 234 235
    }
  }
  else {
Dries's avatar
 
Dries committed
236 237 238 239 240 241 242 243 244 245 246 247

    /*
    ** Carry out some explanation or submission guidelines:
    */

    $help = variable_get("blog_help", "");

    /*
    ** If the user clicked a "blog it" link, we load the data from the
    ** database and quote it in the blog:
    */

Dries's avatar
 
Dries committed
248
    if ($nid && $blog = node_load(array("nid" => $nid))) {
Dries's avatar
 
Dries committed
249
      $node->body = "<i>". $blog->body ."</i> [".lm($blog->name, array("mod" => "blog", "id" => $blog->uid, "date" => $blog->created))."]";
Dries's avatar
 
Dries committed
250 251
    }

Dries's avatar
 
Dries committed
252
    if ($iid && $item = db_fetch_object(db_query("SELECT i.*, f.title as ftitle, f.link as flink FROM item i, feed f WHERE i.iid = '%s' AND i.fid = f.fid", $iid))) {
253
      $node->title = $item->title;
Dries's avatar
 
Dries committed
254
      $node->body = "<a href=\"$item->link\">$item->title</a> - <i>". check_output($item->description) ."</i> [<a href=\"$item->flink\">$item->ftitle</a>]\n";
Dries's avatar
 
Dries committed
255 256
    }
  }
Dries's avatar
 
Dries committed
257

Dries's avatar
 
Dries committed
258 259 260 261
  if ($node->teaser) {
    $output .= form_textarea(t("Teaser"), "teaser", $node->teaser, 60, 5, $error["teaser"]);
  }

262
  if (function_exists("taxonomy_node_form")) {
Kjartan's avatar
Kjartan committed
263
    $output .= implode("", taxonomy_node_form("blog", $node));
264
  }
Dries's avatar
 
Dries committed
265

Dries's avatar
 
Dries committed
266
  $output .= form_textarea(t("Body"), "body", $node->body, 60, 15, $error["body"] ? $error["body"] : t("Allowed HTML tags") .": ". htmlspecialchars(variable_get("allowed_html", "")));
Dries's avatar
 
Dries committed
267

Dries's avatar
 
Dries committed
268
  return $output;
Dries's avatar
 
Dries committed
269 270 271 272
}


function blog_page() {
273
  global $theme, $id, $op, $date, $all, $name;
Dries's avatar
Dries committed
274

Dries's avatar
 
Dries committed
275
  if (user_access("access content")) {
Dries's avatar
 
Dries committed
276 277
    switch ($op) {
      case "feed":
Dries's avatar
 
Dries committed
278 279
        if ($id) {
          blog_feed_user($id, $date);
Dries's avatar
 
Dries committed
280 281 282 283 284 285
        }
        else {
          blog_feed_last();
        }
        break;
      default:
Dries's avatar
Dries committed
286
        $theme->header();
287 288 289 290
        if ($name) {
          $user = user_load(array("name" => $name));
          $id = $user->uid;
        }
Dries's avatar
 
Dries committed
291
        if ($id) {
Dries's avatar
 
Dries committed
292
          blog_page_user($id, $date, $all);
Dries's avatar
 
Dries committed
293 294 295 296
        }
        else {
          blog_page_last();
        }
Dries's avatar
Dries committed
297
        $theme->footer();
Dries's avatar
 
Dries committed
298 299
    }
  }
Dries's avatar
 
Dries committed
300
  else {
Dries's avatar
Dries committed
301
    $theme->header();
Dries's avatar
Dries committed
302
    $theme->box(t("Access denied"), message_access());
Dries's avatar
Dries committed
303
    $theme->footer();
Dries's avatar
 
Dries committed
304
  }
Dries's avatar
Dries committed
305

Dries's avatar
 
Dries committed
306 307
}

Dries's avatar
 
Dries committed
308
function blog_link($type, $node = 0, $main) {
Dries's avatar
 
Dries committed
309 310
  global $user;

Dries's avatar
 
Dries committed
311
  if ($type == "page" && user_access("access content")) {
Kjartan's avatar
Kjartan committed
312
    $links[] = lm(t("user blogs"), array("mod" => "blog"), "", array("title" => t("Read the latest blog entries.")));
Dries's avatar
 
Dries committed
313 314
  }

Dries's avatar
 
Dries committed
315
  if ($type == "menu.create" && user_access("post content")) {
Kjartan's avatar
Kjartan committed
316
    $links[] = lm(t("create blog entry"), array("mod" => "node", "op" => "add", "type" => "blog"), "", array("title" => t("Add a new personal blog entry.")));
Dries's avatar
 
Dries committed
317 318 319
  }

  if ($type == "menu.view" && user_access("access content")) {
Kjartan's avatar
Kjartan committed
320
    $links[] = lm(t("view personal blog"), array("mod" => "blog", "op" => "view", "id" => $user->uid), "", array("title" => t("Read your latest blog entries.")));
Dries's avatar
 
Dries committed
321 322
  }

Dries's avatar
 
Dries committed
323
  if ($type == "node" && $node->type == "blog") {
324
    global $mod, $op, $id;
Dries's avatar
 
Dries committed
325
    if (blog_access("update", $node)) {
Kjartan's avatar
Kjartan committed
326
      $links[] = lm(t("edit this blog"), array("mod" => "node", "op" => "edit", "id" => $node->nid), "", array("title" => t("Edit this blog entry.")));
Dries's avatar
 
Dries committed
327
    }
328
    elseif ($op != "view" && !$id) {
Dries's avatar
 
Dries committed
329
      $links[] = lm(t("%username's blog", array("%username" => $node->name)), array("mod" => "blog", "op" => "view", "id" => $node->uid), "", array("title" => t("Read %username's latest blog entries.", array("%username" => $node->name))));
Dries's avatar
 
Dries committed
330
    }
Dries's avatar
 
Dries committed
331 332
  }

Dries's avatar
 
Dries committed
333 334 335
  return $links ? $links : array();
}

Dries's avatar
 
Dries committed
336
function blog_block($op = "list", $delta = 0) {
Dries's avatar
 
Dries committed
337
  global $user;
Dries's avatar
 
Dries committed
338 339 340 341 342 343 344 345
  if ($op == "list") {
    $blocks[0]["info"] = t("User blogs");
    return $blocks;
  }
  else {
    if (user_access("access content")) {
      $result = db_query("SELECT u.uid, u.name, n.created, n.title, n.nid FROM node n LEFT JOIN users u ON n.uid = u.uid WHERE n.type = 'blog' ORDER BY n.nid DESC LIMIT 10");
      while ($node = db_fetch_object($result)) {
Dries's avatar
 
Dries committed
346
        $items[] = l(check_output($node->title), array("id" => $node->nid));
Dries's avatar
 
Dries committed
347
      }
Dries's avatar
 
Dries committed
348 349

      $block["content"] = theme_invoke("theme_item_list", $items) ."<br /><div align=\"right\">". lm(t("more"), array("mod" => "blog"), "", array("title" => t("Read the latest blog entries."))) ."</div>";
Dries's avatar
 
Dries committed
350
      $block["subject"] = t("User blogs");
351
    }
Dries's avatar
 
Dries committed
352
    return $block;
Dries's avatar
 
Dries committed
353 354 355
  }
}

Dries's avatar
 
Dries committed
356
?>