Убил котенка... [решено]

Главные вкладки

Аватар пользователя Химический Али Химический Али 10 июля 2009 в 14:23

Зашел на форум и подумал: неудобно как-то - нельзя посомтреть новые сообщения только для форума. Трекер общий, все в кучу валится. Отсеять сообщения по типу материала или автору нельзя. Разве что отсортировать, но это все не то. И решил убить котенка.

Открыл tracker.module, вписал в функцию tracker_menu() следующее:

<?php
  $items
['tracker/forum'] = array(
    
'title' => 'Recent topics',
    
'page callback' => 'tracker_page_forum',
    
'access arguments' => array('access content'),
    
'weight' => 1,
    
'file' => 'tracker.pages.inc',
  ); 
?>

Затем открыл tracker.pages.inc, скопировал функцию tracker_page() в tracker_page_forum() и привел ее к такому виду:

<?php
/**
 * Показывает обновленные или новые темы форума. 
 * В запросы добавлено AND n.type = \'forum\' чтобы отсеять форумские сообщения
 */
function tracker_page_forum($account NULL$set_title FALSE) {
  
// Add CSS
  
drupal_add_css(drupal_get_path('module''tracker') .'/tracker.css''module''all'FALSE);

  if (

$account) {
    if (
$set_title) {
      
// When viewed from user/%user/track, display the name of the user
      // as page title -- the tab title remains Track so this needs to be done
      // here and not in the menu definiton.
      
drupal_set_title(check_plain($account->name));
    }
  
// TODO: These queries are very expensive, see http://drupal.org/node/105639
    
$sql 'SELECT DISTINCT(n.nid), n.title, n.type, n.changed, n.uid, u.name, GREATEST(n.changed, l.last_comment_timestamp) AS last_updated, l.comment_count FROM {node} n INNER JOIN {node_comment_statistics} l ON n.nid = l.nid INNER JOIN {users} u ON n.uid = u.uid LEFT JOIN {comments} c ON n.nid = c.nid AND (c.status = %d OR c.status IS NULL) WHERE n.status = 1 AND n.type = \'forum\' AND (n.uid = %d OR c.uid = %d) ORDER BY last_updated DESC';
    
$sql db_rewrite_sql($sql);
    
$sql_count 'SELECT COUNT(DISTINCT(n.nid)) FROM {node} n LEFT JOIN {comments} c ON n.nid = c.nid AND (c.status = %d OR c.status IS NULL) WHERE n.status = 1 AND n.type = \'forum\' AND (n.uid = %d OR c.uid = %d)';
    
$sql_count db_rewrite_sql($sql_count);
    
$result pager_query($sql250$sql_countCOMMENT_PUBLISHED$account->uid$account->uid);
  }
  else {
    
$sql 'SELECT DISTINCT(n.nid), n.title, n.type, n.changed, n.uid, u.name, GREATEST(n.changed, l.last_comment_timestamp) AS last_updated, l.comment_count FROM {node} n INNER JOIN {users} u ON n.uid = u.uid INNER JOIN {node_comment_statistics} l ON n.nid = l.nid WHERE n.status = 1 AND n.type = \'forum\' ORDER BY last_updated DESC';
    
$sql db_rewrite_sql($sql);
    
$sql_count 'SELECT COUNT(n.nid) FROM {node} n WHERE n.status = 1 AND n.type = \'forum\'';
    
$sql_count db_rewrite_sql($sql_count);
    
$result pager_query($sql250$sql_count);
  }

  

$rows = array();
  while (
$node db_fetch_object($result)) {
    
// Determine the number of comments:
    
$comments 0;
    if (
$node->comment_count) {
      
$comments $node->comment_count;

      if (

$new comment_num_new($node->nid)) {
        
$comments .= '<br />';
        
$comments .= l(format_plural($new'1 new''count new'), "node/$node->nid", array('query' => comment_new_page_count($node->comment_count$new$node), 'fragment' => 'new'));
      }
    }

    

// Добавим проверку чтобы показывать лишь обновленные или новые темы форума
    
if ($new$rows[] = array(
      
check_plain(node_get_types('name'$node->type)),
      
l($node->title"node/$node->nid") .' 'theme('mark'node_mark($node->nid$node->changed)),
      
theme('username'$node),
      array(
'class' => 'replies''data' => $comments),
      
t('!time ago', array('!time' => format_interval(time() - $node->last_updated)))
    );
  }

  if (!

$rows) {
    
$rows[] = array(array('data' => t('No posts available.'), 'colspan' => '5'));
  }

  

$header = array(t('Type'), t('Post'), t('Author'), t('Replies'), t('Last updated'));

  

$output '<div id="tracker">';
  
$output .= theme('table'$header$rows);

  

// Чтобы не показывался левый пейджер, задаем макс. число элементов (count($rows))
  
$output .= theme('pager'NULL25count($rows));
  
$output .= '</div>';

  return 

$output;
}

?>

Одним котенком меньше, зато «Новые сообщения» для форума есть Sad

Любителям котят предлагаю рассказать почему подобные типы сортировок недоступны из ядра и не добавляются другими модулями?

Комментарии

Аватар пользователя neochief neochief 11 июля 2009 в 2:05

"Химический Али" wrote:
Я не умею :-[

Да по большому счету вы уже все сделали.

1. Создайте папку (напр., chemical_tracker),

2. в ней файл chemical_tracker.info с таким содержанием:

name = Chemical Tracker
description = Chemical Tracker rocks!
core = 6.x

3. Потом еще файл chemical_tracker.module, в котором впишите:

<?php

function chemical_tracker_menu() {
  // Вставьте пункт меню описанный в статье (но без атрибута 'file')
}

// А сюда полностью функцию, которая в статье, но сразу в
// начале функции пропишите такое (без коммента, естественно):
//
// module_load_include( 'inc', 'tracker', 'tracker.pages');

И все! Делов-то.

Аватар пользователя Химический Али Химический Али 15 июля 2009 в 9:34

Пытаюсь сделать модуль. Устанавливается, но в меню соотв. пункта не появляется. Перехожу по tracker/forum - страница не найдена.

forum_tracker.info

<?php
name 
Forum Tracker
description 
Makes «New Messages» page.
dependencies[] = forum
dependencies
[] = tracker
package 
Other
version 
6.x-0.1
core 
6.x 
?>

forum_tracker.module


<?php

/**
 * Implementation of hook_help().
 */
function forum_tracker_help($path$arg) {
  switch (
$path) {
    case 
'admin/help#forum_tracker':
      
$output '<p>'t('The Forum Tracker module allows you to see new topics and replies in the forum as in the tracker.') .'</p>';
      return 
$output;
  }
}

/**
 * Implementation of hook_menu().
 */
function forum_tracker_menu() {
  
$items['tracker/forum'] = array(
    
'title' => 'Recent topics and replies',
    
'page callback' => 'tracker_page_forum',
    
'access arguments' => array('access content'),
    
'weight' => 1,
  ); 
}
 
/**
 * Shows new topics and replies in the forum. 
 */
function tracker_page_forum($account NULL$set_title FALSE) {
  
module_load_include'inc''tracker''tracker.pages');
  
// как и раньше
}?>
Аватар пользователя seaji seaji 14 июля 2009 в 14:36

Нужно делать так:

<?php
function forum_tracker_menu() {
  
$items['tracker/forum'] = array(
    
'title' => 'Recent topics and replies',
    
'page callback' => 'tracker_page_forum',
    
'access arguments' => array('access content'),
    
'weight' => 1,
  ); 
  return 
$items;
}
?>

функция должна возвращать итемы Smile
и не забудьте сделать сброс кеша или зайти на страницу со списком модулей, т.к. меню кешируется.

Аватар пользователя Химический Али Химический Али 14 июля 2009 в 22:29

Да, родил про возврат сам еще до падения сайта, потом не мог отписаться Smile Большое спасибо.

Новая проблема: желаю добавить ссылку на это вверху форума, там, где он выводит ссылку на создание новой темы.

Ссылка на добавление темы выводится в forums.tpl.php, а определяется в модуле forum функцией function template_preprocess_forums(&$variables).

Как мне туда врубиться из своего модуля и добавить свою ссылку?

Аватар пользователя neochief neochief 14 июля 2009 в 23:44
function forum_tracker_preprocess_forums(&$variables) {
  print_r($variables);
  // и дальше смотрим куда что вставлять
}

Только нужно почистить кеш после добавления функции.

Аватар пользователя Химический Али Химический Али 10 ноября 2015 в 11:46

Большое спасибо за помощь всем, и особенно Neochief!

В результате родился модуль forum_tracker. Он вставляет над списком форумов ссылку на страницу, где выводится список новых тем и сообщений на форуме аля трекер.

Модуль в приложении. Прошу погонять и сообщить об ошибках.