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

4
function blog_system($field){
Kjartan's avatar
Kjartan committed
5
  $system["description"] = t("Enables users to keep a blog or online journal.");
6 7 8 9
  return $system[$field];
}


Dries's avatar
 
Dries committed
10 11
function blog_conf_options() {
 $output .= form_textarea("Explanation or submission guidelines", "blog_help", variable_get("blog_help", ""), 55, 4, "This text will be displayed at the top of the blog submission form.  Useful for helping or instructing your users.");
Dries's avatar
 
Dries committed
12
 $output .= form_select(t("Minimum number of words in a node"), "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 consist of.  This can be useful to rule out submissions that do not meet the site's standards, such as short test posts."));
Dries's avatar
 
Dries committed
13 14 15 16 17

 return $output;

}

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 your personal diary or journal.  It is made up of individual entries that are time stamped and are typically arranged by the day, as normal a diary. Blogs often contain links to things you've seen, or on which you agree/disagree.  Since a Blog is personal, you and only you have full control on what you publish.  The most interesting blogs, or those blogs that fit the site's topic might get promoted to the front page.");
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("%u's blog", array("%u" => $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 233 234 235
      $error["body"] = "<div style=\"color: red;\">". t("The body of your blog is too short.") ."</div>";
    }
  }
  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))) {
Dries's avatar
 
Dries committed
253
      $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
254 255
    }
  }
Dries's avatar
 
Dries committed
256

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

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

Dries's avatar
 
Dries committed
265
  $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
266

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


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

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

Dries's avatar
 
Dries committed
305 306
}

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

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

Dries's avatar
 
Dries committed
314
  if ($type == "menu.create" && user_access("post content")) {
Kjartan's avatar
Kjartan committed
315
    $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
316 317 318
  }

  if ($type == "menu.view" && user_access("access content")) {
Kjartan's avatar
Kjartan committed
319
    $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
320 321
  }

Dries's avatar
 
Dries committed
322
  if ($type == "node" && $node->type == "blog") {
323
    global $mod, $op, $id;
Dries's avatar
 
Dries committed
324
    if (blog_access("update", $node)) {
Kjartan's avatar
Kjartan committed
325
      $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
326
    }
327
    elseif ($op != "view" && !$id) {
Kjartan's avatar
Kjartan committed
328
      $links[] = lm(t("%u's blog", array("%u" => $node->name)), array("mod" => "blog", "op" => "view", "id" => $node->uid), "", array("title" => t("Read %u's latest blog entries.", array("%u" => $node->name))));
Dries's avatar
 
Dries committed
329
    }
Dries's avatar
 
Dries committed
330 331
  }

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

function blog_block() {
Dries's avatar
 
Dries committed
336 337
  global $user;

Dries's avatar
 
Dries committed
338
  $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");
Dries's avatar
 
Dries committed
339

340 341 342 343 344 345
  if (user_access("access content")) {
    while ($node = db_fetch_object($result)) {
      $output .= l(check_output($node->title), array("id" => $node->nid)) ."<br />\n";
    }
    $output .= "<br /><div align=\"right\">".lm(t("more"), array("mod" => "blog"), t("Read the latest blog entries."))."</div>";
    $block[0]["content"] = $output;
Dries's avatar
 
Dries committed
346 347
  }

Dries's avatar
 
Dries committed
348 349

  $block[0]["subject"] = t("User blogs");
Dries's avatar
 
Dries committed
350
  $block[0]["info"] = t("User blogs");
Dries's avatar
 
Dries committed
351
  $block[0]["link"] = drupal_url(array("mod" => "blog"), "module");
Dries's avatar
 
Dries committed
352 353 354 355 356

  return $block;
}

?>