Drupal: ссылки «предыдущая и следующая» в каждом узле? - PullRequest
3 голосов
/ 12 сентября 2010

Я хотел бы добавить кнопки «предыдущий» и «следующий» к каждому узлу моего веб-сайта Drupal.

Эти ссылки должны указывать на следующий узел в содержимом веб-сайта.

Как я могусделай это ?Спасибо

Ответы [ 7 ]

7 голосов
/ 25 января 2013

Вот версия кода aterchin для D7.

<?php
/**
* Previous / Next function for nodes, ordered by node creation date
*
* @param $current_node: node object or node id
* @param $node_types:  array of node types to query
*
* @return array
* 
*/
function MODULE_prev_next_node($current_node = NULL, $node_types = array()) {
    // make node object if only node id given
    if (!is_object($current_node)) { $current_node = node_load($current_node->nid); }

    // make an array if string value was given
    if (!is_array($node_types)) { $node_types = array($node_types); }

    // previous
    $prev = db_select('node', 'n')
    ->fields('n',array('nid','title','created'))
    ->condition('n.status', 1,'=')
    ->condition('n.type', $node_types,'IN')
    ->condition('n.created', $current_node->created,'<')
    ->orderBy('created','DESC')
    ->range(0,1)
    ->execute()
    ->fetchAssoc();

    // next or false if none
    $next = db_select('node', 'n')
    ->fields('n',array('nid','title','created'))
    ->condition('n.status', 1,'=')
    ->condition('n.type', $node_types,'IN')
    ->condition('n.created', $current_node->created,'>')
    ->orderBy('created','ASC')
    ->range(0,1)
    ->execute()
    ->fetchAssoc();

    return array('prev' => $prev, 'next' => $next);
}
?>
4 голосов
/ 19 декабря 2016

Используя Drupal 8, я закончил тем, что создал расширение ветки, расположенное в modules / MY_MODULE / src / TwigExtension) (где MODULE_NAME - имя компьютера вашего модуля, если вы не знаете, как создать собственный модуль D8, Вы можете обратиться к этому официальному сообщению )

namespace Drupal\MODULE_NAME\TwigExtension;

use Drupal\node\Entity\Node;

class PrevNextNode extends \Twig_Extension {
    /**
     * Generates a list of all Twig filters that this extension defines.
     */
    public function getFunctions() {
        return [
            new \Twig_SimpleFunction('customPrevious', array($this, 'customPrevious')),
            new \Twig_SimpleFunction('customNext', array($this, 'customNext'))
        ];
    }

    /**
     * Gets a unique identifier for this Twig extension.
     */
    public function getName() {
        return 'custom.prevnextnode_extension';
    }

    /**
     * Previous node
     * @param $prevNextInfo
     * @return array|bool
     */
    public function customPrevious($prevNextInfo)
    {
        $node = Node::load($prevNextInfo['nid']);
        return $this->getNodeInformation($prevNextInfo['node_type'], $node->getCreatedTime(), '<', 'DESC');
    }

    /**
     * Next node
     * @param $prevNextInfo
     * @return array|bool
     */
    public function customNext($prevNextInfo)
    {
        $node = Node::load($prevNextInfo['nid']);
        return $this->getNodeInformation($prevNextInfo['node_type'], $node->getCreatedTime(), '>', 'ASC');
    }

    /**
     * Get current langcode
     * @return string
     */
    public function getCurrentLangcode()
    {
        return \Drupal::languageManager()->getCurrentLanguage()->getId();
    }

     /**
      * Previous or next node
      * @param $node_type
      * @param $date
      * @param $date_comparator
      * @param $sort_order
      * @return array|bool
      */
    public function getNodeInformation($node_type, $date, $date_comparator, $sort_order)
    {
        $prev_or_next = \Drupal::entityQuery('node')
            ->condition('type', $node_type)
            ->condition('status', 1)
            ->condition('created', $date, $date_comparator)
            ->sort('created', $sort_order)
            ->range(0, 1)
            ->execute()
        ;

        if(!$prev_or_next) return false;

        // Get the node itself
        $prev_or_next = Node::load(array_values($prev_or_next)[0]);
        // Get the available languages for the given node
        $available_languages = $prev_or_next->getTranslationLanguages();
        // If the current language is defined in the available languages array
        if(array_key_exists($this->getCurrentLangcode(), $available_languages)){
            // Get the translated node
            $translation = $prev_or_next->getTranslation($this->getCurrentLangcode());

            // Return the information you need, can be w/e you want.
            return [
                'title' => $translation->getTitle(),
                'id' => $translation->id(),
                'path' => $translation->toUrl()->toString()
            ];
        }

        return false;
    }
}

