View source
<?php
namespace Drupal\nextpre\Plugin\Block;
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Cache\Cache;
use Drupal\Core\Url;
use Drupal\Core\Link;
use Drupal\Core\Block\BlockPluginInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\node\NodeInterface;
use Drupal\Core\Routing\RouteMatchInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Entity\Query\QueryFactory;
class NextPreviousBlock extends BlockBase implements BlockPluginInterface, ContainerFactoryPluginInterface {
protected $routeMatch;
protected $entityTypeManager;
protected $queryFactory;
public function __construct(array $configuration, $plugin_id, $plugin_definition, RouteMatchInterface $route_match, EntityTypeManagerInterface $entityTypeManager, QueryFactory $queryFactory) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->routeMatch = $route_match;
$this->entityTypeManager = $entityTypeManager;
$this->queryFactory = $queryFactory;
}
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static($configuration, $plugin_id, $plugin_definition, $container
->get('current_route_match'), $container
->get('entity_type.manager'), $container
->get('entity.query'));
}
public function blockForm($form, FormStateInterface $form_state) {
$node_types = node_type_get_names();
$form['content_type'] = [
'#type' => 'select',
'#title' => $this
->t('Content Types'),
'#empty_option' => $this
->t('-None-'),
'#options' => $node_types,
'#default_value' => isset($this->configuration['content_type']) ? $this->configuration['content_type'] : '',
'#required' => TRUE,
];
$form['previous_text'] = [
'#type' => 'textfield',
'#title' => $this
->t('Previous text'),
'#description' => $this
->t('Add your previous button name'),
'#default_value' => isset($this->configuration['previous_text']) ? $this->configuration['previous_text'] : '',
'#required' => TRUE,
];
$form['next_text'] = [
'#type' => 'textfield',
'#title' => $this
->t('Next text'),
'#description' => $this
->t('Add your next button name'),
'#default_value' => isset($this->configuration['next_text']) ? $this->configuration['next_text'] : '',
'#required' => TRUE,
];
$form['previouslink_class'] = [
'#type' => 'textfield',
'#title' => $this
->t('Previous link class'),
'#description' => $this
->t('Add your class in previous link'),
'#default_value' => isset($this->configuration['previouslink_class']) ? $this->configuration['previouslink_class'] : '',
];
$form['nextlink_class'] = [
'#type' => 'textfield',
'#title' => $this
->t('Next link class'),
'#description' => $this
->t('Add your class in next link'),
'#default_value' => isset($this->configuration['nextlink_class']) ? $this->configuration['nextlink_class'] : '',
];
return $form;
}
public function blockSubmit($form, FormStateInterface $form_state) {
$values = $form_state
->getValues();
$this->configuration['content_type'] = $form_state
->getValue('content_type');
$this->configuration['previous_text'] = $values['previous_text'];
$this->configuration['next_text'] = $values['next_text'];
$this->configuration['previouslink_class'] = $values['previouslink_class'];
$this->configuration['nextlink_class'] = $values['nextlink_class'];
}
public function build() {
$link = [];
$node = $this->routeMatch
->getParameter('node');
if ($node instanceof NodeInterface && $node
->getType() == $this->configuration['content_type']) {
$current_nid = $node
->id();
$link['prev'] = $this
->generatePrevious($current_nid);
$link['next'] = $this
->generateNext($current_nid);
}
return $link;
}
public function getCacheTags() {
$node = $this->routeMatch
->getParameter('node');
if (!empty($node)) {
return Cache::mergeTags(parent::getCacheTags(), [
'node:' . $node
->id(),
]);
}
else {
return parent::getCacheTags();
}
}
public function getCacheContexts() {
return Cache::mergeContexts(parent::getCacheContexts(), [
'route',
]);
}
private function generatePrevious($current_nid) {
return $this
->generateNextPrevious($current_nid, 'prev');
}
private function generateNext($current_nid) {
return $this
->generateNextPrevious($current_nid, 'next');
}
const DIRECTION__NEXT = 'next';
private function generateNextPrevious($current_nid, $direction = self::DIRECTION__NEXT) {
$comparison_opperator = '>';
$sort = 'ASC';
$display_text = $this->configuration['next_text'];
$class = $this->configuration['nextlink_class'] ? $this->configuration['nextlink_class'] : 'btn';
if ($direction === 'prev') {
$comparison_opperator = '<';
$sort = 'DESC';
$display_text = $this->configuration['previous_text'];
$class = $this->configuration['previouslink_class'] ? $this->configuration['previouslink_class'] : 'btn';
}
$query = $this->entityTypeManager
->getStorage('node');
$query_result = $query
->getQuery();
$next = $query_result
->condition('nid', $current_nid, $comparison_opperator)
->condition('type', $this->configuration['content_type'])
->condition('status', 1)
->sort('nid', $sort)
->range(0, 1)
->execute();
if (!empty($next) && is_array($next)) {
$next = array_values($next);
$next = $next[0];
$nid = $next;
$url = Url::fromRoute('entity.node.canonical', [
'node' => $nid,
], []);
$link = Link::fromTextAndUrl($display_text, Url::fromUri('internal:/' . $url
->getInternalPath()));
$link = $link
->toRenderable();
$link['#attributes'] = [
'class' => [
'nextpre__btn',
$class,
],
];
return $link;
}
return '';
}
}