Пишем модуль под Drupal. Часть 3. Вывод трэкера.

ср, 31.03.2010 14:38 :: olk

Ну вот мы и добрались до вывода трэкера. Сначала просто повторим стандартный вывод (c небольшими дополнениями). Для более структурированной организации нашего модуля, все, что связано с выводом, будем размещать во вновь созданном файле cctracker.page.inc

Шаг номер 6:

Для ренедеринга мы будем использовать функции темизации нашего модуля. Что бы друпал узнал о наших функциях, будем использовать хук theme. Итак: в файл cctracker.module добавляем функцию cctracker_theme (этот хук регистрирует темы модуля в глобальном регистре тем Друпала, что в свою очередь позволяет вызывать функции темизации через функцию ядра theme('имя функции(без префикса theme_)');). Добавим в хук menu, путь доступа к нашей странице с трэкером.

  1. <?php
  2. // $Id$
  3. /**
  4.  * File: cctracker.module
  5.  * Enables extending tracking.
  6.  */
  7.  
  8. /**
  9.  * Implementation of hook_menu().
  10.  */
  11. function cctracker_menu() {
  12.   $items['admin/settings/cctracker'] = array(
  13.     'title' => 'Cctracker',
  14.     'page callback' => 'drupal_get_form',
  15.     'page arguments' => array('cctracker_settings'),
  16.     'access arguments' => array('administer site configuration'),
  17.     'type' => MENU_NORMAL_ITEM,
  18.     'file' => 'cctracker.admin.inc',
  19.   );
  20.   $items['cctracker'] = array(
  21.     'title' => 'Recent posts',
  22.     'page callback' => 'cctracker_page',
  23.     'page arguments' => array(NULL),
  24.     'access arguments' => array('access content'),
  25.     'file' => 'cctracker.page.inc',
  26.   );
  27.  
  28.   return $items;
  29. }
  30. /**
  31.  * Implementation of hook_theme().
  32.  */
  33. function cctracker_theme() {
  34.   return array(
  35.       // определяем файл шаблона для вывода трэкера
  36.       'cctracker_page_wrapper' => array(
  37.       'template' => 'cctracker-page-wrapper',
  38.       'arguments' => array('tracker' => NULL, 'pager' => NULL),
  39.       ),
  40.       // определяем функцию темизации для рендеринга трэкера
  41.       'cctracker_page' => array(
  42.       'arguments' => array('tracker' => array()),
  43.       'file' => 'cctracker.page.inc',
  44.       ),
  45.     );
  46. }
ключ, template задает только префикс названия файла, полностью файл должен называться префикс.tpl.php, или в нашем случае cctracker-page-wrapper.tpl.php. Причем Друпал будет осуществлять поиск данного файла сначала в директории текущей темы, и только затем (если не найдет), в директории с модулем. Это дает достаточно простой способ переопределения шаблона, не затрагивая код модуля.

Шаг номер 7:

