Вы здесь

Небольшая доработка сниппета перелистывания нод (Next/Prev)

1

Приветствую.
Снова, я.. и с вопросом.. но на то этот сайт и создан :)

Давно (даже уже не помню с какого сайта брал) использую вот такой сниппет для отображения Next/Prev ссылок на ноды (например, для блога/новостей/etc.).

В template.php пишем:

/**
 * Link to the previous node.
 */
function MYTHEME_previous_node($node) {
    $query = db_select('node', 'n');
    $query->fields('n', array('nid', 'title'));
    $query->condition('n.type', $node->type);
    $query->condition('n.created', $node->created, '<');
    $query->condition('n.status', NODE_PUBLISHED);
    $query->orderBy('n.created', 'DESC');
    $query->range(0, 1);
    $previous_node = $query->execute()->fetchObject();
    if ($previous_node) {
        // Выводим стрелочку влево, в качестве ссылки.
        // Иконка из набора Font Awesome.
        return l('<i class="chevron left icon"></i>', 'node/' . $previous_node->nid);
    }
    return '';
}

/**
 * Link to the next node.
 */
function MYTHEME_next_node($node) {
    $query = db_select('node', 'n');
    $query->fields('n', array('nid', 'title'));
    $query->condition('n.type', $node->type);
    $query->condition('n.created', $node->created, '>');
    $query->condition('n.status', NODE_PUBLISHED);
    $query->orderBy('n.created', 'ASC');
    $query->range(0, 1);
    $next_node = $query->execute()->fetchObject();
    if ($next_node) {
        // Выводим стрелочку вправо, в качестве ссылки.
        // Иконка из набора Font Awesome.
        return l('<i class="chevron right icon"></i>', 'node/' . $next_node->nid);
    }
    return '';
}

В шаблоне темы, например, в node--blog.tpl.php пишем:

...
<?php
    // Выводим стрелочку влево.
    $vars['previous_node'] = MYTHEME_previous_node($node);
    if ($vars['previous_node']) print $vars['previous_node'];
?>
...
<?php 
    // Выводим стрелочку вправо.
    $vars['next_node'] = MYTHEME_next_node($node);
    if ($vars['next_node']) print $vars['next_node'];
?>
...

Работает всё отлично, ноды листаются.

Но появилась мысль сделать некий фильтр по пользователю (автору поста), чтобы листались не только все ноды определённого типа материала по дате создания (как уже реализовано), но и по UID (пользователю, который создал эту ноду). Поясню «зачем это надо?».

Посетитель сайта зашёл на страницу блога (где все посты), перешёл на любой из постов, ему понравилось как пишет автор и он (допустим) захотел посмотреть ещё посты именно этого автора. Далее, посетитель видит Next/Prev стрелочки внизу поста и (логично) понимает, что это ведёт его на другие статьи именно этого автора, а не просто на следующий $node->nid из БД сайта.

Отсюда вопрос: как доработать сниппет (выше) до желаемого результата?

P.S. думаю, что данное решение будет полезно, как замена модуля Previous/Next API.

Версия Drupal: 
7.x
Категория: 
Database API
Вопрос задан 04.09.2015 - 13:53

Ответы

1
/**
 * Link to the previous node.
 */
function MYTHEME_previous_node($node) {
  $query = db_select('node', 'n');
  $query->fields('n', array('nid', 'title'));
  // Добавляем условие по uid автора ноды.
  $query->condition('n.uid', $node->uid);
  $query->condition('n.type', $node->type);
  $query->condition('n.created', $node->created, '<');
  $query->condition('n.status', NODE_PUBLISHED);
  $query->orderBy('n.created', 'DESC');
  $query->range(0, 1);
  $previous_node = $query->execute()->fetchObject();
  if ($previous_node) {
    // Выводим стрелочку влево, в качестве ссылки.
    return l('<i class="chevron grey left large icon"></i>', 'node/' . $previous_node->nid);
  }
  return '';
}

аналогично для MYTHEME_next_node()

Ответ дан 04.09.2015 - 14:14
Аватар пользователя drupby
drupby
456

О, доехало до меня какую фигню спросил.. всё, надо ложиться поспать :)
Спасибо большое за подсказку, drupby!

Финальный код будет такой (в template.php):

/**
 * Link to the previous node.
 */
function MYTHEME_previous_node($node) {
    $query = db_select('node', 'n');
    $query->fields('n', array('nid', 'title'));
    $query->condition('n.type', $node->type);

    // Проверка по пользователю из $node
    $query->condition('n.uid', $node->uid);

    $query->condition('n.created', $node->created, '<');
    $query->condition('n.status', NODE_PUBLISHED);
    $query->orderBy('n.created', 'DESC');
    $query->range(0, 1);
    $previous_node = $query->execute()->fetchObject();
    if ($previous_node) {
        // Выводим стрелочку влево, в качестве ссылки.
        // Иконка из набора Font Awesome.
        return l('<i class="chevron left icon"></i>', 'node/' . $previous_node->nid);
    }
    return '';
}

/**
 * Link to the next node.
 */
function MYTHEME_next_node($node) {
    $query = db_select('node', 'n');
    $query->fields('n', array('nid', 'title'));
    $query->condition('n.type', $node->type);

    // Проверка по пользователю из $node
    $query->condition('n.uid', $node->uid);

    $query->condition('n.created', $node->created, '>');
    $query->condition('n.status', NODE_PUBLISHED);
    $query->orderBy('n.created', 'ASC');
    $query->range(0, 1);
    $next_node = $query->execute()->fetchObject();
    if ($next_node) {
        // Выводим стрелочку вправо, в качестве ссылки.
        // Иконка из набора Font Awesome.
        return l('<i class="chevron right icon"></i>', 'node/' . $next_node->nid);
    }
    return '';
}
Комментарий оставлен 04.09.2015 - 14:22