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

ср, 14.04.2010 11:03 :: olk
В этой части мы переделаем вывод страницы трэкера с учетом дополнительных данных сохраняемых в ноде. Нам надо исключить ноды помеченный как не публикуемые в трэкере, и поместить сверху списка ноды, помеченные как «закрепление вверху трэкера». Все изменения мы будем проводить в файле cctracker.page.inc.

Шаг номер 16:

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

  1.  
  2. function _cctracker_get_query($arg, $tp){
  3.   $cnt = variable_get('cctracker_node_per_page', 50);
  4.   $types = variable_get('cctracker_node_types', array());
  5.   $placeholder = db_placeholders($types, 'varchar');
  6.   switch ($tp) {
  7.     // Все материалы определенные для показа
  8.     case 'all':
  9.       // запишем  запрос в строку $sql в формате heredoc (что бы он был более читемым)
  10.       // в принципе данный запрос, возвращает все нужне нам данные
  11.       $sql = <<<EOT
  12. SELECT DISTINCT(n.nid) AS nid, n.title, n.type, n.changed, n.uid, n.created, u.name,
  13. GREATEST(n.changed, l.last_comment_timestamp) AS last_update,
  14. l.comment_count,nc.totalcount, nc.daycount,nc.timestamp AS lastread,
  15. n.promote,
  16. ncc.cc_sticky, ncc.cc_sticky_weight
  17. 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. LEFT JOIN {node_cctracker} ncc ON ncc.nid = n.nid
  23. WHERE (ncc.cc_not_public IS NULL  OR ncc.cc_not_public=0)
  24. ORDER BY ncc.cc_sticky DESC, ncc.cc_sticky_weight, last_update DESC
  25. EOT;
  26.       $sql = db_rewrite_sql($sql);
  27.      // этот запрос даст нам общее количество материалов в трэкере
  28.       $sql_cnt  =  'SELECT COUNT(n.nid) FROM {node} n  LEFT JOIN {node_cctracker} ncc ON ncc.nid = n.nid WHERE (ncc.cc_not_public IS NULL  OR ncc.cc_not_public=0)  AND n.status=1 AND n.type IN (' . $placeholder. ')';
  29.  
  30.       $sql_cnt = db_rewrite_sql($sql_cnt);
  31.       $result = pager_query($sql, $cnt, 0, $sql_cnt, $types);
  32.       break;
  33.     // Материалы с опубликованные текущим пользователем
  34.     case 'my-posts':
  35.       $sql = <<<EOT
  36. SELECT DISTINCT(n.nid) AS nid, n.title, n.type, n.changed, n.uid, n.created, u.name,
  37. GREATEST(n.changed, l.last_comment_timestamp) AS last_update,
  38. l.comment_count,nc.totalcount, nc.daycount,nc.timestamp AS lastread,
  39. n.promote,
  40. ncc.cc_sticky, ncc.cc_sticky_weight
  41. FROM {node} n
  42. INNER JOIN {node_comment_statistics} l ON n.nid = l.nid AND n.status=1 AND n.type IN ($placeholder) AND n.uid =%d
  43. LEFT JOIN {comments} c ON n.nid = c.nid
  44. LEFT JOIN {users} u ON u.uid=n.uid
  45. LEFT JOIN {node_counter} nc ON nc.nid = n.nid
  46. LEFT JOIN {node_cctracker} ncc ON ncc.nid = n.nid
  47. WHERE (ncc.cc_not_public IS NULL  OR ncc.cc_not_public=0)
  48. ORDER BY ncc.cc_sticky DESC, ncc.cc_sticky_weight,last_update DESC
  49. EOT;
  50.       $sql = db_rewrite_sql($sql);
  51.       $sql_cnt  =  'SELECT COUNT(n.nid) FROM {node} n LEFT JOIN {node_cctracker} ncc ON ncc.nid = n.nid  WHERE (ncc.cc_not_public IS NULL  OR ncc.cc_not_public=0)  AND n.status=1 AND n.type IN (' . $placeholder. ') AND n.uid = %d ';
  52.       $sql_cnt = db_rewrite_sql($sql_cnt);
  53.       $types[] = $arg->uid;
  54.       $result = pager_query($sql, $cnt, 0, $sql_cnt, $types);
  55.       break;
  56.     // Материалы с участием текущего пользователя
  57.     case 'my-recent-posts':
  58.       $sql = <<<EOT
  59. SELECT DISTINCT(n.nid) AS nid, n.title, n.type, n.changed, n.uid, n.created, u.name,
  60. GREATEST(n.changed, l.last_comment_timestamp) AS last_update,
  61. l.comment_count,nc.totalcount, nc.daycount,nc.timestamp AS lastread,
  62. n.promote,
  63. ncc.cc_sticky, ncc.cc_sticky_weight
  64. FROM {node} n
  65. INNER JOIN {node_comment_statistics} l ON n.nid = l.nid AND n.status=1 AND n.type IN ($placeholder)
  66. LEFT JOIN {comments} c ON n.nid = c.nid   AND (c.status = %d OR c.status IS NULL)
  67. LEFT JOIN {users} u ON u.uid=n.uid
  68. LEFT JOIN {node_counter} nc ON nc.nid = n.nid
  69. LEFT JOIN {node_cctracker} ncc ON ncc.nid = n.nid
  70. WHERE (n.uid = %d OR c.uid=%d) AND (ncc.cc_not_public IS NULL  OR ncc.cc_not_public=0)
  71. ORDER BY ncc.cc_sticky DESC, ncc.cc_sticky_weight, last_update DESC
  72. EOT;
  73.       $sql = db_rewrite_sql($sql);
  74.       $sql_cnt = <<<EOT
  75. SELECT COUNT(DISTINCT(n.nid)) FROM {node} n
  76. INNER JOIN {node_comment_statistics} l ON n.nid = l.nid AND n.status=1 AND n.type IN ($placeholder)
  77. LEFT JOIN {comments} c ON n.nid = c.nid   AND (c.status = %d OR c.status IS NULL)
  78. LEFT JOIN {node_cctracker} ncc ON ncc.nid = n.nid
  79. WHERE (n.uid = %d OR c.uid=%d) AND (ncc.cc_not_public IS NULL  OR ncc.cc_not_public=0)
  80. EOT;
  81.       $sql_cnt = db_rewrite_sql($sql_cnt);
  82.       $types[] = COMMENT_PUBLISHED;
  83.       $types[] = $arg->uid;
  84.       $types[] = $arg->uid;
  85.       $result = pager_query($sql, $cnt, 0, $sql_cnt, $types);
  86.       break;
  87.     // Материалы определенного типа
  88.     case 'tab-types':
  89.       $sql = <<<EOT
  90. SELECT DISTINCT(n.nid) AS nid, n.title, n.type, n.changed, n.uid, n.created, u.name,
  91.  GREATEST(n.changed, l.last_comment_timestamp) AS last_update,
  92.  l.comment_count,nc.totalcount, nc.daycount,nc.timestamp AS lastread,
  93.  n.promote,
  94.  ncc.cc_sticky, ncc.cc_sticky_weight
  95.  FROM {node} n
  96.  INNER JOIN {node_comment_statistics} l ON n.nid = l.nid AND n.status=1 AND n.type = '%s'
  97.  LEFT JOIN {comments} c ON n.nid = c.nid
  98.  LEFT JOIN {users} u ON u.uid=n.uid
  99.  LEFT JOIN {node_counter} nc ON nc.nid = n.nid
  100.  LEFT JOIN {node_cctracker} ncc ON ncc.nid = n.nid
  101.  WHERE (ncc.cc_not_public IS NULL  OR ncc.cc_not_public=0)
  102.  ORDER BY ncc.cc_sticky DESC, ncc.cc_sticky_weight, last_update DESC
  103. EOT;
  104.       $sql = db_rewrite_sql($sql);
  105.       $sql_cnt  =  'SELECT COUNT(n.nid) FROM {node} n  LEFT JOIN {node_cctracker} ncc ON ncc.nid = n.nid WHERE (ncc.cc_not_public IS NULL  OR ncc.cc_not_public=0)  AND n.status=1 AND n.type = \'%s\'';
  106.  
  107.       $sql_cnt = db_rewrite_sql($sql_cnt);
  108.       $result = pager_query($sql, $cnt, 0, $sql_cnt, $arg);
  109.       break;
  110.   }
  111.   return $result;
  112. }

