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;
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc