Same filename and directory in other branches
  1. 6.x modules/blog/blog.module
  2. 7.x modules/blog/blog.module

Enables keeping an easily and regularly updated web page or a blog.

File

modules/blog/blog.module
View source
<?php

/**
 * @file
 * Enables keeping an easily and regularly updated web page or a blog.
 */

/**
 * Implementation of hook_node_info().
 */
function blog_node_info() {
  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.'),
    ),
  );
}

/**
 * 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['blog'] = 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 = '<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 web pages 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>';
      $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 .= '<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>';
      return $output;
  }
}

/**
 * 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.created FROM {node} n  WHERE n.type = 'blog' AND n.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.created FROM {node} n 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 {
      if ($a === NULL) {
        return blog_page_last();
      }
    }
  }
  drupal_not_found();
}

/**
 * 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 = '<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 = '';
    }
    $result = pager_query(db_rewrite_sql("SELECT n.nid, n.sticky, n.created FROM {node} n WHERE n.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));
    drupal_add_feed(url('blog/' . $account->uid . '/feed'), t('RSS - !title', array(
      '!title' => $title,
    )));
    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.sticky DESC, 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));
  drupal_add_feed(url('blog/feed'), t('RSS - blogs'));
  return $output;
}

/**
 * Implementation of hook_form().
 */
function blog_form(&$node) {
  global $nid;
  $iid = $_GET['iid'];
  $type = node_get_types('type', $node);
  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 = '<em>' . $blog->body . '</em> [' . 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 = '<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";
    }
  }
  $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,
  );
  $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);
  }
  return node_prepare($node, $teaser);
}

/**
 * Implementation of hook_link().
 */
function blog_link($type, $node = NULL, $teaser = FALSE) {
  $links = array();
  if ($type == 'node' && $node->type == 'blog') {
    if (arg(0) != 'blog' || arg(1) != $node->uid) {
      $links['blog_usernames_blog'] = array(
        'title' => t("@username's blog", array(
          '@username' => $node->name,
        )),
        'href' => "blog/{$node->uid}",
        'attributes' => 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' => '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'] .= '<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;
        }
      }
    }
  }
}

Functions

Namesort descending Description
blog_access Implementation of hook_access().
blog_block Implementation of hook_block().
blog_feed_last Displays an RSS feed containing recent blog entries of all users.
blog_feed_user Displays an RSS feed containing recent blog entries of a given user.
blog_form Implementation of hook_form().
blog_help Implementation of hook_help().
blog_link Implementation of hook_link().
blog_menu Implementation of hook_menu().
blog_node_info Implementation of hook_node_info().
blog_page Menu callback; displays a Drupal page containing recent blog entries.
blog_page_last Displays a Drupal page containing recent blog entries of all users.
blog_page_user Displays a Drupal page containing recent blog entries of a given user.
blog_perm Implementation of hook_perm().
blog_user Implementation of hook_user().
blog_view Implementation of hook_view().