Создаем в директории нашего модуля файл cctracker.page.inc. Добавляем в наш файл две функции: cctracker_page (которая будет формировать нам данные для вывода) и функцию темизации theme_cctracker_page (Функции темизации формируют непосредственно HTML контент из структурированных данных).

  1. <?php
  2. // $Id$
  3. /**
  4.  * File: cctracker.page.inc
  5.  */
  6.  
  7. function cctracker_page($account = NULL) {
  8.   $output = '';
  9.   $types = variable_get('cctracker_node_types', array());
  10.   $cnt = variable_get('cctracker_node_per_page', 50);
  11.   $placeholder = db_placeholders($types, 'varchar');
  12.   // запишем  запрос в строку $sql в формате heredoc (что бы он был более читемым)
  13.   // в принципе данный запрос, возвращает все нужне нам данные
  14.   $sql = <<<EOT
  15. SELECT DISTINCT(n.nid) AS nid, n.title, n.type, n.changed, n.uid, n.created, u.name,
  16. GREATEST(n.changed, l.last_comment_timestamp) AS last_update,
  17. l.comment_count,nc.totalcount, nc.daycount,nc.timestamp AS lastread FROM {node} n
  18. INNER JOIN {node_comment_statistics} l ON n.nid = l.nid AND n.status=1 AND n.type IN ($placeholder)
  19. LEFT JOIN {comments} c ON n.nid = c.nid
  20. LEFT JOIN {users} u ON u.uid=n.uid
  21. LEFT JOIN {node_counter} nc ON nc.nid = n.nid
  22. ORDER BY last_update DESC
  23. EOT;
  24.   $sql = db_rewrite_sql($sql);
  25.   // этот запрос даст нам общее количество материалов в трэкере
  26.   $sql_cnt  =  'SELECT COUNT(n.nid) FROM {node} n WHERE n.status=1 AND n.type IN (' . $placeholder. ')';
  27.   $sql_cnt = db_rewrite_sql($sql_cnt);
  28.   $result = pager_query($sql, $cnt, 0, $sql_cnt, $types);
  29.   $tracker = array();
  30.   while ($items = db_fetch_object($result)) {
  31.     $tracker[$items->nid] = $items;
  32.   }
  33.   // здесь мы уже получили массив для с данными для текущей страниц
  34.   // в переменную $outtracker помещаем отренедеренный контент нашего трэкера
  35.   // за выврод трэкера отвечает функция темизации theme_cctracker_page
  36.   // ранее зарегистрированная в файле cctracker.module
  37.   $outtracker = theme('cctracker_page',$tracker);
  38.   // в переменную $pager мы помещаем отрендеренный пейджинг
  39.   $pager = theme('pager', NULL, $cnt, 0);
  40.   // теперь обе эти переменные передаем в файл шаблона
  41.   $output .= theme('cctracker_page_wrapper',$outtracker,$pager);
  42.   return $output;
  43. }
  44.  
  45. function theme_cctracker_page($tracker) {
  46.   $header = array(t('Type'), t('Post'), t('Author'), t('Public date'),t('Replies'), t('Last updated'));
  47.   $rows = array();
  48.   foreach($tracker as $key => $value){
  49.       $comments = 0;
  50.       if ($value->comment_count) {
  51.         $comments = $value->comment_count;
  52.         if ($new = comment_num_new($value->nid)) {
  53.           $comments .= '<br />';
  54.           $comments .= l(format_plural($new, '1 new', '@count new'), 'node/'. $value->nid, array('fragment' => 'new'));
  55.         }
  56.       }
  57.      $row = array(
  58.        array('data' => check_plain(node_get_types('name', $value->type)), 'class' => 'cctracker-type-' . $value->type),
  59.        array('data' => l($value->title,'node/'.$key) .' '. theme('mark', node_mark($value->nid, $value->changed)), 'class' => 'cctracker-title'),
  60.        array('data' => theme('username',$value), 'class' => 'cctracker-user'),
  61.        array('data' => format_date($value->created,'small'), 'class' => 'cctracker-date-created'),
  62.        array('data' => $comments, 'class' => 'cctracker-replies'),
  63.        array('data' => t('!time ago', array('!time' => format_interval(time()-$value->last_update))), 'class' => 'cctracker-last-update'),
  64.     );
  65.     $rows[] = array('data'=>$row, 'id' => 'cctracker-' . $value->nid);
  66.   }
  67.   $output = theme('table', $header, $rows);
  68.   return $output;
  69. }
Также добавим в нашу директорию файл шаблона cctracker-page-wrapper.tpl.php со следующим кодом.

  1. <div id="cctracker">
  2. <?php
  3. print $tracker;
  4. print $pager;
  5. ?>
  6. </div>
Файл шаблона, дает нам возможность манипулировать отображением вывода трэкера, например пэйджинг можно установить над трэкером или даже вывести его и сверху и снизу. При любых манипуляциях с темизацией, не забывайте сбрасывать кэш регистра тем. Самый простой способ это сделать, зайти на страницу настройки тем и нажать кнопку сохранить
Добавить комментарий
« Добавить комментарий
» Добавить комментарий