Тогда вам нужно зарегистрировать расширение ветки в качестве службы (MY_MODULE.services.yml, расположенной в modules / MY_MODULE).

services:
  # Next / Previous links on selected node pages. class: namespace of your extension
  custom.prevnextnode_extension:
    class: Drupal\MODULE_NAME\TwigExtension\PrevNextNode
    tags:
      - { name: twig.extension }

Очистите кеш вашего Drupal 8, и вы сможете использовать новые расширения веток в любом месте в своем HTML.

{# make sure you get 'content_type' and 'nid' parameters (a preprocess file would be a good start) #}
{%
    set prevNextInfo = { 'node_type': 'content_type', 'nid' : 10 }
%}

{% if prevNextInfo.node_type and prevNextInfo.nid and (customPrevious(prevNextInfo) or customNext(prevNextInfo)) %}
    <div id="node-pagination">
        {% if customPrevious(prevNextInfo) %}
            <a href="{{ customPrevious(prevNextInfo).path }}" class="pagination-btn pagination-prev">{{ 'Previous node' }} : {{ customPrevious(prevNextInfo).title }}</a>
        {% endif %}
        {% if customNext(prevNextInfo) %}
            <a href="{{ customNext(prevNextInfo).path }}" class="pagination-btn pagination-prev">{{ 'Next node' }} : {{ customNext(prevNextInfo).title }}</a>
        {% endif %}
    </div>
{% endif %}
2 голосов
/ 13 сентября 2010

Я думаю, что модуль Предыдущий / Следующий API может быть тем, что вы ищете.

со страницы модуля:

API для просмотра следующих / предыдущих узлов без перегрузки сервера базы данных.

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

2 голосов
/ 12 сентября 2010

Модуль Custom Pager делает именно то, что вы хотите. Вы можете использовать представление, чтобы определить, какие узлы являются следующими / предыдущими.

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

1 голос
/ 12 сентября 2010

другой способ: модуль "book" в комплекте drupal.

0 голосов
/ 04 мая 2012

Это делает и предыдущие / следующие запросы в одном и том же вызове функции и возвращает предыдущую / следующую информацию как массивМой предпочтительный способ заключается в повторном использовании кода.Параметры также более гибкие.

<?php
/**
* Previous / Next function for nodes, ordered by node creation date
*
* @param $current_node: node object or node id
* @param $node_types:  array of node types to query
*
* @return array
*/
function mymodule_prev_next_created($current_node = NULL, $node_types = array()) {
  // make node object if only node id given
  if (!is_object($current_node)) { $current_node = node_load($current_node->nid); }

  // make an array if string value was given
  if (!is_array($node_types)) { $node_types = array($node_types); }

  // previous
  $sql = "SELECT n.nid, n.title, n.created FROM {node} n
    WHERE n.created < %d AND n.type IN ('%s')
    AND n.status = 1 ORDER BY n.created DESC LIMIT 1";
  $result = db_query($sql, $current_node->created, implode("','", $node_types));
  $prev = db_fetch_object($result);

  // next
  $sql = "SELECT n.nid, n.title, n.created FROM {node} n
    WHERE n.created > %d AND n.type IN ('%s')
    AND n.status = 1 ORDER BY n.created ASC LIMIT 1";
  $result = db_query($sql, $current_node->created, implode("','", $node_types));
  $next = db_fetch_object($result);

  return array('prev' => $prev, 'next' => $next);
}
?>
0 голосов
/ 12 сентября 2010

TIMTOWDI, человек. Я бы использовал опцию, которая не требует дополнительных модулей, но вместо этого некоторые знания о том, как строится база данных Drupal (плюс немного базового SQL):

  • Создайте собственный шаблон для вашего типа узла,
  • В шаблоне добавьте запрос к базе данных, чтобы выбрать следующий и предыдущий узлы, в соответствии с вашими потребностями (отфильтруйте по желанию),
  • Извлечение URL этих двух узлов,
  • Разместите ссылки там, где они вам нужны.

Это немного сложно, но в конечном итоге гибко;)

...