Ну вот мы и добрались до вывода трэкера. Сначала просто повторим стандартный вывод (c небольшими дополнениями). Для более структурированной организации нашего модуля, все, что связано с выводом, будем размещать во вновь созданном файле cctracker.page.inc
Шаг номер 6:
// $Id$
/**
* File: cctracker.module
* Enables extending tracking.
*/
/**
* Implementation of hook_menu().
*/
function cctracker_menu() {
$items['admin/settings/cctracker'] = array(
'title' => 'Cctracker',
'page callback' => 'drupal_get_form',
'page arguments' => array('cctracker_settings'),
'access arguments' => array('administer site configuration'),
'type' => MENU_NORMAL_ITEM,
'file' => 'cctracker.admin.inc',
);
$items['cctracker'] = array(
'title' => 'Recent posts',
'page callback' => 'cctracker_page',
'page arguments' => array(NULL),
'access arguments' => array('access content'),
'file' => 'cctracker.page.inc',
);
return $items;
}
/**
* Implementation of hook_theme().
*/
function cctracker_theme() {
return array(
// определяем файл шаблона для вывода трэкера
'cctracker_page_wrapper' => array(
'template' => 'cctracker-page-wrapper',
'arguments' => array('tracker' => NULL, 'pager' => NULL),
),
// определяем функцию темизации для рендеринга трэкера
'cctracker_page' => array(
'arguments' => array('tracker' => array()),
'file' => 'cctracker.page.inc',
),
);
}
Причем Друпал будет осуществлять поиск данного файла сначала в директории текущей темы, и только затем (если не найдет), в директории с модулем. Это дает достаточно простой способ переопределения шаблона, не затрагивая код модуля.
Шаг номер 7:
// $Id$
/**
* File: cctracker.page.inc
*/
function cctracker_page($account = NULL) {
$output = '';
$types = variable_get('cctracker_node_types', array());
$cnt = variable_get('cctracker_node_per_page', 50);
$placeholder = db_placeholders($types, 'varchar');
// запишем запрос в строку $sql в формате heredoc (что бы он был более читемым)
// в принципе данный запрос, возвращает все нужне нам данные
$sql = <<<EOT
SELECT DISTINCT(n.nid) AS nid, n.title, n.type, n.changed, n.uid, n.created, u.name,
GREATEST(n.changed, l.last_comment_timestamp) AS last_update,
l.comment_count,nc.totalcount, nc.daycount,nc.timestamp AS lastread FROM {node} n
INNER JOIN {node_comment_statistics} l ON n.nid = l.nid AND n.status=1 AND n.type IN ($placeholder)
LEFT JOIN {comments} c ON n.nid = c.nid
LEFT JOIN {users} u ON u.uid=n.uid
LEFT JOIN {node_counter} nc ON nc.nid = n.nid
ORDER BY last_update DESC
EOT;
$sql = db_rewrite_sql($sql);
// этот запрос даст нам общее количество материалов в трэкере
$sql_cnt = 'SELECT COUNT(n.nid) FROM {node} n WHERE n.status=1 AND n.type IN (' . $placeholder. ')';
$sql_cnt = db_rewrite_sql($sql_cnt);
$result = pager_query($sql, $cnt, 0, $sql_cnt, $types);
$tracker = array();
while ($items = db_fetch_object($result)) {
$tracker[$items->nid] = $items;
}
// здесь мы уже получили массив для с данными для текущей страниц
// в переменную $outtracker помещаем отренедеренный контент нашего трэкера
// за выврод трэкера отвечает функция темизации theme_cctracker_page
// ранее зарегистрированная в файле cctracker.module
$outtracker = theme('cctracker_page',$tracker);
// в переменную $pager мы помещаем отрендеренный пейджинг
$pager = theme('pager', NULL, $cnt, 0);
// теперь обе эти переменные передаем в файл шаблона
$output .= theme('cctracker_page_wrapper',$outtracker,$pager);
return $output;
}
function theme_cctracker_page($tracker) {
$header = array(t('Type'), t('Post'), t('Author'), t('Public date'),t('Replies'), t('Last updated'));
$rows = array();
foreach($tracker as $key => $value){
$comments = 0;
if ($value->comment_count) {
$comments = $value->comment_count;
if ($new = comment_num_new($value->nid)) {
$comments .= '<br />';
$comments .= l(format_plural($new, '1 new', '@count new'), 'node/'. $value->nid, array('fragment' => 'new'));
}
}
$row = array(
array('data' => check_plain(node_get_types('name', $value->type)), 'class' => 'cctracker-type-' . $value->type),
array('data' => l($value->title,'node/'.$key) .' '. theme('mark', node_mark($value->nid, $value->changed)), 'class' => 'cctracker-title'),
array('data' => theme('username',$value), 'class' => 'cctracker-user'),
array('data' => format_date($value->created,'small'), 'class' => 'cctracker-date-created'),
array('data' => $comments, 'class' => 'cctracker-replies'),
array('data' => t('!time ago', array('!time' => format_interval(time()-$value->last_update))), 'class' => 'cctracker-last-update'),
);
$rows[] = array('data'=>$row, 'id' => 'cctracker-' . $value->nid);
}
$output = theme('table', $header, $rows);
return $output;
}
<?php
print $tracker;
print $pager;
?>
</div>
При любых манипуляциях с темизацией, не забывайте сбрасывать кэш регистра тем. Самый простой способ это сделать, зайти на страницу настройки тем и нажать кнопку сохранить
