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

ср, 31.03.2010 14:38 :: olk

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

Шаг номер 6:

Для ренедеринга мы будем использовать функции темизации нашего модуля. Что бы друпал узнал о наших функциях, будем использовать хук theme. Итак: в файл cctracker.module добавляем функцию cctracker_theme (этот хук регистрирует темы модуля в глобальном регистре тем Друпала, что в свою очередь позволяет вызывать функции темизации через функцию ядра theme('имя функции(без префикса theme_)');). Добавим в хук menu, путь доступа к нашей странице с трэкером.
<?php
// $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',
      ),
    );
}

ключ, template задает только префикс названия файла, полностью файл должен называться префикс.tpl.php, или в нашем случае cctracker-page-wrapper.tpl.php.
Причем Друпал будет осуществлять поиск данного файла сначала в директории текущей темы, и только затем (если не найдет), в директории с модулем. Это дает достаточно простой способ переопределения шаблона, не затрагивая код модуля.

Шаг номер 7:

Создаем в директории нашего модуля файл cctracker.page.inc. Добавляем в наш файл две функции: cctracker_page (которая будет формировать нам данные для вывода) и функцию темизации theme_cctracker_page (Функции темизации формируют непосредственно HTML контент из структурированных данных).
<?php
// $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;
}

Также добавим в нашу директорию файл шаблона cctracker-page-wrapper.tpl.php со следующим кодом.
<div id="cctracker">
<?php
print $tracker;
print $pager;
?>
</div>
Файл шаблона, дает нам возможность манипулировать отображением вывода трэкера, например пэйджинг можно установить над трэкером или даже вывести его и сверху и снизу.
При любых манипуляциях с темизацией, не забывайте сбрасывать кэш регистра тем. Самый простой способ это сделать, зайти на страницу настройки тем и нажать кнопку сохранить
Добавить комментарий
« Добавить комментарий
» Добавить комментарий