moving the onelab www to a fresh location
[plewww.git] / modules / blog.module
1 <?php
2 // $Id: blog.module 144 2007-03-28 07:52:20Z thierry $
3
4 /**
5  * @file
6  * Enables keeping an easily and regularly updated web page or a blog.
7  */
8
9 /**
10  * Implementation of hook_node_info().
11  */
12 function blog_node_info() {
13   return array('blog' => array('name' => t('blog entry'), 'base' => 'blog'));
14 }
15
16 /**
17  * Implementation of hook_perm().
18  */
19 function blog_perm() {
20   return array('edit own blog');
21 }
22
23 /**
24  * Implementation of hook_access().
25  */
26 function blog_access($op, $node) {
27   global $user;
28
29   if ($op == 'create') {
30     return user_access('edit own blog') && $user->uid;
31   }
32
33   if ($op == 'update' || $op == 'delete') {
34     if (user_access('edit own blog') && ($user->uid == $node->uid)) {
35       return TRUE;
36     }
37   }
38 }
39
40 /**
41  * Implementation of hook_user().
42  */
43 function blog_user($type, &$edit, &$user) {
44   if ($type == 'view' && user_access('edit own blog', $user)) {
45     $items[] = array('title' => t('Blog'),
46       'value' => l(t('view recent blog entries'), "blog/$user->uid", array('title' => t("Read %username's latest blog entries.", array('%username' => $user->name)))),
47       'class' => 'blog',
48     );
49     return array(t('History') => $items);
50   }
51 }
52
53 /**
54  * Implementation of hook_help().
55  */
56 function blog_help($section) {
57   switch ($section) {
58     case 'admin/help#blog':
59       $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>';
60       $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>';
61       $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>';
62       $output .= t('<p>You can</p>
63 <ul>
64 <li>read your blog via your user profile at <a href="%user">my account</a>.</li>
65 <li>post a blog at <a href="%node-add-blog">create content &gt;&gt; personal blog entry</a>.</li>
66 <li>administer blog at <a href="%admin-node-configure-types-blog">administer &gt;&gt; settings &gt;&gt; content types &gt;&gt; configure blog entry</a>.</li>
67 <li>administer blog api at <a href="%admin-settings-blogapi">administer &gt;&gt; settings &gt;&gt; blogapi</a>.</li>
68 <li>enable the "recent blog posts" block at <a href="%admin-block">administer &gt;&gt; blocks</a> to show the 10 most recent blog posts.</li>
69 </ul>
70 ', array('%user' => url('user'), '%node-add-blog' => url('node/add/blog'), '%admin-node-configure-types-blog' => url('admin/settings/content-types/blog'), '%admin-settings-blogapi' => url('admin/settings/blogapi'), '%admin-block' => url('admin/block')));
71       $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>';
72       return $output;
73     case 'admin/modules#description':
74       return t('Enables keeping an easily and regularly updated web page or a blog.');
75     case 'node/add#blog':
76       return t("A blog is a regularly updated journal or diary made up of individual posts shown in reversed chronological order.  A blog is tightly coupled to the author so each user will have his 'own' blog.");
77   }
78 }
79
80 /**
81  * Displays an RSS feed containing recent blog entries of a given user.
82  */
83 function blog_feed_user($uid = 0) {
84   global $user;
85
86   if ($uid) {
87     $account = user_load(array('uid' => $uid, 'status' => 1));
88   }
89   else {
90     $account = $user;
91   }
92
93   $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));
94   $channel['title'] = $account->name ."'s blog";
95   $channel['link'] = url("blog/$uid", NULL, NULL, TRUE);
96   $channel['description'] = $term->description;
97   node_feed($result, $channel);
98 }
99
100 /**
101  * Displays an RSS feed containing recent blog entries of all users.
102  */
103 function blog_feed_last() {
104   $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));
105   $channel['title'] = variable_get('site_name', 'drupal') .' blogs';
106   $channel['link'] = url('blog', NULL, NULL, TRUE);
107   $channel['description'] = $term->description;
108   node_feed($result, $channel);
109 }
110
111 /**
112  * Menu callback; displays a Drupal page containing recent blog entries.
113  */
114 function blog_page($a = NULL, $b = NULL) {
115
116   if (is_numeric($a)) { // $a is a user ID
117     if ($b == 'feed') {
118       return blog_feed_user($a);
119     }
120     else {
121       return blog_page_user($a);
122     }
123   }
124   else if ($a == 'feed') {
125     return blog_feed_last();
126   }
127   else {
128     return blog_page_last();
129   }
130 }
131
132 /**
133  * Displays a Drupal page containing recent blog entries of a given user.
134  */
135 function blog_page_user($uid) {
136   global $user;
137
138   $account = user_load(array((is_numeric($uid) ? 'uid' : 'name') => $uid, 'status' => 1));
139
140   if ($account->uid) {
141     drupal_set_title($title = t("%name's blog", array('%name' => $account->name)));
142
143     if (($account->uid == $user->uid) && user_access('edit own blog')) {
144       $output = '<li>'. l(t('Post new blog entry.'), "node/add/blog") .'</li>';
145     }
146     else if ($account->uid == $user->uid) {
147       $output = '<li>'. t('You are not allowed to post a new blog entry.') .'</li>';
148     }
149
150     if ($output) {
151       $output = '<ul>'. $output .'</ul>';
152     }
153     else {
154       $output = '';
155     }
156
157     $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);
158     while ($node = db_fetch_object($result)) {
159       $output .= node_view(node_load($node->nid), 1);
160     }
161     $output .= theme('pager', NULL, variable_get('default_nodes_main', 10));
162     $output .= theme('feed_icon', url("blog/$account->uid/feed"));
163
164     drupal_add_link(array('rel' => 'alternate',
165                           'type' => 'application/rss+xml',
166                           'title' => t('RSS - %title', array('%title' => $title)),
167                           'href' => url("blog/$account->uid/feed")));
168     return $output;
169   }
170   else {
171     drupal_not_found();
172   }
173 }
174
175 /**
176  * Displays a Drupal page containing recent blog entries of all users.
177  */
178 function blog_page_last() {
179   global $user;
180
181   $output = '';
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.created DESC"), variable_get('default_nodes_main', 10));
184
185   while ($node = db_fetch_object($result)) {
186     $output .= node_view(node_load($node->nid), 1);
187   }
188   $output .= theme('pager', NULL, variable_get('default_nodes_main', 10));
189   $output .= theme('feed_icon', url('blog/feed'));
190
191   drupal_add_link(array('rel' => 'alternate',
192                         'type' => 'application/rss+xml',
193                         'title' => t('RSS - blogs'),
194                         'href' => url("blog/feed")));
195   return $output;
196 }
197
198 /**
199  * Implementation of hook_form().
200  */
201 function blog_form(&$node) {
202   global $nid;
203   $iid = $_GET['iid'];
204
205
206   if (empty($node->body)) {
207     /*
208     ** If the user clicked a "blog it" link, we load the data from the
209     ** database and quote it in the blog:
210     */
211
212     if ($nid && $blog = node_load($nid)) {
213       $node->body = '<em>'. $blog->body .'</em> ['. l($blog->name, "node/$nid") .']';
214     }
215
216     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))) {
217       $node->title = $item->title;
218       // Note: $item->description has been validated on aggregation.
219       $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";
220     }
221
222   }
223
224   $form['title'] = array('#type' => 'textfield', '#title' => t('Title'), '#required' => TRUE, '#default_value' => $node->title, '#weight' => -5);
225   $form['body_filter']['body'] = array('#type' => 'textarea', '#title' => t('Body'), '#default_value' => $node->body, '#rows' => 20, '#required' => TRUE);
226   $form['body_filter']['filter'] = filter_form($node->format);
227   return $form;
228 }
229
230 /**
231  * Implementation of hook_view().
232  */
233 function blog_view(&$node, $teaser = FALSE, $page = FALSE) {
234   if ($page) {
235     // Breadcrumb navigation
236     $breadcrumb[] = array('path' => 'blog', 'title' => t('blogs'));
237     $breadcrumb[] = array('path' => 'blog/'. $node->uid, 'title' => t("%name's blog", array('%name' => $node->name)));
238     $breadcrumb[] = array('path' => 'node/'. $node->nid);
239     menu_set_location($breadcrumb);
240   }
241   $node = node_prepare($node, $teaser);
242 }
243
244 /**
245  * Implementation of hook_link().
246  */
247 function blog_link($type, $node = 0, $main = 0) {
248   $links = array();
249
250   if ($type == 'node' && $node->type == 'blog') {
251     if (arg(0) != 'blog' || arg(1) != $node->uid) {
252       $links[] = l(t("%username's blog", array('%username' => $node->name)), "blog/$node->uid", array('title' => t("Read %username's latest blog entries.", array('%username' => $node->name))));
253     }
254   }
255
256   return $links;
257 }
258
259 /**
260  * Implementation of hook_menu().
261  */
262 function blog_menu($may_cache) {
263   global $user;
264   $items = array();
265
266   if ($may_cache) {
267     $items[] = array('path' => 'node/add/blog', 'title' => t('blog entry'),
268       'access' => user_access('edit own blog'));
269     $items[] = array('path' => 'blog', 'title' => t('blogs'),
270       'callback' => 'blog_page',
271       'access' => user_access('access content'),
272       'type' => MENU_SUGGESTED_ITEM);
273     $items[] = array('path' => 'blog/'. $user->uid, 'title' => t('my blog'),
274       'access' => user_access('edit own blog'),
275       'type' => MENU_DYNAMIC_ITEM);
276   }
277
278   return $items;
279 }
280
281 /**
282  * Implementation of hook_block().
283  *
284  * Displays the most recent 10 blog titles.
285  */
286 function blog_block($op = 'list', $delta = 0) {
287   global $user;
288   if ($op == 'list') {
289     $block[0]['info'] = t('Recent blog posts');
290     return $block;
291   }
292   else if ($op == 'view') {
293     if (user_access('access content')) {
294       $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);
295       if (db_num_rows($result)) {
296         $block['content'] = node_title_list($result);
297         $block['content'] .= '<div class="more-link">'. l(t('more'), 'blog', array('title' => t('Read the latest blog entries.'))) .'</div>';
298         $block['subject'] = t('Recent blog posts');
299         return $block;
300       }
301     }
302   }
303 }
304
305