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

Dries's avatar
   
Dries committed
4
5
6
7
8
/**
 * @file
 * Enables keeping an easily and regularly updated web page or a blog.
 */

Dries's avatar
   
Dries committed
9
/**
10
 * Implementation of hook_node_info().
Dries's avatar
   
Dries committed
11
 */
12
function blog_node_info() {
13
14
15
16
17
18
19
  return array(
    'blog' => array(
      'name' => t('blog entry'),
      'module' => 'blog',
      'description' => t('A blog is a regularly updated journal or diary made up of individual posts shown in reversed chronological order. Each member of the site may create and maintain a blog.'),
    )
  );
Dries's avatar
   
Dries committed
20
21
}

Dries's avatar
   
Dries committed
22
23
24
/**
 * Implementation of hook_perm().
 */
Dries's avatar
   
Dries committed
25
function blog_perm() {
Dries's avatar
   
Dries committed
26
  return array('edit own blog');
Dries's avatar
   
Dries committed
27
28
}

Dries's avatar
   
Dries committed
29
30
31
/**
 * Implementation of hook_access().
 */
Dries's avatar
   
Dries committed
32
33
34
function blog_access($op, $node) {
  global $user;

Dries's avatar
   
Dries committed
35
  if ($op == 'create') {
Dries's avatar
   
Dries committed
36
    return user_access('edit own blog') && $user->uid;
Dries's avatar
   
Dries committed
37
38
  }

Dries's avatar
   
Dries committed
39
40
41
42
  if ($op == 'update' || $op == 'delete') {
    if (user_access('edit own blog') && ($user->uid == $node->uid)) {
      return TRUE;
    }
Dries's avatar
   
Dries committed
43
44
45
  }
}

Dries's avatar
   
Dries committed
46
47
48
/**
 * Implementation of hook_user().
 */
49
function blog_user($type, &$edit, &$user) {
Dries's avatar
   
Dries committed
50
  if ($type == 'view' && user_access('edit own blog', $user)) {
51
52
53
    $items[] = array('title' => t('Blog'),
      'value' => l(t('view recent blog entries'), "blog/$user->uid", array('title' => t("Read %username's latest blog entries.", array('%username' => $user->name)))),
      'class' => 'blog',
54
    );
55
    return array(t('History') => $items);
56
57
58
  }
}

Dries's avatar
   
Dries committed
59
60
61
/**
 * Implementation of hook_help().
 */
Dries's avatar
   
