? LICENSE.txt
? modules
? preprocessor.patch
Index: advanced_forum.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/advanced_forum/advanced_forum.module,v
retrieving revision 1.45
diff -u -p -r1.45 advanced_forum.module
--- advanced_forum.module 9 Apr 2008 03:47:01 -0000 1.45
+++ advanced_forum.module 16 Apr 2008 17:15:25 -0000
@@ -1,13 +1,24 @@
t('Path from site theme directory to advanced forum theme directory. Defaults to "advforum"'),
'#default_value' => variable_get('advanced_forum_themedir','advforum'),
);
-
+
$form['advanced_forum_theme_all_comments'] = array(
'#type' => 'radios',
'#title' => t('Treat all site comments like forum comments'),
'#options' => array("No","Yes"),
- '#description' => t('Choosing yes causes advanced forum to consider every comment a forum comment and attempt to theme it that way. Some changes to your theme may be required.'),
+ '#description' => t('Choosing yes causes advanced forum to consider every comment a forum comment and attempt to theme it
+ that way. Some changes to your theme may be required.'),
'#default_value' => variable_get('advanced_forum_theme_all_comments',0),
);
// Send our form to Drupal to make a settings page
return system_settings_form($form);
-}
-
-/*****************************************************************************/
-/******************* TEMPLATE PREPROCESS *************************************/
-/*****************************************************************************/
+}
/**
* D5 compatability wrapper for node/comment preprocess functions.
@@ -79,16 +83,53 @@ function advanced_forum_settings_page()
function advanced_forum_addvars($hook, $vars) {
switch ($hook) {
case 'node':
- advanced_forum_preprocess_node($vars);
- break;
case 'comment':
- advanced_forum_preprocess_comment($vars);
+ _advanced_forum_load_preprocessors();
+ advanced_forum_call_preprocess($hook, $vars);
break;
+
}
return $vars;
}
+/**
+ * Load advanced forum preprocessors on behalf of modules.
+ */
+function _advanced_forum_load_preprocessors() {
+ static $finished = FALSE;
+ if ($finished) {
+ return;
+ }
+ require_once drupal_get_path('module', 'advanced_forum') . '/preprocessor.inc';
+ advanced_forum_include('forum.inc');
+}
+
+/**
+ * Load advanced forum files on behalf of modules.
+ *
+ * Blatent rip of views include system.
+ */
+function advanced_forum_include($file) {
+ $advanced_forum_path = drupal_get_path('module', 'advanced_forum') . '/modules';
+ foreach (module_list() as $module) {
+ $module_path = drupal_get_path('module', $module);
+ if (file_exists("$module_path/$module.$file")) {
+ require_once "./$module_path/$module.$file";
+ }
+ else if (file_exists("$module_path/includes/$module.$file")) {
+ require_once "./$module_path/includes/$module.$file";
+ }
+ else if (file_exists("$advanced_forum_path/$module.$file")) {
+ require_once "./$advanced_forum_path/$module.$file";
+ }
+ }
+}
+
+
+/**
+ * Helper function that adds addition variables for nodes.
+ */
function advanced_forum_preprocess_node(&$vars) {
if (_is_forum('node', $vars)) {
// Use our combined node/comment template file
@@ -98,40 +139,43 @@ function advanced_forum_preprocess_node(
// The node is the first post, aka topic
$vars['top_post'] = TRUE;
-
+
// Node is being shown in the forum (not on the front page or in a view)
$vars['is_forum'] = TRUE;
-
+
if (!empty($vars['node']->links) && !empty($vars['node']->links['comment_add'])) {
// Change first post from "add comment" to "Reply"
$vars['node']->links['comment_add']['title'] = t('Reply');
$vars['links'] = theme('links', $vars['node']->links, array('class' => 'links inline forumlinks'));
-
+
// Make a separate variable for the reply link so it can be put on top of the thread
$reply_link = $vars['node']->links['comment_add'];
$reply_link['title'] = t("Post Reply");
$vars['reply_link'] = theme('links', array('topic_reply' => $reply_link), array('class' => 'forumlinks'));
}
-
+
// Make an array version of $links
$vars['links_array'] = $vars['node']->links;
// User information
$vars['accountid'] = $vars['node']->uid;
- $vars['user_info_pane'] = theme('forum_user', $vars['accountid']);
+ $vars['user_info_pane'] = theme('forum_user', $vars['accountid']);
}
}
+/**
+ * Helper function that adds addition variables for comments.
+ */
function advanced_forum_preprocess_comment(&$vars) {
if (_is_forum('comment', $vars)) {
// Use our combined node/comment template file
// D5 won't find templates in subdirectories so we need to give it that
$forum_theme = advanced_forum_get_forum_theme_directory();
$vars['template_files'][] = "$forum_theme/advf-forum-post";
-
+
// Thread is being shown in the forum (not on the front page or in a view)
$vars['is_forum'] = TRUE;
-
+
// This is a comment, not the node.
$vars['top_post'] = FALSE;
@@ -147,17 +191,17 @@ function advanced_forum_preprocess_comme
// Assign the subject to the title variable for consistancy with nodes.
$vars['title'] = check_plain($vars['comment']->subject);
}
-
+
// Just use the date for the submitted on.
$vars['submitted'] = format_date($vars['comment']->timestamp);
// Assign the comment to the content variable for consistancy with nodes.
$vars['content'] = $vars['comment']->comment;
-
+
// User information
$vars['accountid'] = $vars['comment']->uid;
$vars['user_info_pane'] = theme('forum_user', $vars['accountid']);
-
+
// Because the $links array isn't available here, we recreate it
$links = module_invoke_all('link', 'comment', $vars['comment'], 1);
foreach (module_implements('link_alter') as $module) {
@@ -167,7 +211,7 @@ function advanced_forum_preprocess_comme
unset($links['comment_parent']);
$vars['links'] = theme('links', $links, array('class' => 'links forumlinks'));
$vars['links_array'] = $links;
-
+
// Comment number with link
if (!isset($post_number)) {
@@ -177,10 +221,10 @@ function advanced_forum_preprocess_comme
$post_per_page = _comment_get_display_setting('comments_per_page', $vars['node']);
$page_number = $_GET['page'];
- if (!$page_number) {
- $page_number = 0;
+ if (!$page_number) {
+ $page_number = 0;
}
-
+
$post_number++;
$fragment = 'comment-' . $vars['comment']->cid;
$query = ($page_number) ? 'page=' . $page_number : NULL;
@@ -201,28 +245,33 @@ function advanced_forum_preprocess_comme
function theme_forum_user($uid = 0) {
$variables = array();
$variables['accountid'] = $uid;
-
+
// Call our preprocess function to create all the variables
- template_preprocess_forum_user($variables);
-
+ advanced_forum_call_preprocess('forum_user', $variables);
+
$forum_theme = advanced_forum_get_forum_theme_directory();
-
+
// Send the variables to the advf-forum-user.tpl.php
return _phptemplate_callback("$forum_theme/advf-forum-user", $variables);
}
+/**
+ * Preprocess the forum_user theme hook.
+ *
+ * Inputs: $accountid
+ */
function template_preprocess_forum_user(&$variables) {
// The passed in $variables['accountid'] refers to the user who's info is in the pane.
$accountid = $variables['accountid'];
- $account = user_load(array('uid' => $accountid));
-
+ $account = $variables['account'] = user_load(array('uid' => $accountid));
+
// Get a reference to the currently logged in user.
global $user;
-
+
// Username
$variables['name_raw'] = theme('username', $account);
$variables['name'] = '
' .$variables['name_raw'] . '
';
-
+
// Avatar
$variables['picture'] = theme('user_picture', $account);
@@ -230,8 +279,8 @@ function template_preprocess_forum_user(
if ($accountid === 0) {
return;
}
-
- $themedir = advanced_forum_get_forum_theme_directory();
+
+ $themedir = advanced_forum_get_forum_theme_directory();
// Join date / since
$variables['joined_raw'] = format_date($account->created, 'custom', 'Y-m-d');
@@ -239,7 +288,7 @@ function template_preprocess_forum_user(
$variables['member_since_raw'] = format_interval(time() - $account->created);
$variables['member_since'] = '' . t('Member since: ') . $variables['member_since_raw'] . '
';
-
+
// Online status
if (round((time()-$account->access)/60) < 15) {
$variables['online_class'] = 'user-online';
@@ -253,98 +302,16 @@ function template_preprocess_forum_user(
$variables['online_status'] = '' . $variables['online_icon'] . ' ' . $variables['online_text'] . '
';
}
- // Profile
- if (module_exists('profile')) {
- $variables['profile'] = profile_view_profile($account);
- }
-
- // Points
- if (module_exists('userpoints')) {
- $variables['points_raw'] = userpoints_get_current_points($accountid);
- $variables['points'] = '' . t('Points: ') . '' . $variables['points_raw'] . '
';
- }
-
- // Posts / IP
- if (module_exists('user_stats')) {
- $variables['posts_raw'] = user_stats_get_stats('post_count', $accountid);
- $variables['posts'] = '' . t('Posts: ') . '' . $variables['posts_raw'] . '
';
-
- // IP is only visible if the viewer has access, so do an extra check
- $ip = user_stats_get_stats('ip_address', $accountid);
- if (!empty($ip)) {
- $variables['ip_raw'] = $ip;
- $variables['ip'] = '' . t('IP: ') . '' . $variables['ip_raw'] . '
';
- }
- }
-
- // Title
- if (module_exists('user_titles')) {
- $variables['user_title_raw'] = user_titles_get_user_title($accountid);
- $variables['user_title'] = '' . $variables['user_title_raw'] . '
';
- }
-
- // Badges
- if (module_exists('user_badges')) {
- $variables['user_badges_raw'] = user_badges_for_uid($accountid);
- $variables['user_badges'] = '' . $variables['user_badges_raw'] . '
';
- }
-
// Contact user
if (($account->contact) && ($account->uid != $user->uid) && ($user->uid != 0)) {
$variables['contact_class'] = "contact";
$variables['contact_icon'] = theme_image(path_to_theme() . '/' . $themedir . "/images/email.png", 'Email', 'Email', NULL, TRUE);
$variables['contact_text'] = t('Email');
$variables['contact_link'] = 'user/'. $accountid . '/contact';
- $variables['contact'] = '' .
- l($variables['contact_icon'] . ' ' . $variables['contact_text'], $variables['contact_link'], NULL, NULL, NULL, NULL, TRUE) .
+ $variables['contact'] = '
' .
+ l($variables['contact_icon'] . ' ' . $variables['contact_text'], $variables['contact_link'], NULL, NULL, NULL, NULL, TRUE) .
'
';
}
-
- // Send private message
- if (module_exists('privatemsg') &&
- ($account->uid != $user->uid) &&
- user_access('access private messages') &&
- (isset($account->privatemsg_allow) ? $account->privatemsg_allow : 1)) {
- $variables['privatemsg_icon'] = theme_image(path_to_theme() . '/' . $themedir . "/images/user_comment.png", 'Private Message', 'Private Message', NULL, TRUE);
- $variables['privatemsg_text'] = t('Send PM');
- $variables['privatemsg_link'] = 'privatemsg/new/'. $accountid;
- $variables['privatemsg'] = '
' .
- l($variables['privatemsg_icon'] . ' ' .
- $variables['privatemsg_text'], $variables['privatemsg_link'],NULL,NULL,NULL,NULL,TRUE) . '
';
- }
-
- // Add / remove from buddylist
- if (module_exists('buddylist')) {
-
- if (user_access('maintain buddy list') && @in_array($accountid, array_keys(buddylist_get_buddies($user->uid)))) {
- // Remove buddy
- $variables['buddylist_class'] = "buddy-remove";
- $variables['buddylist_icon'] = theme_image(path_to_theme() . '/' . $themedir . "/images/group_delete.png", 'Remove Buddy', 'Remove Buddy', NULL, TRUE);
- $variables['buddylist_text'] = t('Remove buddy');
- $variables['buddylist_link'] = 'buddy/delete/'. $accountid;
- } else {
- // Add buddy
- if ($accountid != $user->uid && user_access('maintain buddy list')) {
- $variables['buddylist_class'] = "buddy-add";
- $variables['buddylist_icon'] = theme_image(path_to_theme() . '/' . $themedir . "/images/group_add.png", 'Add to buddy list', 'Add to buddy list', NULL, TRUE);
- $variables['buddylist_text'] = t('Add buddy');
- $variables['buddylist_link'] = 'buddy/add/'. $accountid;
- }
- }
-
- $variables['buddylist'] = '
' .
- l($variables['buddylist_icon'] . ' ' . $variables['buddylist_text'], $variables['buddylist_link'],NULL,NULL,NULL,NULL,TRUE) .
- '
';
- }
- // Subscribe to user's posts
- // D6 alert: this assumes forum type.
- if (module_exists('subscriptions')) {
- if (user_access('subscribe to content types')) {
- $variables['subscribe_link'] = "subscriptions/add/type/forum/" . $account->uid;
- $variables['subscribe'] = l(t("Subscribe"), $variables['subscribe_link'], array('title' => 'Subscribe to forum posts by this user'));
- }
- }
-
}
@@ -352,8 +319,10 @@ function template_preprocess_forum_user(
/********************** FORUM MODULE THEME OVERRIDES *************************/
-// Add in the D6 backports from the forum, taxonomy, and comment modules
-include_once drupal_get_path('module', 'advanced_forum') .'/d6_compat.inc';
+if (!function_exists('_theme_build_registry')) {
+ // Add in the D6 backports from the forum, taxonomy, and comment modules
+ include_once drupal_get_path('module', 'advanced_forum') .'/d6_compat.inc';
+}
/**
* Implementation of theme_forum_display
@@ -366,7 +335,7 @@ function phptemplate_forum_display($foru
$variables['tid'] = $tid;
$variables['sortby'] = $sortby;
$variables['forum_per_page'] = $forum_per_page;
-
+
// Pass the parameters into the D6 preprocess function
template_preprocess_forums($variables);
@@ -418,10 +387,10 @@ function phptemplate_forum_list($forums,
// Pass the parameters into the D6 preprocess function
template_preprocess_forum_list($variables);
-
+
// Pass the parameters into our preprocess function
advanced_forum_preprocess_forum_list($variables);
-
+
// Look for the .tpl file in the theme. If found, use it. If not found, default
// to the stock forum code and put up a warning.
$forum_theme = advanced_forum_get_forum_theme_directory();
@@ -442,21 +411,21 @@ function advanced_forum_preprocess_forum
}
}
-/*
+/**
* D5 compatability wrapper for theme_forum_submitted.
* Note: this function does not exist at all in D5's forum.module
*/
function phptemplate_forum_submitted($topic) {
// Create a $variables array from the parameters
$variables['topic'] = $topic;
-
+
// Pass the parameters into the D6 preprocess function
template_preprocess_forum_submitted($variables);
-
+
// Pass the parameters into our preprocess function
advanced_forum_preprocess_forum_submitted($variables);
- // Look for the .tpl file in the theme. If found, use it. If not found,
+ // Look for the .tpl file in the theme. If found, use it. If not found,
// just warn because there is no stock code to default to.
$forum_theme = advanced_forum_get_forum_theme_directory();
if (file_exists(path_to_theme() . '/' . $forum_theme . "/advf-forum-submitted.tpl.php")) {
@@ -484,13 +453,13 @@ function phptemplate_forum_topic_list($t
$variables['topics'] = $topics;
$variables['sortby'] = $sortby;
$variables['forum_per_page'] = $forum_per_page;
-
+
// Pass the parameters into the D6 preprocess function
template_preprocess_forum_topic_list($variables);
-
+
// Pass the parameters into our preprocess function
advanced_forum_preprocess_forum_topic_list($variables);
-
+
// Look for the .tpl file in the theme. If found, use it. If not found, default
// to the stock forum code and put up a warning.
$forum_theme = advanced_forum_get_forum_theme_directory();
@@ -506,44 +475,44 @@ function advanced_forum_preprocess_forum
// Do our own topic processing.
if (!empty($variables['topics'])) {
$row = 0;
-
+
// Find out how many pages to show on the topic pager. We do this outside
// the loop because it will be the same for all topics.
$max_pages_to_display = variable_get('advforum_topic_pager_max', 5);
-
+
foreach ($variables['topics'] as $id => $topic) {
-
+
// Find the number of comments per page for the node type of the topic.
// It's the same for all types in D5, but varies in D6.
$comments_per_page = _comment_get_display_setting('comments_per_page', $topic);
-
+
if ($max_pages_to_display > 0 && $topic->num_comments > $comments_per_page) {
// Topic has more than one page and a pager is wanted. Start off the
// first page because that doesn't have a query.
$pager_array = array();
$current_display_page = 1;
$pager_array[] = l('1', "node/$topic->nid");
-
+
// Find the ending point. The pager URL is always 1 less than
// the number being displayed because the first page is 0.
$last_display_page = ceil($topic->num_comments / $comments_per_page);
$last_pager_page = $last_display_page - 1;
-
+
// Add pages until we run out or until we hit the max to show.
while (($current_display_page < $last_display_page) && ($current_display_page < $max_pages_to_display)) {
// Move to the next page
$current_display_page++;
-
+
// The page number we link to is 1 less than what's displayed
$link_to_page = $current_display_page - 1;
-
+
// Add the link to the array
$pager_array[] = l($current_display_page, "node/$topic->nid", NULL, 'page=' . $link_to_page);
}
-
+
// Move to the next page
$current_display_page++;
-
+
if ($current_display_page == $last_display_page) {
// We are one past the max to display, but it's the last page,
// so putting the ...last is silly. Just display it normally.
@@ -558,11 +527,11 @@ function advanced_forum_preprocess_forum
$text = t('Last Page') . '(' . $last_display_page . ')';
$pager_last = ' … ' . l($text, "node/$topic->nid", NULL, 'page=' . $last_pager_page);
}
-
+
// Put it all together
$variables['topics'][$id]->pager = '[' . t('Page') . ' '. implode(", ", $pager_array) . $pager_last . ']';
}
-
+
// Make shadow copy point to actual thread and tell you new the forum name
if ($variables['topics'][$id]->moved == TRUE) {
$term = taxonomy_get_term($topic->tid);
@@ -589,7 +558,7 @@ function phptemplate_forum_icon($new_pos
$variables['num_posts'] = $num_posts;
$variables['comment_mode'] = $comment_mode;
$variables['sticky'] = $sticky;
-
+
// Pass the parameters into the D6 preprocess function
template_preprocess_forum_icon($variables);
@@ -619,7 +588,7 @@ function advanced_forum_preprocess_forum
}
}
$variables['iconpath'] = $iconpath;
-
+
return;
}
@@ -646,14 +615,14 @@ function advanced_forum_markasread() {
$sql .= ' AND r.tid = %d';
$args[] = $tid;
}
-
+
//*D6* Need to change this for all forum types
$type = 'forum';
$sql .= ' AND n.type = \'%s\'';
$args[] = $type;
db_query($sql, $args);
-
+
if ($tid) {
drupal_set_message(t('All topics in forum marked as read'));
drupal_goto('forum/'.$tid);
@@ -661,7 +630,7 @@ function advanced_forum_markasread() {
drupal_set_message(t('All forum posts have been marked as read'));
drupal_goto('forum');
}
-
+
drupal_goto('forum');
}
@@ -671,49 +640,49 @@ function advanced_forum_markasread() {
function advanced_forum_get_all_last_topics() {
// Query the info about the latest topic for the given forum
$query = "
- SELECT n.title AS topictitle,
- r.title AS replytitle,
- r.time timestamp,
- r.type AS replytype,
- n.type AS topictype,
- n.nid AS topicid,
- t.tid,
- r.cid AS cid,
+ SELECT n.title AS topictitle,
+ r.title AS replytitle,
+ r.time timestamp,
+ r.type AS replytype,
+ n.type AS topictype,
+ n.nid AS topicid,
+ t.tid,
+ r.cid AS cid,
r.uid,
u.name
- FROM {node} AS n
- INNER JOIN
+ FROM {node} AS n
+ INNER JOIN
(
- (SELECT title,
+ (SELECT title,
created AS time,
- nid,
- uid,
- type,
- 'cid' AS cid
+ nid,
+ uid,
+ type,
+ 'cid' AS cid
FROM {node}
)
- UNION
- (SELECT subject,
- timestamp,
- nid,
- uid,
- 'comment',
- cid
+ UNION
+ (SELECT subject,
+ timestamp,
+ nid,
+ uid,
+ 'comment',
+ cid
FROM {comments}
WHERE {comments}.status = %d
- )
+ )
ORDER BY time DESC
- ) AS r ON n.nid=r.nid
- INNER JOIN {term_node} AS t ON n.nid = t.nid
+ ) AS r ON n.nid=r.nid
+ INNER JOIN {term_node} AS t ON n.nid = t.nid
INNER JOIN {users} AS u ON r.uid = u.uid
- WHERE n.status = 1
+ WHERE n.status = 1
GROUP BY tid;";
$result = db_query($query, COMMENT_PUBLISHED);
$topics = array();
while ($topic = db_fetch_object($result)) {
$topics[$topic->tid] = $topic;
- }
+ }
return $topics;
}
@@ -729,7 +698,7 @@ function _is_forum($hook, $vars) {
// Setting this static means the check only needs to be done once per page
// as long as we haven't hit a non forum node on the page
static $forum_node_id;
-
+
switch ($hook) {
case 'node':
// Make sure this is a forum node type and that it's not being
@@ -744,7 +713,7 @@ function _is_forum($hook, $vars) {
unset($forum_node_id);
return false;
}
-
+
case 'comment':
if (isset($forum_node_id)) {
// We already know the node ID of the forum
@@ -762,7 +731,7 @@ function _is_forum($hook, $vars) {
}
return false;
}
-
+
default:
return false;
}
@@ -774,11 +743,11 @@ function _is_forum($hook, $vars) {
*/
function _topic_nid($nodeid = 0) {
static $nid;
-
+
if (!empty($nodeid)) {
$nid = $nodeid;
}
-
+
return $nid;
}
@@ -799,7 +768,7 @@ function advanced_forum_add_css() {
// Load the structural CSS (heights, floats, padding, margins, etc)
drupal_add_css($csspath . '/advanced_forum-structure.css');
-
+
// Add on the colors and graphics part
drupal_add_css($csspath . '/advanced_forum.css');
}
Index: preprocessor.inc
===================================================================
RCS file: preprocessor.inc
diff -N preprocessor.inc
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ preprocessor.inc 16 Apr 2008 17:15:25 -0000
@@ -0,0 +1,75 @@
+data) && $cache->data) {
+ $registry = unserialize($cache->data);
+ }
+ else {
+ // We'll build it below.
+ $registry = array();
+ }
+ }
+
+ // Build our little registry of functions.
+ if (empty($registry) || !isset($registry[$hook])) {
+ // If not, build one and cache it.
+ $registry[$hook] = advanced_forum_build_preprocess($hook);
+ cache_set("advforum_registry:$name", 'cache', serialize($registry));
+ }
+
+ return $registry[$hook];
+}
+
+/**
+ * Invoke our api to provide pluggable preprocessing.
+ *
+ * Part of D5 compatibility. Simplified version of preprocessing calls from D6.
+ *
+ * NOTE - This could conflict with D6 modules for things like node and comment
+ * so we need to provide peppered versions as well.
+ */
+function advanced_forum_build_preprocess($hook) {
+ static $d5;
+ if (!isset($d5)) {
+ $d5 = !function_exists('_theme_build_registry');
+ }
+
+ $return = array();
+ // Default preprocessor prefix.
+ $prefixes[] = 'template';
+ // Add all modules so they can intervene with their own preprocessors. This allows them
+ // to provide preprocess functions even if they are not the owner of the current hook.
+ $prefixes += module_list();
+
+ foreach ($prefixes as $prefix) {
+ if ($d5 && function_exists($prefix .'_preprocess')) {
+ $return[] = $prefix .'_preprocess';
+ }
+ if ($d5 && function_exists($prefix .'_preprocess_'. $hook)) {
+ $return[] = $prefix .'_preprocess_'. $hook;
+ }
+ if (function_exists($prefix .'_preprocess_advforum_'. $hook)) {
+ $return[] = $prefix .'_preprocess_'. $hook;
+ }
+ }
+ return $return;
+}
+