array('name' => t('blog entry'), 'base' => 'blog')); } /** * Implementation of hook_perm(). */ function blog_perm() { return array('edit own blog'); } /** * Implementation of hook_access(). */ function blog_access($op, $node) { global $user; if ($op == 'create') { return user_access('edit own blog') && $user->uid; } if ($op == 'update' || $op == 'delete') { if (user_access('edit own blog') && ($user->uid == $node->uid)) { return TRUE; } } } /** * Implementation of hook_user(). */ function blog_user($type, &$edit, &$user) { if ($type == 'view' && user_access('edit own blog', $user)) { $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', ); return array(t('History') => $items); } } /** * Implementation of hook_help(). */ function blog_help($section) { switch ($section) { case 'admin/help#blog': $output = '

'. 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.') .'

'; $output .= '

'. t('The blog module adds a user blogs 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 create a blog entry link (which takes you to a submission form) and a view personal blog link (which displays your blog entries as other people will see them). The blog module also creates a recent blog posts block that can be enabled.') .'

'; $output .= '

'. 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.') .'

'; $output .= t('

You can

', 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'))); $output .= '

'. t('For more information please read the configuration and customization handbook Blog page.', array('%blog' => 'http://drupal.org/handbook/modules/blog/')) .'

'; return $output; case 'admin/modules#description': return t('Enables keeping an easily and regularly updated web page or a blog.'); case 'node/add#blog': 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."); } } /** * Displays an RSS feed containing recent blog entries of a given user. */ function blog_feed_user($uid = 0) { global $user; if ($uid) { $account = user_load(array('uid' => $uid, 'status' => 1)); } else { $account = $user; } $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)); $channel['title'] = $account->name ."'s blog"; $channel['link'] = url("blog/$uid", NULL, NULL, TRUE); $channel['description'] = $term->description; node_feed($result, $channel); } /** * Displays an RSS feed containing recent blog entries of all users. */ function blog_feed_last() { $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)); $channel['title'] = variable_get('site_name', 'drupal') .' blogs'; $channel['link'] = url('blog', NULL, NULL, TRUE); $channel['description'] = $term->description; node_feed($result, $channel); } /** * Menu callback; displays a Drupal page containing recent blog entries. */ function blog_page($a = NULL, $b = NULL) { if (is_numeric($a)) { // $a is a user ID if ($b == 'feed') { return blog_feed_user($a); } else { return blog_page_user($a); } } else if ($a == 'feed') { return blog_feed_last(); } else { return blog_page_last(); } } /** * Displays a Drupal page containing recent blog entries of a given user. */ function blog_page_user($uid) { global $user; $account = user_load(array((is_numeric($uid) ? 'uid' : 'name') => $uid, 'status' => 1)); if ($account->uid) { drupal_set_title($title = t("%name's blog", array('%name' => $account->name))); if (($account->uid == $user->uid) && user_access('edit own blog')) { $output = '
  • '. l(t('Post new blog entry.'), "node/add/blog") .'
  • '; } else if ($account->uid == $user->uid) { $output = '
  • '. t('You are not allowed to post a new blog entry.') .'
  • '; } if ($output) { $output = ''; } else { $output = ''; } $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); while ($node = db_fetch_object($result)) { $output .= node_view(node_load($node->nid), 1); } $output .= theme('pager', NULL, variable_get('default_nodes_main', 10)); $output .= theme('feed_icon', url("blog/$account->uid/feed")); drupal_add_link(array('rel' => 'alternate', 'type' => 'application/rss+xml', 'title' => t('RSS - %title', array('%title' => $title)), 'href' => url("blog/$account->uid/feed"))); return $output; } else { drupal_not_found(); } } /** * Displays a Drupal page containing recent blog entries of all users. */ function blog_page_last() { global $user; $output = ''; $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)); while ($node = db_fetch_object($result)) { $output .= node_view(node_load($node->nid), 1); } $output .= theme('pager', NULL, variable_get('default_nodes_main', 10)); $output .= theme('feed_icon', url('blog/feed')); drupal_add_link(array('rel' => 'alternate', 'type' => 'application/rss+xml', 'title' => t('RSS - blogs'), 'href' => url("blog/feed"))); return $output; } /** * Implementation of hook_form(). */ function blog_form(&$node) { global $nid; $iid = $_GET['iid']; if (empty($node->body)) { /* ** If the user clicked a "blog it" link, we load the data from the ** database and quote it in the blog: */ if ($nid && $blog = node_load($nid)) { $node->body = ''. $blog->body .' ['. l($blog->name, "node/$nid") .']'; } 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))) { $node->title = $item->title; // Note: $item->description has been validated on aggregation. $node->body = ''. check_plain($item->title) .' - '. $item->description .' ['. check_plain($item->ftitle) ."]\n"; } } $form['title'] = array('#type' => 'textfield', '#title' => t('Title'), '#required' => TRUE, '#default_value' => $node->title, '#weight' => -5); $form['body_filter']['body'] = array('#type' => 'textarea', '#title' => t('Body'), '#default_value' => $node->body, '#rows' => 20, '#required' => TRUE); $form['body_filter']['filter'] = filter_form($node->format); return $form; } /** * Implementation of hook_view(). */ function blog_view(&$node, $teaser = FALSE, $page = FALSE) { if ($page) { // Breadcrumb navigation $breadcrumb[] = array('path' => 'blog', 'title' => t('blogs')); $breadcrumb[] = array('path' => 'blog/'. $node->uid, 'title' => t("%name's blog", array('%name' => $node->name))); $breadcrumb[] = array('path' => 'node/'. $node->nid); menu_set_location($breadcrumb); } $node = node_prepare($node, $teaser); } /** * Implementation of hook_link(). */ function blog_link($type, $node = 0, $main = 0) { $links = array(); if ($type == 'node' && $node->type == 'blog') { if (arg(0) != 'blog' || arg(1) != $node->uid) { $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)))); } } return $links; } /** * Implementation of hook_menu(). */ function blog_menu($may_cache) { global $user; $items = array(); 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); $items[] = array('path' => 'blog/'. $user->uid, 'title' => t('my blog'), 'access' => user_access('edit own blog'), 'type' => MENU_DYNAMIC_ITEM); } return $items; } /** * Implementation of hook_block(). * * Displays the most recent 10 blog titles. */ function blog_block($op = 'list', $delta = 0) { global $user; if ($op == 'list') { $block[0]['info'] = t('Recent blog posts'); return $block; } else if ($op == 'view') { if (user_access('access content')) { $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'] .= ''; $block['subject'] = t('Recent blog posts'); return $block; } } } }