Dries committed
62
63
function blog_help($section) {
  switch ($section) {
Dries's avatar
   
Dries committed
64
    case 'admin/help#blog':
65
66
      $output = '<p>'. t('The blog module allows registered users to maintain an online weblog (commonly known as a blog), often referred to as an online journal or diary. Blogs are made up of individual posts that are time stamped and are typically viewed by date as you would a diary. Blogs often contain links to webpages users have read and/or agree/disagree with.') .'</p>';
      $output .= '<p>'. t('The blog module adds a <em>user blogs</em> navigation link to the site, which takes any visitor to a page that displays the most recent blog entries from all the users on the site. The navigation menu has a <em>create a blog entry</em> link (which takes you to a submission form) and a <em>view personal blog</em> link (which displays your blog entries as other people will see them). The blog module also creates a <em>recent blog posts</em> block that can be enabled.') .'</p>';
67
68
69
      $output .= '<p>'. t('If a user has the ability to post blogs, then the import module (news aggregator) will display a blog-it link next to each news item in its lists. Clicking on this takes the user to the blog submission form, with the title, a link to the item, and a link to the source into the body text already in the text box, ready for the user to add a comment or explanation. This actively encourages people to add blog entries about things they see and hear elsewhere in the website and from your syndicated partner sites.') .'</p>';
      $output .= t('<p>You can</p>
<ul>
70
71
72
73
74
<li>read your blog via your user profile at <a href="@user">my account</a>.</li>
<li>post a blog at <a href="@node-add-blog">create content &gt;&gt; personal blog entry</a>.</li>
<li>administer blog at <a href="@admin-node-configure-types-blog">administer &gt;&gt; content management &gt;&gt; content types &gt;&gt; blog entry</a>.</li>
<li>administer blog api at <a href="@admin-settings-blogapi">administer &gt;&gt; site configuration &gt;&gt; blog APIs</a>.</li>
<li>enable the "recent blog posts" block at <a href="@admin-block">administer &gt;&gt; site building &gt;&gt; blocks</a> to show the 10 most recent blog posts.</li>
75
</ul>
76
77
', array('@user' => url('user'), '@node-add-blog' => url('node/add/blog'), '@admin-node-configure-types-blog' => url('admin/content/types/blog'), '@admin-settings-blogapi' => url('admin/settings/blogapi'), '@admin-block' => url('admin/build/block')));
      $output .= '<p>'. t('For more information please read the configuration and customization handbook <a href="@blog">Blog page</a>.', array('@blog' => 'http://drupal.org/handbook/modules/blog/')) .'</p>';
78
      return $output;
79
    case 'admin/settings/modules#description':
Dries's avatar
   
Dries committed
80
      return t('Enables keeping an easily and regularly updated web page or a blog.');
Dries's avatar
   
Dries committed
81
  }
Dries's avatar
   
Dries committed
82
}
Dries's avatar
   
Dries committed
83

Dries's avatar
   
Dries committed
84
85
86
/**
 * Displays an RSS feed containing recent blog entries of a given user.
 */
Dries's avatar
   
Dries committed
87
function blog_feed_user($uid = 0) {
Dries's avatar
   
Dries committed
88
89
  global $user;

Dries's avatar
   
Dries committed
90
  if ($uid) {
Dries's avatar
   
Dries committed
91
    $account = user_load(array('uid' => $uid, 'status' => 1));
Dries's avatar
   
Dries committed
92
93
94
95
96
  }
  else {
    $account = $user;
  }

97
  $result = db_query_range(db_rewrite_sql("SELECT n.nid, n.title, r.teaser, n.created, u.name, u.uid FROM {node} n INNER JOIN {node_revisions} r ON n.vid = r.vid INNER JOIN {users} u ON n.uid = u.uid WHERE n.type = 'blog' AND u.uid = %d AND n.status = 1 ORDER BY n.created DESC"), $uid, 0, variable_get('feed_default_items', 10));
Dries's avatar
   
Dries committed
98
  $channel['title'] = $account->name ."'s blog";
99
  $channel['link'] = url("blog/$uid", NULL, NULL, TRUE);
Dries's avatar
   
Dries committed
100
  $channel['description'] = $term->description;
Dries's avatar
   
Dries committed
101
  node_feed($result, $channel);
Dries's avatar
   
Dries committed
102
103
}

Dries's avatar
   
Dries committed
104
105
106
/**
 * Displays an RSS feed containing recent blog entries of all users.
 */
Dries's avatar
   
Dries committed
107
function blog_feed_last() {
108
  $result = db_query_range(db_rewrite_sql("SELECT n.nid, n.title, r.teaser, n.created, u.name, u.uid FROM {node} n INNER JOIN {node_revisions} r ON n.vid = r.vid INNER JOIN {users} u ON n.uid = u.uid WHERE n.type = 'blog' AND n.status = 1 ORDER BY n.created DESC"), 0, variable_get('feed_default_items', 10));
Dries's avatar
   
Dries committed
109
  $channel['title'] = variable_get('site_name', 'drupal') .' blogs';
110
  $channel['link'] = url('blog', NULL, NULL, TRUE);
Dries's avatar
   
Dries committed
111
  $channel['description'] = $term->description;
Dries's avatar
   
Dries committed
112
  node_feed($result, $channel);
Dries's avatar
   
Dries committed
113
114
}

Dries's avatar
   
Dries committed
115
/**
Dries's avatar
Dries committed
116
 * Menu callback; displays a Drupal page containing recent blog entries.
Dries's avatar
   
Dries committed
117
 */
Dries's avatar
Dries committed
118
119
120
121
function blog_page($a = NULL, $b = NULL) {

  if (is_numeric($a)) { // $a is a user ID
    if ($b == 'feed') {
122
      return blog_feed_user($a);
Dries's avatar
Dries committed
123
124
    }
    else {
125
      return blog_page_user($a);
Dries's avatar
Dries committed
126
127
128
    }
  }
  else if ($a == 'feed') {
129
    return blog_feed_last();
Dries's avatar
   
Dries committed
130
131
  }
  else {
132
    return blog_page_last();
Dries's avatar
   
Dries committed
133
134
135
136
137
138
  }
}

/**
 * Displays a Drupal page containing recent blog entries of a given user.
 */
Dries's avatar
   
Dries committed
139
function blog_page_user($uid) {
140
141
  global $user;

Dries's avatar
   
Dries committed
142
  $account = user_load(array((is_numeric($uid) ? 'uid' : 'name') => $uid, 'status' => 1));
Dries's avatar
   
Dries committed
143

144
  if ($account->uid) {
145
    drupal_set_title($title = t("@name's blog", array('@name' => $account->name)));
146
147
148
149
150
151
152
153
154
155
156
157
158
159

    if (($account->uid == $user->uid) && user_access('edit own blog')) {
      $output = '<li>'. l(t('Post new blog entry.'), "node/add/blog") .'</li>';
    }
    else if ($account->uid == $user->uid) {
      $output = '<li>'. t('You are not allowed to post a new blog entry.') .'</li>';
    }

    if ($output) {
      $output = '<ul>'. $output .'</ul>';
    }
    else {
      $output = '';
    }
Dries's avatar
   
Dries committed
160

161
    $result = pager_query(db_rewrite_sql("SELECT n.nid, n.sticky, n.created FROM {node} n WHERE type = 'blog' AND n.uid = %d AND n.status = 1 ORDER BY n.sticky DESC, n.created DESC"), variable_get('default_nodes_main', 10), 0, NULL, $account->uid);
162
    while ($node = db_fetch_object($result)) {
163
      $output .= node_view(node_load($node->nid), 1);
164
165
    }
    $output .= theme('pager', NULL, variable_get('default_nodes_main', 10));
drumm's avatar
drumm committed
166
    drupal_add_feed(url('blog/'. $account->uid .'/feed'), t('RSS - !title', array('!title' => $title)));
Dries's avatar
   
Dries committed
167

Dries's avatar
   
Dries committed
168
    return $output;
169
170
171
172
  }
  else {
    drupal_not_found();
  }
Dries's avatar
   
Dries committed
173
174
}

Dries's avatar
   
Dries committed
175
176
177
/**
 * Displays a Drupal page containing recent blog entries of all users.
 */
Dries's avatar
Dries committed
178
function blog_page_last() {
Dries's avatar
   
Dries committed
179
  global $user;
Dries's avatar
   
Dries committed
180

Dries's avatar
   
Dries committed
181
  $output = '';
Dries's avatar
   
Dries committed
182

183
  $result = pager_query(db_rewrite_sql("SELECT n.nid, n.created FROM {node} n WHERE n.type = 'blog' AND n.status = 1 ORDER BY n.sticky DESC, n.created DESC"), variable_get('default_nodes_main', 10));
Dries's avatar
   
Dries committed
184

Dries's avatar
   
Dries committed
185
  while ($node = db_fetch_object($result)) {
186
    $output .= node_view(node_load($node->nid), 1);
Dries's avatar
   
Dries committed
187
  }
Dries's avatar
   
Dries committed
188
  $output .= theme('pager', NULL, variable_get('default_nodes_main', 10));
189
  drupal_add_feed(url('blog/feed'), t('RSS - blogs'));
Dries's avatar
   
Dries committed
190

Dries's avatar
   
Dries committed
191
  return $output;
Dries's avatar
   
Dries committed
192
193
}

Dries's avatar
   
Dries committed
194
195
196
/**
 * Implementation of hook_form().
 */
Dries's avatar
   
Dries committed
197
function blog_form(&$node) {
Dries's avatar
   
Dries committed
198
  global $nid;
Dries's avatar
   
Dries committed
199
  $iid = $_GET['iid'];
200
  $type = node_get_types('type', $node);
Dries's avatar
   
Dries committed
201

202

Dries's avatar
   
Dries committed
203
  if (empty($node->body)) {
Dries's avatar
   
Dries committed
204
205
206
207
208
    /*
    ** If the user clicked a "blog it" link, we load the data from the
    ** database and quote it in the blog:
    */

209
    if ($nid && $blog = node_load($nid)) {
Dries's avatar
   
Dries committed
210
      $node->body = '<em>'. $blog->body .'</em> ['. l($blog->name, "node/$nid") .']';
Dries's avatar
   
Dries committed
211
212
    }

213
    if ($iid && $item = db_fetch_object(db_query('SELECT i.*, f.title as ftitle, f.link as flink FROM {aggregator_item} i, {aggregator_feed} f WHERE i.iid = %d AND i.fid = f.fid', $iid))) {
214
      $node->title = $item->title;
215
216
      // Note: $item->description has been validated on aggregation.
      $node->body = '<a href="'. check_url($item->link) .'">'. check_plain($item->title) .'</a> - <em>'. $item->description .'</em> [<a href="'. check_url($item->flink) .'">'. check_plain($item->ftitle) ."</a>]\n";
Dries's avatar
   
Dries committed
217
    }
218

Dries's avatar
   
Dries committed
219
  }
Dries's avatar
   
Dries committed
220

221
222
  $form['title'] = array('#type' => 'textfield', '#title' => check_plain($type->title_label), '#required' => TRUE, '#default_value' => $node->title, '#weight' => -5);
  $form['body_filter']['body'] = array('#type' => 'textarea', '#title' => check_plain($type->body_label), '#default_value' => $node->body, '#rows' => 20, '#required' => TRUE);
223
  $form['body_filter']['filter'] = filter_form($node->format);
224
  return $form;
Dries's avatar
   
Dries committed
225
226
}

Dries's avatar
   
Dries committed
227
228
229
/**
 * Implementation of hook_view().
 */
230
function blog_view($node, $teaser = FALSE, $page = FALSE) {
Dries's avatar
   
Dries committed
231
  if ($page) {
Dries's avatar
   
Dries committed
232
    // Breadcrumb navigation
Dries's avatar
   
Dries committed
233
    $breadcrumb[] = array('path' => 'blog', 'title' => t('blogs'));
234
    $breadcrumb[] = array('path' => 'blog/'. $node->uid, 'title' => t("@name's blog", array('@name' => $node->name)));
Dries's avatar
   
Dries committed
235
236
    $breadcrumb[] = array('path' => 'node/'. $node->nid);
    menu_set_location($breadcrumb);
Dries's avatar
   
Dries committed
237
  }
238
  return node_prepare($node, $teaser);
Dries's avatar
   
Dries committed
239
240
}

Dries's avatar
   
Dries committed
241
242
243
/**
 * Implementation of hook_link().
 */
244
function blog_link($type, $node = NULL, $teaser = FALSE) {
Dries's avatar
   
Dries committed
245
246
  $links = array();

Dries's avatar
   
Dries committed
247
  if ($type == 'node' && $node->type == 'blog') {
248
    if (arg(0) != 'blog' || arg(1) != $node->uid) {
249
      $links['blog_usernames_blog'] = array(
250
        'title' => t("@username's blog", array('@username' => $node->name)),
251
252
        'href' => "blog/$node->uid",
        'attributes' => array('title' => t("Read %username's latest blog entries.", array('%username' => $node->name)))
253
      );
Dries's avatar
   
Dries committed
254
    }
Dries's avatar
   
Dries committed
255
256
  }

Dries's avatar
   
Dries committed
257
  return $links;
Dries's avatar
   
Dries committed
258
259
}

Dries's avatar
   
Dries committed
260
261
262
/**
 * Implementation of hook_menu().
 */
Dries's avatar
   
Dries committed
263
function blog_menu($may_cache) {
Dries's avatar
   
Dries committed
264
265
  global $user;
  $items = array();
Dries's avatar
   
Dries committed
266
267
268
269
270
271
272
273

  if ($may_cache) {
    $items[] = array('path' => 'node/add/blog', 'title' => t('blog entry'),
      'access' => user_access('edit own blog'));
    $items[] = array('path' => 'blog', 'title' => t('blogs'),
      'callback' => 'blog_page',
      'access' => user_access('access content'),
      'type' => MENU_SUGGESTED_ITEM);
Dries's avatar
Dries committed
274
275
    $items[] = array('path' => 'blog/'. $user->uid, 'title' => t('my blog'),
      'access' => user_access('edit own blog'),
276
      'type' => MENU_DYNAMIC_ITEM);
Dries's avatar
   
Dries committed
277
278
  }

Dries's avatar
   
Dries committed
279
280
281
  return $items;
}

Dries's avatar
   
Dries committed
282
283
284
285
286
287
/**
 * Implementation of hook_block().
 *
 * Displays the most recent 10 blog titles.
 */
function blog_block($op = 'list', $delta = 0) {
Dries's avatar
   
Dries committed
288
  global $user;
Dries's avatar
   
Dries committed
289
  if ($op == 'list') {
Dries's avatar
   
Dries committed
290
    $block[0]['info'] = t('Recent blog posts');
Dries's avatar
   
Dries committed
291
    return $block;
Dries's avatar
   
Dries committed
292
  }
293
  else if ($op == 'view') {
Dries's avatar
   
Dries committed
294
    if (user_access('access content')) {
295
296
297
298
299
300
301
      $result = db_query_range(db_rewrite_sql("SELECT n.nid, n.title, n.created FROM {node} n WHERE n.type = 'blog' AND n.status = 1 ORDER BY n.created DESC"), 0, 10);
      if (db_num_rows($result)) {
        $block['content'] = node_title_list($result);
        $block['content'] .= '<div class="more-link">'. l(t('more'), 'blog', array('title' => t('Read the latest blog entries.'))) .'</div>';
        $block['subject'] = t('Recent blog posts');
        return $block;
      }
302
    }
Dries's avatar
   
Dries committed
303
304
  }
}