我想在Drupal网站的每个节点上添加上一个和下一个按钮。
这些链接应该指向网站内容中的下一个节点。
我该怎么做? 感谢
答案 0 :(得分:6)
这是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);
}
?>
答案 1 :(得分:4)
使用Drupal 8,我最终在modules / MY_MODULE / src / TwigExtension中创建了一个twig扩展名(如果您不知道如何创建自定义D8模块,那么MODULE_NAME就是您的模块机器名称,{ {3}})
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;
}
}
然后您必须将您的枝条扩展名注册为服务(位于modules / MY_MODULE中的MY_MODULE.services.yml)。
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 :(得分:2)
Custom Pager module完全符合您的要求。您可以使用视图来定义下一个/上一个节点。
如果您正在使用图像模块,则图像的自定义寻呼机设置在文档中。
答案 3 :(得分:2)
我认为Previous/Next API模块可能正是您所需要的。
从模块页面:
用于浏览下一个/上一个节点而不会使数据库服务器过载的API。
此模块允许您了解任何给定节点的上一个或下一个节点。这对于向用户提供导航链接非常有用,而无需动态推断此类信息所需的昂贵查询。
答案 4 :(得分:1)
其他方式:drupal包中的“book”模块。
答案 5 :(得分:0)
TIMTOWDI,伙计。我使用一个不需要额外模块的选项,而是了解如何构建Drupal数据库(以及一些基本的SQL):
这有点复杂,但最终是灵活的;)
答案 6 :(得分:0)
这会在同一个函数调用中执行prev / next查询,并将prev / next信息作为数组返回。我首选的方法是重用代码。参数也更灵活。
<?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);
}
?>