Список документов пользователя


Автор документа

Имя
Сергей

Сайт
http://sergey.vilgelm.googlepages.com/

Выводит список документов пользователя в виде таблицы. За основу был взят сниппет Список документов в профиле пользователя — 2 и переделан. Выводится тип документа, заголовок, количество комментариев (количество новых), и статус ноды. Статус ноды выводится в виде иконок (положить в /misc/). Статусы такие: published|not published (показывается всегда), promoted (показывается только если выставлен), sticky (тоже, только если выставлен)

Сниппет работает для Drupal версий 5.x и 6.x без внесения исправлений!

UPD 24.01.2008: Исправил, модуль не правильно отображал количество страниц для постраничного просмотра таблицы
UPD 13.02.2008: Проверил на совместимость для Drupal 6.x


→ Для блока в профиле пользователей

<?php
    $nblimit
= variable_get('default_nodes_main', 20); // Ограничение по выдаваемому количеству нод

   
global $user;
   
$uid = arg(1);
    if (
arg(0) == 'user' && is_numeric($uid) && !arg(2)) {
       
$user_show = user_load(array ('uid' => $uid));
        if (
$user_show->uid) {
           
$sql = '
                SELECT
                    DISTINCT(n.nid),
                    n.title,
                    n.type,
                    GREATEST(n.changed, l.last_comment_timestamp) AS last_updated,
                    l.comment_count,
                    n.status,
                    n.promote,
                    n.sticky
                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 = '
.COMMENT_PUBLISHED.'
                        OR c.status IS NULL
                    )
                WHERE
                    n.uid = '
.$uid.'
                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 = '
.COMMENT_PUBLISHED.'
                        OR c.status IS NULL
                    )
                WHERE
                    n.uid = '
.$uid.'
            '
;
           
$sql_count = db_rewrite_sql($sql_count);
           
$result = pager_query($sql, $nblimit, 0, $sql_count);

           
$rows = array();
            while (
$node = db_fetch_object($result)) {
               
$comments = '';
                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, NULL, NULL, 'new');
                    }
                }

               
$status = '';
                if (
$node->status || $user->uid == $uid || user_access('administer nodes', $user)) {
                    if (
$node->status) {
                       
$status .= '<a title="'.t('published').'"><img src="/misc/published.png" alt="'.t('published').'" /></a>';
                    } else {
                       
$status .= '<a title="'.t('not published').'"><img src="/misc/not_published.png" alt="'.t('not published').'" /></a>';
                    }
                    if (
$node->promote) {
                       
$status .= '&nbsp;'.'<a title="'.t('promoted').'"><img src="/misc/promoted.png" alt="'.t('promoted').'" /></a>';
                    }
                    if (
$node->sticky) {
                       
$status .= '&nbsp;'.'<a title="'.t('sticky').'"><img src="/misc/sticky.png" alt="'.t('sticky').'" /></a>';
                    }
                }

               
$rows[] = array(
                   
check_plain(node_get_types('name', $node->type)), //Type
                   
l($node->title, 'node/'.$node->nid).' '.theme('mark', node_mark($node->nid, $node->changed)), //Post
                   
array('class' => 'replies', 'data' => $comments), //Replies
                   
$status //Status
               
);
            }

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

           
$header = array(
               
t('Type'),
               
t('Post'),
               
t('Replies'),
               
t('Status')
            );

           
$output = '<div>';
           
$output .= theme('table', $header, $rows);
           
$output .= theme('pager', NULL, $nblimit, 0);
           
$output .= '</div>';

            print
$output;
        }
    }
?>


→ Для страницы

<?php
    $nblimit
= 200; // Ограничение по выдаваемому количеству нод

   
global $user;
    if (
$user->uid) {
     
$sql = '
          SELECT
              DISTINCT(n.nid),
              n.title,
              n.type,
              GREATEST(n.changed, l.last_comment_timestamp) AS last_updated,
              l.comment_count,
              n.status,
              n.promote,
              n.sticky
          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 = '
.COMMENT_PUBLISHED.'
                  OR c.status IS NULL
              )
          WHERE
              n.uid = '
.$user->uid.'
          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 = '
.COMMENT_PUBLISHED.'
                  OR c.status IS NULL
              )
          WHERE
              n.uid = '
.$user->uid.'
      '
;
     
$sql_count = db_rewrite_sql($sql_count);
     
$result = pager_query($sql, $nblimit, 0, $sql_count);

     
$rows = array();
      while (
$node = db_fetch_object($result)) {
         
$comments = '';
          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, NULL, NULL, 'new');
              }
          }

         
$status = '';
          if (
$node->status) {
             
$status .= '<a title="'.t('published').'"><img src="/misc/published.png" alt="'.t('published').'" /></a>';
          } else {
             
$status .= '<a title="'.t('not published').'"><img src="/misc/not_published.png" alt="'.t('not published').'" /></a>';
          }
          if (
$node->promote) {
             
$status .= '&nbsp;'.'<a title="'.t('promoted').'"><img src="/misc/promoted.png" alt="'.t('promoted').'" /></a>';
          }
          if (
$node->sticky) {
             
$status .= '&nbsp;'.'<a title="'.t('sticky').'"><img src="/misc/sticky.png" alt="'.t('sticky').'" /></a>';
          }

         
$rows[] = array(
             
check_plain(node_get_types('name', $node->type)), //Type
             
l($node->title, 'node/'.$node->nid).' '.theme('mark', node_mark($node->nid, $node->changed)), //Post
             
array('class' => 'replies', 'data' => $comments), //Replies
             
$status //Status
         
);
      }

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

     
$header = array(
         
t('Type'),
         
t('Post'),
         
t('Replies'),
         
t('Status')
      );

     
$output = '<div><div>';
     
$output .= theme('table', $header, $rows);
     
$output .= '</div><div>';
     
$output .= theme('pager', NULL, $nblimit, 0);
     
$output .= '</div></div>';

      print
$output;
    }
    else {
     
drupal_not_found();
    }
?>

AttachmentSize
icons.7z2.43 KB

Comments

Подскажите пожалуйста, как добавить дату публикации документа и показывать в таблице только документы определенных типов.

В основной SQL ($sql) запрос в секцию SELECT добавить n.created (если нужна дата публикации) или n.changed (если нужна дата последнего изменения). В переменную $header в нужную вам позицию добавить название столбца (например t('Date'),) и в соответствующую позицию в переменной $row добавить format_date($node->created, 'small') или format_date($node->changed, 'small'), в зависимости от того, какая дата вам нужна
Для исключения например типа page и blog из выдачи в оба SQL запроса в секции WHERE добавте такой код: n.type NOT IN ('page', 'blog')

Большое спасибо!

Post new comment

The content of this field is kept private and will not be shown publicly.
Image CAPTCHA
Copy the characters (respecting upper/lower case) from the image.