View source
<?php
namespace Drupal\quick_node_block\Plugin\Block;
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Cache\Cache;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Entity\EntityDisplayRepositoryInterface;
use Drupal\Core\Routing\RouteMatchInterface;
class QuickNodeBlock extends BlockBase implements ContainerFactoryPluginInterface {
protected $routeMatch;
protected $entityTypeManager;
protected $entityDisplay;
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_display.repository'));
}
public function __construct(array $configuration, $plugin_id, $plugin_definition, RouteMatchInterface $routeMatch, EntityTypeManagerInterface $entityTypeManager, EntityDisplayRepositoryInterface $entityDisplay) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->routeMatch = $routeMatch;
$this->entityTypeManager = $entityTypeManager;
$this->entityDisplay = $entityDisplay;
}
public function blockForm($form, FormStateInterface $form_state) {
$form = parent::blockForm($form, $form_state);
$config = $this
->getConfiguration();
$form['quick_node'] = [
'#type' => 'textfield',
'#title' => $this
->t('Node'),
'#description' => $this
->t('What node do you want to show? You can write a node number or node title.'),
'#required' => TRUE,
'#autocomplete_route_name' => 'quick_node_block.autocomplete',
'#default_value' => $config['quick_node'] ?? '',
'#ajax' => [
'wrapper' => 'quick-ajax-wrapper',
'callback' => [
$this,
'ajaxCallback',
],
'disable-refocus' => TRUE,
],
];
$nid_add = $this->routeMatch
->getParameter('node');
$element = $form_state
->getTriggeringElement();
if (!empty($element['#value'])) {
$node_title = $element['#value'];
}
elseif (!empty($nid_add)) {
$node = $this->entityTypeManager
->getStorage('node')
->load($nid_add);
$node_title = $node
->getTitle() . ' (' . $nid_add . ')';
$form['quick_node']['#default_value'] = $node_title;
$form['quick_node']['#attributes']['disabled'] = TRUE;
}
else {
$node_title = $config['quick_node'] ?? '';
}
preg_match("/.+\\s\\(([^\\)]+)\\)/", $node_title, $matches);
$nid = $matches[1] ?? '';
if (empty($nid)) {
$quick_display = $this
->getQuickDisplays();
}
else {
$storage = $this->entityTypeManager
->getStorage('node');
$node = $storage
->load($nid);
$content_type = $node
->getType();
$quick_display = $this->entityDisplay
->getViewModeOptionsByBundle('node', $content_type);
}
$form['quick_display'] = [
'#type' => 'select',
'#title' => $this
->t('Display'),
'#description' => $this
->t('How do you want the node to be displayed?. You must first choose a node.'),
'#required' => TRUE,
'#options' => $quick_display,
'#default_value' => $config['quick_display'] ?? '',
'#prefix' => '<div id="quick-ajax-wrapper">',
'#suffix' => '</div>',
'#states' => [
'visible' => [
':input[name$="[quick_node]"]' => [
[
'empty' => FALSE,
],
],
],
],
];
return $form;
}
public function ajaxCallback(array $form, FormStateInterface $form_state) {
$element = $form_state
->getTriggeringElement();
$node_title = $element['#value'];
preg_match("/.+\\s\\(([^\\)]+)\\)/", $node_title, $matches);
$nid = $matches[1];
$storage = $this->entityTypeManager
->getStorage('node');
$node = $storage
->load($nid);
$content_type = $node
->getType();
$view_mode = $this->entityDisplay
->getViewModeOptionsByBundle('node', $content_type);
$form['settings']['quick_display']['#options'] = $view_mode;
return $form['settings']['quick_display'];
}
public function blockValidate($form, FormStateInterface $form_state) {
$node_title = $form_state
->getValue('quick_node');
preg_match("/.+\\s\\(([^\\)]+)\\)/", $node_title, $matches);
$nid = $matches[1];
$query = $this->entityTypeManager
->getStorage('node')
->getQuery();
$values = $query
->condition('nid', $nid)
->execute();
if (empty($values)) {
$form_state
->setErrorByName('quick_node', $this
->t('The chosen node does not exist. Choose another one please.'));
}
return $form_state;
}
public function blockSubmit($form, FormStateInterface $form_state) {
parent::blockSubmit($form, $form_state);
$values = $form_state
->getValues();
$this->configuration['quick_node'] = $values['quick_node'];
$this->configuration['quick_display'] = $values['quick_display'];
}
public function build() {
$build = [];
$config = $this
->getConfiguration();
if (preg_match("/.+\\s\\(([^\\)]+)\\)/", $config['quick_node'], $matches)) {
$nid = $matches[1];
$view_mode = $config['quick_display'];
$entity_type = 'node';
$view_builder = $this->entityTypeManager
->getViewBuilder($entity_type);
$storage = $this->entityTypeManager
->getStorage($entity_type);
if ($node = $storage
->load($nid)) {
$build = $view_builder
->view($node, $view_mode);
}
}
return $build;
}
protected function getQuickDisplays() {
return $this->entityDisplay
->getViewModeOptions('node');
}
public function getCacheTags() {
$config = $this
->getConfiguration();
if (isset($config['quick_node'])) {
preg_match("/.+\\s\\(([^\\)]+)\\)/", $config['quick_node'], $matches);
$nid = $matches[1];
return Cache::mergeTags(parent::getCacheTags(), [
"node:{$nid}",
]);
}
return parent::getCacheTags();
}
}