headless_cms-1.0.3/modules/headless_cms_preview/src/Controller/HeadlessCmsPreviewNodeController.php
modules/headless_cms_preview/src/Controller/HeadlessCmsPreviewNodeController.php
<?php
declare(strict_types=1);
namespace Drupal\headless_cms_preview\Controller;
use Drupal\Core\Datetime\DateFormatterInterface;
use Drupal\Core\Entity\EntityRepositoryInterface;
use Drupal\Core\Render\RendererInterface;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\Core\Url;
use Drupal\headless_cms_preview\ConsumerHeadlessPreviewManager;
use Drupal\headless_cms_preview\PreviewToken\PreviewTokenManagerInterface;
use Drupal\node\Controller\NodeController;
use Drupal\node\NodeInterface;
/**
* Customized node controller.
*
* Adds preview buttons to revision overview.
*/
class HeadlessCmsPreviewNodeController extends NodeController {
/**
* {@inheritdoc}
*/
public function __construct(
DateFormatterInterface $date_formatter,
RendererInterface $renderer,
EntityRepositoryInterface $entity_repository,
protected readonly PreviewTokenManagerInterface $previewTokenManager,
protected readonly ConsumerHeadlessPreviewManager $consumerHeadlessPreviewManager,
) {
$this->dateFormatter = $date_formatter;
$this->renderer = $renderer;
$this->entityRepository = $entity_repository;
}
/**
* {@inheritdoc}
*
* Adds preview operation links to the existing overview page.
*/
public function revisionOverview(NodeInterface $node) {
$build = parent::revisionOverview($node);
/** @var \Drupal\node\NodeInterface|null $node */
$node = $this->entityRepository->getActive($node->getEntityTypeId(), $node->id());
$langcode = $node->language()->getId();
$node_storage = $this->entityTypeManager()->getStorage('node');
$build['node_revisions_table']['#header'][] = new TranslatableMarkup('Preview');
$current_revision_displayed = FALSE;
foreach ($this->getRevisionIds($node, $node_storage) as $i => $vid) {
/** @var \Drupal\node\NodeInterface $revision */
$revision = $node_storage->loadRevision($vid);
// Only show revisions that are affected by the language that is being
// displayed.
if ($revision->hasTranslation($langcode) && $revision->getTranslation($langcode)->isRevisionTranslationAffected()) {
$is_current_revision = $revision->isDefaultRevision() || (!$current_revision_displayed && $revision->wasDefaultRevision());
if ($is_current_revision) {
$current_revision_displayed = TRUE;
}
if (!$is_current_revision) {
$tokenValue = $this->previewTokenManager->encode(
(string) $this->currentUser()->id(),
$node->uuid(),
$node->getEntityTypeId(),
$node->bundle(),
);
$urls = $this->consumerHeadlessPreviewManager->getRevisionUrlsForAllConsumers(
$node->getEntityTypeId(),
$node->bundle(),
$node->uuid(),
(string) $vid,
$tokenValue,
);
$urlBuild = [];
$j = 0;
foreach ($urls as $consumerLabel => $url) {
$j++;
$urlBuild['preview_' . $i] = [
'title' => $consumerLabel,
'url' => Url::fromUri($url, [
'attributes' => [
'target' => '_blank',
],
]),
];
}
$build['node_revisions_table']['#rows'][$i][] = [
'data' => [
'#type' => 'operations',
'#links' => [
'preview' => [
'title' => new TranslatableMarkup('Preview'),
'url' => Url::fromUserInput('#'),
],
...$urlBuild,
],
],
];
}
}
}
return $build;
}
}