Шаг номер 17:

Подправим функцию темизации - theme_cctracker_page. Добавим к элементам таблицы с «закрепленным» нодам класс cctracker-sticky, чтобы была возможность их как-то выделить в общем списке. Также добавим в вывод класс cctracker-promote, для темизации нод находящихся на главной странице сайта.

  1.  
  2. function theme_cctracker_page($tracker, $tp) {
  3.   $module_path = drupal_get_path('module', 'cctracker');
  4.   $header = array();
  5.   if ($tp != 'tab-types'){
  6.   $header[] = t('Type');
  7.   }
  8.   $header[] =  t('Post');
  9.   if ($tp != 'my-posts') {
  10.   $header[] =  t('Author');
  11.   }
  12.   $header[] =  t('Created');
  13.   $header[] =  t('Replies');
  14.   $header[] =  t('Last updated');
  15.   $rows = array();
  16.   foreach($tracker as $key => $value){
  17.       $comments = 0;
  18.       if ($value->comment_count) {
  19.         $comments = $value->comment_count;
  20.         if ($new = comment_num_new($value->nid)) {
  21.           $comments .= '<br />';
  22.           $comments .= l(format_plural($new, '1 new', '@count new'), 'node/'. $value->nid, array('fragment' => 'new'));
  23.         }
  24.       }
  25.      $row = array();
  26.      if ($tp != 'tab-types'){
  27.        $row[] = array('data' => check_plain(node_get_types('name', $value->type)), 'class' => 'cctracker-type-' . $value->type);
  28.      }
  29.      $row[] = array('data' => l($value->title,'node/'.$key) .' '. theme('mark', node_mark($value->nid, $value->changed)) , 'class' => 'cctracker-title');
  30.      if ($tp != 'my-posts') {
  31.        $row[] = array('data' => theme('username',$value), 'class' => 'cctracker-user');
  32.      }
  33.      $row[] = array('data' => format_date($value->created,'small'), 'class' => 'cctracker-date-created');
  34.      $row[] = array('data' => $comments, 'class' => 'cctracker-replies');
  35.      $row[] = array('data' => t('!time ago', array('!time' => format_interval(time()-$value->last_update))), 'class' => 'cctracker-last-update');
  36.      $rows[] = array('data'=>$row, 'id' => 'cctracker-' . $value->nid, 'class' => 'cctracker-row');
  37.   }
  38.   $output = theme('table', $header, $rows);
  39.   return $output;
  40. }
Добавить комментарий
« Добавить комментарий
» Добавить комментарий