Как в drupal 6 сделать постраничный вывод своего запроса

Сегодня расскажу вам как в Drupal (пишу для 6 версии, для других вероятно будет аналогично) сделать постраничный вывод результатов своего запроса в базу данных.

Рассмотрим на примере задачки, которую недавно я применил в одном проекте:

Нужно вывести все посты в блогах разных пользователей, к которым текущий юзер оставлял комментарий. Это требовалось для того, чтобы показать юзеру к каким постам в чужих (и своем) блогах есть follow-ups - то есть комментарии, оставленные после его камента.

Итак, составляем запрос в базу данных (mysql), действие которого можно описать так:

• выбираем из таблицы comments все комментарии пользователя к разным материалам;
• группируем их по nid материала, при этом получая из группы самый последний комментарий;
• сортируем всю выдачу по временам добавления (в данном случае - по cid каментов, что равнозначно) последних комментариев в группах;
• в добавок, получаем дату создания материала и его заголовок.

$result = db_query('SELECT MAX(c.cid) maxcid, c.nid, n.title, n.created FROM {comments} c
                    LEFT JOIN {node} n ON (c.nid = n.nid)
                    WHERE c.uid = '.$user->uid.' GROUP BY c.nid ORDER BY maxcid DESC');

На данном этапе у нас есть запрос, который выдает некий список. Этот список теперь требуется вывести постранично, используя api drupal-а (то бишь стандартными средствами системы). Обычный способ постраничного вывода выглядит так (здесь $_items_per_page - моя переменная с количеством записей на странице):

$result = pager_query(
          db_rewrite_sql('SELECT MAX(c.cid) maxcid, c.nid, n.title, n.created FROM {comments} c
                         LEFT JOIN {node} n ON (c.nid = n.nid)
                         WHERE c.uid = '.$user->uid.' GROUP BY c.nid ORDER BY maxcid DESC'),
          $_items_per_page);

while ($row = db_fetch_object($result)) {
    print $row->maxcid.'<br />';
}

print theme('pager', NULL, $_items_per_page);

Однако пейджер не печатается, хоть и результатов заведомо больше, чем $_items_per_page. Пошерстив интернет и документацию по api drupal-а, оказалось, что проблема в использовании в исходном запросе конструкции GROUP BY. То есть из-за ее присутствия неверно создается запрос для получения общего количества результатов...

Выяснилось, что для таких случаев (то есть причиной этого может быть не только GROUP BY) есть возможность указать кастомный запрос определения общего количества в функции pager_query().

Таким образом проблема решилась с помощью такого кода:

$result = pager_query(
          db_rewrite_sql('SELECT MAX(c.cid) maxcid, c.nid, n.title, n.created FROM {comments} c
                         LEFT JOIN {node} n ON (c.nid = n.nid)
                         WHERE c.uid = '.$user->uid.' GROUP BY c.nid ORDER BY maxcid DESC'),
          $_items_per_page,
          0,
          'SELECT COUNT(DISTINCT nid) FROM {comments} WHERE uid = '.$user->uid);

while ($row = db_fetch_object($result)) {
    print $row->maxcid.'<br />';
}

print theme('pager', NULL, $_items_per_page);

Стоит иметь ввиду эту особенность для экономии в дальнейшем своего времени при разработке.

Добавить комментарий

Filtered HTML

  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешённые HTML-теги: <a> <em> <i> <strong> <b> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd> <p> <br>
  • Строки и параграфы переносятся автоматически.

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.
CAPTCHA
CAPTCHA на основе изображений
Введите код с картинки