Drupal: "previous and next" links in each node?

I would like to add the previous and next buttons for each node of my Drupal website.

These links should point to the next node in the content of the website.

How can i do this? Thanks

+3
source share
7 answers

The Pager custom module does exactly what you want. You can use the view to determine which nodes are next / previous.

If you use the Image module, the user pager setting for images is provided in the documentation.

+2
source

Here is the version of Aterchin version 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);
}
?>
+5
source

Drupal 8, twig, /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, /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, twig , 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 %}
+3

, / API , .

:

API / .

node. , .

+2

: "book" drupal.

+1

TIMTOWDI, . Id , , , Drupal ( SQL):

  • node,
  • ( ),
  • URL- ,
  • post links where you need them.

It's a bit complicated, but ultimately flexible;)

0
source

This executes both previous and next requests in one function call and returns previous / next information as an array. My preferred method is code reuse. Options are also more flexible.

<?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
source

Source: https://habr.com/ru/post/1764364/


All Articles