1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396 |
- <?php
- function forum_help($path, $arg) {
- switch ($path) {
- case 'admin/help#forum':
- $output = '';
- $output .= '<h3>' . t('About') . '</h3>';
- $output .= '<p>' . t('The Forum module lets you create threaded discussion forums with functionality similar to other message board systems. Forums are useful because they allow community members to discuss topics with one another while ensuring those conversations are archived for later reference. In a forum, users post topics and threads in nested hierarchies, allowing discussions to be categorized and grouped. The forum hierarchy consists of:') . '</p>';
- $output .= '<ul>';
- $output .= '<li>' . t('Optional containers (for example, <em>Support</em>), which can hold:') . '</li>';
- $output .= '<ul><li>' . t('Forums (for example, <em>Installing Drupal</em>), which can hold:') . '</li>';
- $output .= '<ul><li>' . t('Forum topics submitted by users (for example, <em>How to start a Drupal 6 Multisite</em>), which start discussions and are starting points for:') . '</li>';
- $output .= '<ul><li>' . t('Threaded comments submitted by users (for example, <em>You have these options...</em>).') . '</li>';
- $output .= '</ul>';
- $output .= '</ul>';
- $output .= '</ul>';
- $output .= '</ul>';
- $output .= '<p>' . t('For more information, see the online handbook entry for <a href="@forum">Forum module</a>.', array('@forum' => 'http://drupal.org/documentation/modules/forum')) . '</p>';
- $output .= '<h3>' . t('Uses') . '</h3>';
- $output .= '<dl>';
- $output .= '<dt>' . t('Setting up forum structure') . '</dt>';
- $output .= '<dd>' . t('Visit the <a href="@forums">Forums page</a> to set up containers and forums to hold your discussion topics.', array('@forums' => url('admin/structure/forum'))) . '</dd>';
- $output .= '<dt>' . t('Starting a discussion') . '</dt>';
- $output .= '<dd>' . t('The <a href="@create-topic">Forum topic</a> link on the <a href="@content-add">Add new content</a> page creates the first post of a new threaded discussion, or thread.', array('@create-topic' => url('node/add/forum'), '@content-add' => url('node/add'))) . '</dd>';
- $output .= '<dt>' . t('Navigation') . '</dt>';
- $output .= '<dd>' . t('Enabling the Forum module provides a default <em>Forums</em> menu item in the navigation menu that links to the <a href="@forums">Forums page</a>.', array('@forums' => url('forum'))) . '</dd>';
- $output .= '<dt>' . t('Moving forum topics') . '</dt>';
- $output .= '<dd>' . t('A forum topic (and all of its comments) may be moved between forums by selecting a different forum while editing a forum topic. When moving a forum topic between forums, the <em>Leave shadow copy</em> option creates a link in the original forum pointing to the new location.') . '</dd>';
- $output .= '<dt>' . t('Locking and disabling comments') . '</dt>';
- $output .= '<dd>' . t('Selecting <em>Closed</em> under <em>Comment settings</em> while editing a forum topic will lock (prevent new comments on) the thread. Selecting <em>Hidden</em> under <em>Comment settings</em> while editing a forum topic will hide all existing comments on the thread, and prevent new ones.') . '</dd>';
- $output .= '</dl>';
- return $output;
- case 'admin/structure/forum':
- $output = '<p>' . t('Forums contain forum topics. Use containers to group related forums.') . '</p>';
- $output .= theme('more_help_link', array('url' => 'admin/help/forum'));
- return $output;
- case 'admin/structure/forum/add/container':
- return '<p>' . t('Use containers to group related forums.') . '</p>';
- case 'admin/structure/forum/add/forum':
- return '<p>' . t('A forum holds related forum topics.') . '</p>';
- case 'admin/structure/forum/settings':
- return '<p>' . t('Adjust the display of your forum topics. Organize the forums on the <a href="@forum-structure">forum structure page</a>.', array('@forum-structure' => url('admin/structure/forum'))) . '</p>';
- }
- }
- function forum_theme() {
- return array(
- 'forums' => array(
- 'template' => 'forums',
- 'variables' => array('forums' => NULL, 'topics' => NULL, 'parents' => NULL, 'tid' => NULL, 'sortby' => NULL, 'forum_per_page' => NULL),
- ),
- 'forum_list' => array(
- 'template' => 'forum-list',
- 'variables' => array('forums' => NULL, 'parents' => NULL, 'tid' => NULL),
- ),
- 'forum_topic_list' => array(
- 'template' => 'forum-topic-list',
- 'variables' => array('tid' => NULL, 'topics' => NULL, 'sortby' => NULL, 'forum_per_page' => NULL),
- ),
- 'forum_icon' => array(
- 'template' => 'forum-icon',
- 'variables' => array('new_posts' => NULL, 'num_posts' => 0, 'comment_mode' => 0, 'sticky' => 0, 'first_new' => FALSE),
- ),
- 'forum_submitted' => array(
- 'template' => 'forum-submitted',
- 'variables' => array('topic' => NULL),
- ),
- 'forum_form' => array(
- 'render element' => 'form',
- 'file' => 'forum.admin.inc',
- ),
- );
- }
- function forum_menu() {
- $items['forum'] = array(
- 'title' => 'Forums',
- 'page callback' => 'forum_page',
- 'access arguments' => array('access content'),
- 'file' => 'forum.pages.inc',
- );
- $items['forum/%forum_forum'] = array(
- 'title' => 'Forums',
- 'page callback' => 'forum_page',
- 'page arguments' => array(1),
- 'access arguments' => array('access content'),
- 'file' => 'forum.pages.inc',
- );
- $items['admin/structure/forum'] = array(
- 'title' => 'Forums',
- 'description' => 'Control forum hierarchy settings.',
- 'page callback' => 'drupal_get_form',
- 'page arguments' => array('forum_overview'),
- 'access arguments' => array('administer forums'),
- 'file' => 'forum.admin.inc',
- );
- $items['admin/structure/forum/list'] = array(
- 'title' => 'List',
- 'type' => MENU_DEFAULT_LOCAL_TASK,
- 'weight' => -10,
- );
- $items['admin/structure/forum/add/container'] = array(
- 'title' => 'Add container',
- 'page callback' => 'forum_form_main',
- 'page arguments' => array('container'),
- 'access arguments' => array('administer forums'),
- 'type' => MENU_LOCAL_ACTION,
- 'parent' => 'admin/structure/forum',
- 'file' => 'forum.admin.inc',
- );
- $items['admin/structure/forum/add/forum'] = array(
- 'title' => 'Add forum',
- 'page callback' => 'forum_form_main',
- 'page arguments' => array('forum'),
- 'access arguments' => array('administer forums'),
- 'type' => MENU_LOCAL_ACTION,
- 'parent' => 'admin/structure/forum',
- 'file' => 'forum.admin.inc',
- );
- $items['admin/structure/forum/settings'] = array(
- 'title' => 'Settings',
- 'page callback' => 'drupal_get_form',
- 'page arguments' => array('forum_admin_settings'),
- 'access arguments' => array('administer forums'),
- 'weight' => 5,
- 'type' => MENU_LOCAL_TASK,
- 'parent' => 'admin/structure/forum',
- 'file' => 'forum.admin.inc',
- );
- $items['admin/structure/forum/edit/container/%taxonomy_term'] = array(
- 'title' => 'Edit container',
- 'page callback' => 'forum_form_main',
- 'page arguments' => array('container', 5),
- 'access arguments' => array('administer forums'),
- 'file' => 'forum.admin.inc',
- );
- $items['admin/structure/forum/edit/forum/%taxonomy_term'] = array(
- 'title' => 'Edit forum',
- 'page callback' => 'forum_form_main',
- 'page arguments' => array('forum', 5),
- 'access arguments' => array('administer forums'),
- 'file' => 'forum.admin.inc',
- );
- return $items;
- }
- function forum_menu_local_tasks_alter(&$data, $router_item, $root_path) {
- global $user;
-
- if ($root_path == 'forum' || $root_path == 'forum/%') {
- $tid = (isset($router_item['page_arguments'][0]) ? $router_item['page_arguments'][0]->tid : 0);
- $forum_term = forum_forum_load($tid);
- if ($forum_term) {
- $links = array();
-
- $field = field_info_field('taxonomy_forums');
- foreach ($field['bundles']['node'] as $type) {
- if (node_access('create', $type)) {
- $links[$type] = array(
- '#theme' => 'menu_local_action',
- '#link' => array(
- 'title' => t('Add new @node_type', array('@node_type' => node_type_get_name($type))),
- 'href' => 'node/add/' . str_replace('_', '-', $type) . '/' . $forum_term->tid,
- ),
- );
- }
- }
- if (empty($links)) {
-
- if ($user->uid) {
- $links['disallowed'] = array(
- '#theme' => 'menu_local_action',
- '#link' => array(
- 'title' => t('You are not allowed to post new content in the forum.'),
- ),
- );
- }
-
- else {
- $links['login'] = array(
- '#theme' => 'menu_local_action',
- '#link' => array(
- 'title' => t('<a href="@login">Log in</a> to post new content in the forum.', array(
- '@login' => url('user/login', array('query' => drupal_get_destination())),
- )),
- 'localized_options' => array('html' => TRUE),
- ),
- );
- }
- }
- $data['actions']['output'] = array_merge($data['actions']['output'], $links);
- }
- }
- }
- function forum_entity_info_alter(&$info) {
-
- if ($vid = variable_get('forum_nav_vocabulary', 0)) {
-
-
-
-
-
-
-
- foreach (taxonomy_vocabulary_get_names() as $machine_name => $vocabulary) {
- if ($vid == $vocabulary->vid) {
- $info['taxonomy_term']['bundles'][$machine_name]['uri callback'] = 'forum_uri';
- }
- }
- }
- }
- function forum_uri($forum) {
- return array(
- 'path' => 'forum/' . $forum->tid,
- );
- }
- function _forum_node_check_node_type($node) {
-
- $field = field_info_instance('node', 'taxonomy_forums', $node->type);
- return is_array($field);
- }
- function forum_node_view($node, $view_mode) {
- if (_forum_node_check_node_type($node)) {
- if ($view_mode == 'full' && node_is_page($node)) {
- $vid = variable_get('forum_nav_vocabulary', 0);
- $vocabulary = taxonomy_vocabulary_load($vid);
-
- $breadcrumb[] = l(t('Home'), NULL);
- $breadcrumb[] = l($vocabulary->name, 'forum');
- if ($parents = taxonomy_get_parents_all($node->forum_tid)) {
- $parents = array_reverse($parents);
- foreach ($parents as $parent) {
- $breadcrumb[] = l($parent->name, 'forum/' . $parent->tid);
- }
- }
- drupal_set_breadcrumb($breadcrumb);
- }
- }
- }
- function forum_node_validate($node, $form) {
- if (_forum_node_check_node_type($node)) {
- $langcode = $form['taxonomy_forums']['#language'];
-
- if (!empty($node->taxonomy_forums[$langcode])) {
-
- $containers = variable_get('forum_containers', array());
- foreach ($node->taxonomy_forums[$langcode] as $delta => $item) {
-
-
- if (empty($item['tid'])) {
- unset($node->taxonomy_forums[$langcode][$delta]);
- continue;
- }
- $term = taxonomy_term_load($item['tid']);
- if (!$term) {
- form_set_error('taxonomy_forums', t('Select a forum.'));
- continue;
- }
- $used = db_query_range('SELECT 1 FROM {taxonomy_term_data} WHERE tid = :tid AND vid = :vid',0 , 1, array(
- ':tid' => $term->tid,
- ':vid' => $term->vid,
- ))->fetchField();
- if ($used && in_array($term->tid, $containers)) {
- form_set_error('taxonomy_forums', t('The item %forum is a forum container, not a forum. Select one of the forums below instead.', array('%forum' => $term->name)));
- }
- }
- }
- }
- }
- function forum_node_presave($node) {
- if (_forum_node_check_node_type($node)) {
-
- $node->icon = !empty($node->icon) ? $node->icon : '';
- reset($node->taxonomy_forums);
- $langcode = key($node->taxonomy_forums);
- if (!empty($node->taxonomy_forums[$langcode])) {
- $node->forum_tid = $node->taxonomy_forums[$langcode][0]['tid'];
- if (isset($node->nid)) {
- $old_tid = db_query_range("SELECT f.tid FROM {forum} f INNER JOIN {node} n ON f.vid = n.vid WHERE n.nid = :nid ORDER BY f.vid DESC", 0, 1, array(':nid' => $node->nid))->fetchField();
- if ($old_tid && isset($node->forum_tid) && ($node->forum_tid != $old_tid) && !empty($node->shadow)) {
-
- $node->taxonomy_forums[$langcode][] = array('tid' => $old_tid);
- }
- }
- }
- }
- }
- function forum_node_update($node) {
- if (_forum_node_check_node_type($node)) {
- if (empty($node->revision) && db_query('SELECT tid FROM {forum} WHERE nid=:nid', array(':nid' => $node->nid))->fetchField()) {
- if (!empty($node->forum_tid)) {
- db_update('forum')
- ->fields(array('tid' => $node->forum_tid))
- ->condition('vid', $node->vid)
- ->execute();
- }
-
- else {
- db_delete('forum')
- ->condition('nid', $node->nid)
- ->execute();
- }
- }
- else {
- if (!empty($node->forum_tid)) {
- db_insert('forum')
- ->fields(array(
- 'tid' => $node->forum_tid,
- 'vid' => $node->vid,
- 'nid' => $node->nid,
- ))
- ->execute();
- }
- }
-
-
- if (!empty($node->shadow)) {
- db_delete('forum')
- ->condition('nid', $node->nid)
- ->condition('vid', $node->vid)
- ->execute();
- db_insert('forum')
- ->fields(array(
- 'nid' => $node->nid,
- 'vid' => $node->vid,
- 'tid' => $node->forum_tid,
- ))
- ->execute();
- }
- }
- }
- function forum_node_insert($node) {
- if (_forum_node_check_node_type($node)) {
- if (!empty($node->forum_tid)) {
- $nid = db_insert('forum')
- ->fields(array(
- 'tid' => $node->forum_tid,
- 'vid' => $node->vid,
- 'nid' => $node->nid,
- ))
- ->execute();
- }
- }
- }
- function forum_node_delete($node) {
- if (_forum_node_check_node_type($node)) {
- db_delete('forum')
- ->condition('nid', $node->nid)
- ->execute();
- db_delete('forum_index')
- ->condition('nid', $node->nid)
- ->execute();
- }
- }
- function forum_node_load($nodes) {
- $node_vids = array();
- foreach ($nodes as $node) {
- if (_forum_node_check_node_type($node)) {
- $node_vids[] = $node->vid;
- }
- }
- if (!empty($node_vids)) {
- $query = db_select('forum', 'f');
- $query
- ->fields('f', array('nid', 'tid'))
- ->condition('f.vid', $node_vids);
- $result = $query->execute();
- foreach ($result as $record) {
- $nodes[$record->nid]->forum_tid = $record->tid;
- }
- }
- }
- function forum_node_info() {
- return array(
- 'forum' => array(
- 'name' => t('Forum topic'),
- 'base' => 'forum',
- 'description' => t('A <em>forum topic</em> starts a new discussion thread within a forum.'),
- 'title_label' => t('Subject'),
- )
- );
- }
- function forum_permission() {
- $perms = array(
- 'administer forums' => array(
- 'title' => t('Administer forums'),
- ),
- );
- return $perms;
- }
- function forum_taxonomy_term_delete($term) {
-
- $containers = variable_get('forum_containers', array());
- $key = array_search($term->tid, $containers);
- if ($key !== FALSE) {
- unset($containers[$key]);
- }
- variable_set('forum_containers', $containers);
- }
- function forum_comment_publish($comment) {
- _forum_update_forum_index($comment->nid);
- }
- function forum_comment_update($comment) {
-
-
- if (!$comment->status) {
- _forum_update_forum_index($comment->nid);
- }
- }
- function forum_comment_unpublish($comment) {
- _forum_update_forum_index($comment->nid);
- }
- function forum_comment_delete($comment) {
- _forum_update_forum_index($comment->nid);
- }
- function forum_field_storage_pre_insert($entity_type, $entity, &$skip_fields) {
- if ($entity_type == 'node' && $entity->status && _forum_node_check_node_type($entity)) {
- $query = db_insert('forum_index')->fields(array('nid', 'title', 'tid', 'sticky', 'created', 'comment_count', 'last_comment_timestamp'));
- foreach ($entity->taxonomy_forums as $language) {
- foreach ($language as $item) {
- $query->values(array(
- 'nid' => $entity->nid,
- 'title' => $entity->title,
- 'tid' => $item['tid'],
- 'sticky' => $entity->sticky,
- 'created' => $entity->created,
- 'comment_count' => 0,
- 'last_comment_timestamp' => $entity->created,
- ));
- }
- }
- $query->execute();
- }
- }
- function forum_field_storage_pre_update($entity_type, $entity, &$skip_fields) {
- $first_call = &drupal_static(__FUNCTION__, array());
- if ($entity_type == 'node' && _forum_node_check_node_type($entity)) {
-
- if ($entity->status) {
-
-
-
- if (!isset($first_call[$entity->nid])) {
- $first_call[$entity->nid] = FALSE;
- db_delete('forum_index')->condition('nid', $entity->nid)->execute();
- }
- $query = db_insert('forum_index')->fields(array('nid', 'title', 'tid', 'sticky', 'created', 'comment_count', 'last_comment_timestamp'));
- foreach ($entity->taxonomy_forums as $language) {
- foreach ($language as $item) {
- $query->values(array(
- 'nid' => $entity->nid,
- 'title' => $entity->title,
- 'tid' => $item['tid'],
- 'sticky' => $entity->sticky,
- 'created' => $entity->created,
- 'comment_count' => 0,
- 'last_comment_timestamp' => $entity->created,
- ));
- }
- }
- $query->execute();
-
-
- _forum_update_forum_index($entity->nid);
- }
-
- else {
- db_delete('forum_index')->condition('nid', $entity->nid)->execute();
- }
- }
- }
- function forum_form_taxonomy_form_vocabulary_alter(&$form, &$form_state, $form_id) {
- $vid = variable_get('forum_nav_vocabulary', 0);
- if (isset($form['vid']['#value']) && $form['vid']['#value'] == $vid) {
- $form['help_forum_vocab'] = array(
- '#markup' => t('This is the designated forum vocabulary. Some of the normal vocabulary options have been removed.'),
- '#weight' => -1,
- );
-
-
-
- $form['hierarchy']['#value'] = 1;
-
- $form['actions']['delete']['#access'] = FALSE;
- }
- }
- function forum_form_taxonomy_form_term_alter(&$form, &$form_state, $form_id) {
- $vid = variable_get('forum_nav_vocabulary', 0);
- if (isset($form['vid']['#value']) && $form['vid']['#value'] == $vid) {
-
- $form['relations']['parent']['#access'] = FALSE;
- }
- }
- function forum_form_node_form_alter(&$form, &$form_state, $form_id) {
- if (isset($form['taxonomy_forums'])) {
- $langcode = $form['taxonomy_forums']['#language'];
-
- $form['taxonomy_forums'][$langcode]['#required'] = TRUE;
- $form['taxonomy_forums'][$langcode]['#multiple'] = FALSE;
- if (empty($form['taxonomy_forums'][$langcode]['#default_value'])) {
-
-
-
- $requested_forum_id = arg(3);
- $form['taxonomy_forums'][$langcode]['#default_value'] = is_numeric($requested_forum_id) ? $requested_forum_id : '';
- }
- }
- }
- function forum_block_info() {
- $blocks['active'] = array(
- 'info' => t('Active forum topics'),
- 'cache' => DRUPAL_CACHE_CUSTOM,
- 'properties' => array('administrative' => TRUE),
- );
- $blocks['new'] = array(
- 'info' => t('New forum topics'),
- 'cache' => DRUPAL_CACHE_CUSTOM,
- 'properties' => array('administrative' => TRUE),
- );
- return $blocks;
- }
- function forum_block_configure($delta = '') {
- $form['forum_block_num_' . $delta] = array(
- '#type' => 'select',
- '#title' => t('Number of topics'),
- '#default_value' => variable_get('forum_block_num_' . $delta, '5'),
- '#options' => drupal_map_assoc(range(2, 20))
- );
- return $form;
- }
- function forum_block_save($delta = '', $edit = array()) {
- variable_set('forum_block_num_' . $delta, $edit['forum_block_num_' . $delta]);
- }
- function forum_block_view($delta = '') {
- $query = db_select('forum_index', 'f')
- ->fields('f')
- ->addTag('node_access');
- switch ($delta) {
- case 'active':
- $title = t('Active forum topics');
- $query
- ->orderBy('f.last_comment_timestamp', 'DESC')
- ->range(0, variable_get('forum_block_num_active', '5'));
- break;
- case 'new':
- $title = t('New forum topics');
- $query
- ->orderBy('f.created', 'DESC')
- ->range(0, variable_get('forum_block_num_new', '5'));
- break;
- }
- $block['subject'] = $title;
-
- $block['content'] = drupal_render_cache_by_query($query, 'forum_block_view');
- $block['content']['#access'] = user_access('access content');
- return $block;
- }
- function forum_block_view_pre_render($elements) {
- $result = $elements['#query']->execute();
- if ($node_title_list = node_title_list($result)) {
- $elements['forum_list'] = $node_title_list;
- $elements['forum_more'] = array('#theme' => 'more_link', '#url' => 'forum', '#title' => t('Read the latest forum topics.'));
- }
- return $elements;
- }
- function forum_form($node, $form_state) {
- $type = node_type_get_type($node);
- $form['title'] = array(
- '#type' => 'textfield',
- '#title' => check_plain($type->title_label),
- '#default_value' => !empty($node->title) ? $node->title : '',
- '#required' => TRUE, '#weight' => -5
- );
- if (!empty($node->nid)) {
- $forum_terms = $node->taxonomy_forums;
-
- $shadow = (count($forum_terms) > 1);
- $form['shadow'] = array('#type' => 'checkbox', '#title' => t('Leave shadow copy'), '#default_value' => $shadow, '#description' => t('If you move this topic, you can leave a link in the old forum to the new forum.'));
- $form['forum_tid'] = array('#type' => 'value', '#value' => $node->forum_tid);
- }
- return $form;
- }
- function forum_forum_load($tid = NULL) {
- $cache = &drupal_static(__FUNCTION__, array());
-
- if (!isset($tid)) {
- $tid = 0;
- }
- if (isset($cache[$tid])) {
- return $cache[$tid];
- }
- $vid = variable_get('forum_nav_vocabulary', 0);
-
- if ($tid) {
- $forum_term = taxonomy_term_load($tid);
- if (!$forum_term || ($forum_term->vid != $vid)) {
- return $cache[$tid] = FALSE;
- }
- }
-
- elseif ($tid === 0) {
- $forum_term = (object) array(
- 'tid' => 0,
- );
- }
-
- if (!$forum_term->tid || in_array($forum_term->tid, variable_get('forum_containers', array()))) {
- $forum_term->container = 1;
- }
-
- $forum_term->parents = taxonomy_get_parents_all($forum_term->tid);
-
- $forums = array();
- $_forums = taxonomy_get_tree($vid, $tid);
- if (count($_forums)) {
- $query = db_select('node', 'n');
- $query->join('node_comment_statistics', 'ncs', 'n.nid = ncs.nid');
- $query->join('forum', 'f', 'n.vid = f.vid');
- $query->addExpression('COUNT(n.nid)', 'topic_count');
- $query->addExpression('SUM(ncs.comment_count)', 'comment_count');
- $counts = $query
- ->fields('f', array('tid'))
- ->condition('n.status', 1)
- ->groupBy('tid')
- ->addTag('node_access')
- ->execute()
- ->fetchAllAssoc('tid');
- }
- foreach ($_forums as $forum) {
-
- if (in_array($forum->tid, variable_get('forum_containers', array()))) {
- $forum->container = 1;
- }
-
- if (!empty($counts[$forum->tid])) {
- $forum->num_topics = $counts[$forum->tid]->topic_count;
- $forum->num_posts = $counts[$forum->tid]->topic_count + $counts[$forum->tid]->comment_count;
- }
- else {
- $forum->num_topics = 0;
- $forum->num_posts = 0;
- }
-
- $query = db_select('node', 'n');
- $query->join('users', 'u1', 'n.uid = u1.uid');
- $query->join('forum', 'f', 'n.vid = f.vid AND f.tid = :tid', array(':tid' => $forum->tid));
- $query->join('node_comment_statistics', 'ncs', 'n.nid = ncs.nid');
- $query->join('users', 'u2', 'ncs.last_comment_uid = u2.uid');
- $query->addExpression('CASE ncs.last_comment_uid WHEN 0 THEN ncs.last_comment_name ELSE u2.name END', 'last_comment_name');
- $topic = $query
- ->fields('ncs', array('last_comment_timestamp', 'last_comment_uid'))
- ->condition('n.status', 1)
- ->orderBy('last_comment_timestamp', 'DESC')
- ->range(0, 1)
- ->addTag('node_access')
- ->execute()
- ->fetchObject();
-
- $last_post = new stdClass();
- if (!empty($topic->last_comment_timestamp)) {
- $last_post->created = $topic->last_comment_timestamp;
- $last_post->name = $topic->last_comment_name;
- $last_post->uid = $topic->last_comment_uid;
- }
- $forum->last_post = $last_post;
- $forums[$forum->tid] = $forum;
- }
-
- $forum_term->forums = $forums;
- $cache[$tid] = $forum_term;
- return $forum_term;
- }
- function _forum_topics_unread($term, $uid) {
- $query = db_select('node', 'n');
- $query->join('forum', 'f', 'n.vid = f.vid AND f.tid = :tid', array(':tid' => $term));
- $query->leftJoin('history', 'h', 'n.nid = h.nid AND h.uid = :uid', array(':uid' => $uid));
- $query->addExpression('COUNT(n.nid)', 'count');
- return $query
- ->condition('status', 1)
- ->condition('n.created', NODE_NEW_LIMIT, '>')
- ->isNull('h.nid')
- ->addTag('node_access')
- ->execute()
- ->fetchField();
- }
- function forum_get_topics($tid, $sortby, $forum_per_page) {
- global $user, $forum_topic_list_header;
- $forum_topic_list_header = array(
- NULL,
- array('data' => t('Topic'), 'field' => 'f.title'),
- array('data' => t('Replies'), 'field' => 'f.comment_count'),
- array('data' => t('Last reply'), 'field' => 'f.last_comment_timestamp'),
- );
- $order = _forum_get_topic_order($sortby);
- for ($i = 0; $i < count($forum_topic_list_header); $i++) {
- if ($forum_topic_list_header[$i]['field'] == $order['field']) {
- $forum_topic_list_header[$i]['sort'] = $order['sort'];
- }
- }
- $query = db_select('forum_index', 'f')->extend('PagerDefault')->extend('TableSort');
- $query->fields('f');
- $query
- ->condition('f.tid', $tid)
- ->addTag('node_access')
- ->orderBy('f.sticky', 'DESC')
- ->orderByHeader($forum_topic_list_header)
- ->limit($forum_per_page);
- $count_query = db_select('forum_index', 'f');
- $count_query->condition('f.tid', $tid);
- $count_query->addExpression('COUNT(*)');
- $count_query->addTag('node_access');
- $query->setCountQuery($count_query);
- $result = $query->execute();
- $nids = array();
- foreach ($result as $record) {
- $nids[] = $record->nid;
- }
- if ($nids) {
- $query = db_select('node', 'n')->extend('TableSort');
- $query->fields('n', array('title', 'nid', 'type', 'sticky', 'created', 'uid'));
- $query->addField('n', 'comment', 'comment_mode');
- $query->join('node_comment_statistics', 'ncs', 'n.nid = ncs.nid');
- $query->fields('ncs', array('cid', 'last_comment_uid', 'last_comment_timestamp', 'comment_count'));
- $query->join('forum_index', 'f', 'f.nid = ncs.nid');
- $query->addField('f', 'tid', 'forum_tid');
- $query->join('users', 'u', 'n.uid = u.uid');
- $query->addField('u', 'name');
- $query->join('users', 'u2', 'ncs.last_comment_uid = u2.uid');
- $query->addExpression('CASE ncs.last_comment_uid WHEN 0 THEN ncs.last_comment_name ELSE u2.name END', 'last_comment_name');
- $query
- ->orderBy('f.sticky', 'DESC')
- ->orderByHeader($forum_topic_list_header)
- ->condition('n.nid', $nids);
- $result = $query->execute();
- }
- else {
- $result = array();
- }
- $topics = array();
- $first_new_found = FALSE;
- foreach ($result as $topic) {
- if ($user->uid) {
-
-
- if ($topic->forum_tid != $tid) {
- $topic->new = 0;
- }
- else {
- $history = _forum_user_last_visit($topic->nid);
- $topic->new_replies = comment_num_new($topic->nid, $history);
- $topic->new = $topic->new_replies || ($topic->last_comment_timestamp > $history);
- }
- }
- else {
-
- $topic->new_replies = 0;
- $topic->new = 0;
- }
-
- $topic->first_new = FALSE;
- if ($topic->new != 0 && !$first_new_found) {
- $topic->first_new = TRUE;
- $first_new_found = TRUE;
- }
- if ($topic->comment_count > 0) {
- $last_reply = new stdClass();
- $last_reply->created = $topic->last_comment_timestamp;
- $last_reply->name = $topic->last_comment_name;
- $last_reply->uid = $topic->last_comment_uid;
- $topic->last_reply = $last_reply;
- }
- $topics[] = $topic;
- }
- return $topics;
- }
- function template_preprocess_forums(&$variables) {
- global $user;
- $vid = variable_get('forum_nav_vocabulary', 0);
- $vocabulary = taxonomy_vocabulary_load($vid);
- $title = !empty($vocabulary->name) ? $vocabulary->name : '';
-
- $breadcrumb[] = l(t('Home'), NULL);
- if ($variables['tid']) {
- $breadcrumb[] = l($vocabulary->name, 'forum');
- }
- if ($variables['parents']) {
- $variables['parents'] = array_reverse($variables['parents']);
- foreach ($variables['parents'] as $p) {
- if ($p->tid == $variables['tid']) {
- $title = $p->name;
- }
- else {
- $breadcrumb[] = l($p->name, 'forum/' . $p->tid);
- }
- }
- }
- drupal_set_breadcrumb($breadcrumb);
- drupal_set_title($title);
- if ($variables['forums_defined'] = count($variables['forums']) || count($variables['parents'])) {
- if (!empty($variables['forums'])) {
- $variables['forums'] = theme('forum_list', $variables);
- }
- else {
- $variables['forums'] = '';
- }
- if ($variables['tid'] && !in_array($variables['tid'], variable_get('forum_containers', array()))) {
- $variables['topics'] = theme('forum_topic_list', $variables);
- drupal_add_feed('taxonomy/term/' . $variables['tid'] . '/feed', 'RSS - ' . $title);
- }
- else {
- $variables['topics'] = '';
- }
-
-
- if ($variables['forums'] && !$variables['topics']) {
- $variables['theme_hook_suggestions'][] = 'forums__containers';
- $variables['theme_hook_suggestions'][] = 'forums__' . $variables['tid'];
- $variables['theme_hook_suggestions'][] = 'forums__containers__' . $variables['tid'];
- }
- elseif (!$variables['forums'] && $variables['topics']) {
- $variables['theme_hook_suggestions'][] = 'forums__topics';
- $variables['theme_hook_suggestions'][] = 'forums__' . $variables['tid'];
- $variables['theme_hook_suggestions'][] = 'forums__topics__' . $variables['tid'];
- }
- else {
- $variables['theme_hook_suggestions'][] = 'forums__' . $variables['tid'];
- }
- }
- else {
- drupal_set_title(t('No forums defined'));
- $variables['forums'] = '';
- $variables['topics'] = '';
- }
- }
- function template_preprocess_forum_list(&$variables) {
- global $user;
- $row = 0;
-
- foreach ($variables['forums'] as $id => $forum) {
- $variables['forums'][$id]->description = !empty($forum->description) ? filter_xss_admin($forum->description) : '';
- $variables['forums'][$id]->link = url("forum/$forum->tid");
- $variables['forums'][$id]->name = check_plain($forum->name);
- $variables['forums'][$id]->is_container = !empty($forum->container);
- $variables['forums'][$id]->zebra = $row % 2 == 0 ? 'odd' : 'even';
- $row++;
- $variables['forums'][$id]->new_text = '';
- $variables['forums'][$id]->new_url = '';
- $variables['forums'][$id]->new_topics = 0;
- $variables['forums'][$id]->old_topics = $forum->num_topics;
- $variables['forums'][$id]->icon_class = 'default';
- $variables['forums'][$id]->icon_title = t('No new posts');
- if ($user->uid) {
- $variables['forums'][$id]->new_topics = _forum_topics_unread($forum->tid, $user->uid);
- if ($variables['forums'][$id]->new_topics) {
- $variables['forums'][$id]->new_text = format_plural($variables['forums'][$id]->new_topics, '1 new', '@count new');
- $variables['forums'][$id]->new_url = url("forum/$forum->tid", array('fragment' => 'new'));
- $variables['forums'][$id]->icon_class = 'new';
- $variables['forums'][$id]->icon_title = t('New posts');
- }
- $variables['forums'][$id]->old_topics = $forum->num_topics - $variables['forums'][$id]->new_topics;
- }
- $variables['forums'][$id]->last_reply = theme('forum_submitted', array('topic' => $forum->last_post));
- }
-
- $variables['forum_id'] = $variables['tid'];
- unset($variables['tid']);
- }
- function template_preprocess_forum_topic_list(&$variables) {
- global $forum_topic_list_header;
-
- $ts = tablesort_init($forum_topic_list_header);
- $header = '';
- foreach ($forum_topic_list_header as $cell) {
- $cell = tablesort_header($cell, $forum_topic_list_header, $ts);
- $header .= _theme_table_cell($cell, TRUE);
- }
- $variables['header'] = $header;
- if (!empty($variables['topics'])) {
- $row = 0;
- foreach ($variables['topics'] as $id => $topic) {
- $variables['topics'][$id]->icon = theme('forum_icon', array('new_posts' => $topic->new, 'num_posts' => $topic->comment_count, 'comment_mode' => $topic->comment_mode, 'sticky' => $topic->sticky, 'first_new' => $topic->first_new));
- $variables['topics'][$id]->zebra = $row % 2 == 0 ? 'odd' : 'even';
- $row++;
-
-
-
- if ($variables['tid'] != $topic->forum_tid) {
- $variables['topics'][$id]->moved = TRUE;
- $variables['topics'][$id]->title = check_plain($topic->title);
- $variables['topics'][$id]->message = l(t('This topic has been moved'), "forum/$topic->forum_tid");
- }
- else {
- $variables['topics'][$id]->moved = FALSE;
- $variables['topics'][$id]->title = l($topic->title, "node/$topic->nid");
- $variables['topics'][$id]->message = '';
- }
- $variables['topics'][$id]->created = theme('forum_submitted', array('topic' => $topic));
- $variables['topics'][$id]->last_reply = theme('forum_submitted', array('topic' => isset($topic->last_reply) ? $topic->last_reply : NULL));
- $variables['topics'][$id]->new_text = '';
- $variables['topics'][$id]->new_url = '';
- if ($topic->new_replies) {
- $variables['topics'][$id]->new_text = format_plural($topic->new_replies, '1 new', '@count new');
- $variables['topics'][$id]->new_url = url("node/$topic->nid", array('query' => comment_new_page_count($topic->comment_count, $topic->new_replies, $topic), 'fragment' => 'new'));
- }
- }
- }
- else {
-
- $variables['topics'] = array();
- }
-
- $variables['topic_id'] = $variables['tid'];
- unset($variables['tid']);
- $variables['pager'] = theme('pager');
- }
- function template_preprocess_forum_icon(&$variables) {
- $variables['hot_threshold'] = variable_get('forum_hot_topic', 15);
- if ($variables['num_posts'] > $variables['hot_threshold']) {
- $variables['icon_class'] = $variables['new_posts'] ? 'hot-new' : 'hot';
- $variables['icon_title'] = $variables['new_posts'] ? t('Hot topic, new comments') : t('Hot topic');
- }
- else {
- $variables['icon_class'] = $variables['new_posts'] ? 'new' : 'default';
- $variables['icon_title'] = $variables['new_posts'] ? t('New comments') : t('Normal topic');
- }
- if ($variables['comment_mode'] == COMMENT_NODE_CLOSED || $variables['comment_mode'] == COMMENT_NODE_HIDDEN) {
- $variables['icon_class'] = 'closed';
- $variables['icon_title'] = t('Closed topic');
- }
- if ($variables['sticky'] == 1) {
- $variables['icon_class'] = 'sticky';
- $variables['icon_title'] = t('Sticky topic');
- }
- }
- function template_preprocess_forum_submitted(&$variables) {
- $variables['author'] = isset($variables['topic']->uid) ? theme('username', array('account' => $variables['topic'])) : '';
- $variables['time'] = isset($variables['topic']->created) ? format_interval(REQUEST_TIME - $variables['topic']->created) : '';
- }
- function _forum_user_last_visit($nid) {
- global $user;
- $history = &drupal_static(__FUNCTION__, array());
- if (empty($history)) {
- $result = db_query('SELECT nid, timestamp FROM {history} WHERE uid = :uid', array(':uid' => $user->uid));
- foreach ($result as $t) {
- $history[$t->nid] = $t->timestamp > NODE_NEW_LIMIT ? $t->timestamp : NODE_NEW_LIMIT;
- }
- }
- return isset($history[$nid]) ? $history[$nid] : NODE_NEW_LIMIT;
- }
- function _forum_get_topic_order($sortby) {
- switch ($sortby) {
- case 1:
- return array('field' => 'f.last_comment_timestamp', 'sort' => 'desc');
- break;
- case 2:
- return array('field' => 'f.last_comment_timestamp', 'sort' => 'asc');
- break;
- case 3:
- return array('field' => 'f.comment_count', 'sort' => 'desc');
- break;
- case 4:
- return array('field' => 'f.comment_count', 'sort' => 'asc');
- break;
- }
- }
- function _forum_update_forum_index($nid) {
- $count = db_query('SELECT COUNT(cid) FROM {comment} c INNER JOIN {forum_index} i ON c.nid = i.nid WHERE c.nid = :nid AND c.status = :status', array(
- ':nid' => $nid,
- ':status' => COMMENT_PUBLISHED,
- ))->fetchField();
- if ($count > 0) {
-
- $last_reply = db_query_range('SELECT cid, name, created, uid FROM {comment} WHERE nid = :nid AND status = :status ORDER BY cid DESC', 0, 1, array(
- ':nid' => $nid,
- ':status' => COMMENT_PUBLISHED,
- ))->fetchObject();
- db_update('forum_index')
- ->fields( array(
- 'comment_count' => $count,
- 'last_comment_timestamp' => $last_reply->created,
- ))
- ->condition('nid', $nid)
- ->execute();
- }
- else {
-
- $node = db_query('SELECT uid, created FROM {node} WHERE nid = :nid', array(':nid' => $nid))->fetchObject();
- db_update('forum_index')
- ->fields( array(
- 'comment_count' => 0,
- 'last_comment_timestamp' => $node->created,
- ))
- ->condition('nid', $nid)
- ->execute();
- }
- }
- function forum_rdf_mapping() {
- return array(
- array(
- 'type' => 'node',
- 'bundle' => 'forum',
- 'mapping' => array(
- 'rdftype' => array('sioc:Post', 'sioct:BoardPost'),
- 'taxonomy_forums' => array(
- 'predicates' => array('sioc:has_container'),
- 'type' => 'rel',
- ),
- ),
- ),
- array(
- 'type' => 'taxonomy_term',
- 'bundle' => 'forums',
- 'mapping' => array(
- 'rdftype' => array('sioc:Container', 'sioc:Forum'),
- ),
- ),
- );
- }
|