From 845780e2670969d7756d5e2f263a9faaa94339f5 Mon Sep 17 00:00:00 2001 From: Rajeshreeputra Date: Mon, 20 Feb 2023 15:20:57 +0530 Subject: [PATCH 1/2] Add preview button display on unpublished nodes --- modules/next/css/next.site_preview.iframe.css | 2 +- modules/next/next.links.task.yml | 6 ++ modules/next/next.routing.yml | 15 +++ .../src/Controller/SitePreviewController.php | 99 +++++++++++++++++++ 4 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 modules/next/src/Controller/SitePreviewController.php diff --git a/modules/next/css/next.site_preview.iframe.css b/modules/next/css/next.site_preview.iframe.css index 0803bcb2..1ee5e394 100644 --- a/modules/next/css/next.site_preview.iframe.css +++ b/modules/next/css/next.site_preview.iframe.css @@ -33,7 +33,7 @@ color: #325e1c; } -.next-site-preview-toolbar .operations .live-link .button { +.next-site-preview-toolbar .operations .live-link .preview-link .button { margin-top: 0; margin-bottom: 0; } diff --git a/modules/next/next.links.task.yml b/modules/next/next.links.task.yml index c5b7ab1e..149f33f9 100644 --- a/modules/next/next.links.task.yml +++ b/modules/next/next.links.task.yml @@ -18,3 +18,9 @@ next.settings: route_name: next.settings base_route: next.settings weight: 20 + +entity.node.headless_preview: + title: Preview + route_name: entity.node.headless_preview + base_route: entity.node.canonical + weight: 5 diff --git a/modules/next/next.routing.yml b/modules/next/next.routing.yml index 7594d18c..ded2f2a3 100644 --- a/modules/next/next.routing.yml +++ b/modules/next/next.routing.yml @@ -26,3 +26,18 @@ next.validate_preview_url: requirements: _access: 'TRUE' _format: 'json' + +entity.node.headless_preview: + path: '/node/{node}/site-preview' + defaults: + _title_callback: '\Drupal\next\Controller\SitePreviewController::nodePreviewTitle' + _controller: '\Drupal\next\Controller\SitePreviewController::nodePreview' + requirements: + _entity_access: node.view + _module_dependencies: content_moderation + options: + _node_operation_route: TRUE + _admin_route: TRUE + parameters: + node: + type: entity:node diff --git a/modules/next/src/Controller/SitePreviewController.php b/modules/next/src/Controller/SitePreviewController.php new file mode 100644 index 00000000..16b1755a --- /dev/null +++ b/modules/next/src/Controller/SitePreviewController.php @@ -0,0 +1,99 @@ +nextEntityTypeManager = $nextEntityTypeManager; + $this->sitePreviewerManager = $sitePreviewerManager; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container) + { + return new static( + $container->get('next.entity_type.manager'), + $container->get('plugin.manager.next.site_previewer') + ); + } + + /** + * Displays the node title for preview. + * @param Node $node [description] + * @return string [description] + */ + public function nodePreviewTitle(Node $node) + { + return 'Preview: ' . $node->getTitle(); + } + + /** + * Displays the next.js site preview of a node. + */ + public function nodePreview(Node $node) + { + $storage = \Drupal::entityTypeManager()->getStorage($node->getEntityTypeId()); + $revision = $storage->loadRevision($storage->getLatestRevisionId($node->id())); + + $next_entity_type_config = $this->nextEntityTypeManager->getConfigForEntityType($revision->getEntityTypeId(), $revision->bundle()); + $sites = $next_entity_type_config->getSiteResolver()->getSitesForEntity($revision); + if (!count($sites)) { + throw new \Exception('Next.js sites for the entity could not be resolved.'); + } + + $config = $this->config('next.settings'); + $site_previewer_id = $config->get('site_previewer') ?? 'iframe'; + + /** @var \Drupal\next\Plugin\SitePreviewerInterface $site_previewer */ + $site_previewer = $this->sitePreviewerManager->createInstance($site_previewer_id, $config->get('site_previewer_configuration') ?? []); + if (!$site_previewer) { + throw new PluginNotFoundException('Invalid site previewer.'); + } + + // Build preview. + $preview = $site_previewer->render($revision, $sites); + + $context = [ + 'plugin' => $site_previewer, + 'entity' => $revision, + 'sites' => $sites, + ]; + + // Allow modules to alter the preview. + $this->moduleHandler()->alter('next_site_preview', $preview, $context); + + return $preview; + } +} From f698eeb71e8e3e9ccdf8d94cff3d1a8a88310979 Mon Sep 17 00:00:00 2001 From: Rajeshreeputra Date: Thu, 23 Feb 2023 09:17:11 +0530 Subject: [PATCH 2/2] PHPCS issue fixes. --- modules/next/next.install | 1 - .../src/Controller/SitePreviewController.php | 152 +++++++++--------- 2 files changed, 77 insertions(+), 76 deletions(-) diff --git a/modules/next/next.install b/modules/next/next.install index 0afb4e60..4b94c4e7 100644 --- a/modules/next/next.install +++ b/modules/next/next.install @@ -58,7 +58,6 @@ function next_update_9103() { } } - /** * Add the revalidator, revalidate_page and revalidate_paths to next_entity_type_config. */ diff --git a/modules/next/src/Controller/SitePreviewController.php b/modules/next/src/Controller/SitePreviewController.php index 16b1755a..e80b2b46 100644 --- a/modules/next/src/Controller/SitePreviewController.php +++ b/modules/next/src/Controller/SitePreviewController.php @@ -3,9 +3,9 @@ namespace Drupal\next\Controller; use Drupal\Core\Controller\ControllerBase; -use Drupal\node\Entity\Node; use Drupal\next\NextEntityTypeManager; use Drupal\next\Plugin\SitePreviewerManagerInterface; +use Drupal\node\Entity\Node; use Symfony\Component\DependencyInjection\ContainerInterface; /** @@ -16,84 +16,86 @@ * removed at any time without warning. External code should not extend or * use this class in any way! */ -class SitePreviewController extends ControllerBase -{ - /** - * The next entity type manager. - * - * @var \Drupal\next\NextEntityTypeManager - */ - protected $nextEntityTypeManager; - - /** - * The site previewer manager. - * - * @var \Drupal\next\Plugin\SitePreviewerManagerInterface - */ - protected $sitePreviewerManager; - - public function __construct(NextEntityTypeManager $nextEntityTypeManager, SitePreviewerManagerInterface $sitePreviewerManager) - { - $this->nextEntityTypeManager = $nextEntityTypeManager; - $this->sitePreviewerManager = $sitePreviewerManager; - } +class SitePreviewController extends ControllerBase { + /** + * The next entity type manager. + * + * @var \Drupal\next\NextEntityTypeManager + */ + protected $nextEntityTypeManager; + + /** + * The site previewer manager. + * + * @var \Drupal\next\Plugin\SitePreviewerManagerInterface + */ + protected $sitePreviewerManager; - /** - * {@inheritdoc} - */ - public static function create(ContainerInterface $container) - { - return new static( - $container->get('next.entity_type.manager'), - $container->get('plugin.manager.next.site_previewer') + /** + * + */ + public function __construct(NextEntityTypeManager $nextEntityTypeManager, SitePreviewerManagerInterface $sitePreviewerManager) { + $this->nextEntityTypeManager = $nextEntityTypeManager; + $this->sitePreviewerManager = $sitePreviewerManager; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container) { + return new static( + $container->get('next.entity_type.manager'), + $container->get('plugin.manager.next.site_previewer') ); - } + } + + /** + * Displays the node title for preview. + * + * @param \Drupal\node\Entity\Node $node + * [description]. + * + * @return string [description]. + */ + public function nodePreviewTitle(Node $node) { + return 'Preview: ' . $node->getTitle(); + } - /** - * Displays the node title for preview. - * @param Node $node [description] - * @return string [description] - */ - public function nodePreviewTitle(Node $node) - { - return 'Preview: ' . $node->getTitle(); + /** + * Displays the next.js site preview of a node. + */ + public function nodePreview(Node $node) { + $storage = \Drupal::entityTypeManager()->getStorage($node->getEntityTypeId()); + $revision = $storage->loadRevision($storage->getLatestRevisionId($node->id())); + + $next_entity_type_config = $this->nextEntityTypeManager->getConfigForEntityType($revision->getEntityTypeId(), $revision->bundle()); + $sites = $next_entity_type_config->getSiteResolver()->getSitesForEntity($revision); + if (!count($sites)) { + throw new \Exception('Next.js sites for the entity could not be resolved.'); } - /** - * Displays the next.js site preview of a node. - */ - public function nodePreview(Node $node) - { - $storage = \Drupal::entityTypeManager()->getStorage($node->getEntityTypeId()); - $revision = $storage->loadRevision($storage->getLatestRevisionId($node->id())); - - $next_entity_type_config = $this->nextEntityTypeManager->getConfigForEntityType($revision->getEntityTypeId(), $revision->bundle()); - $sites = $next_entity_type_config->getSiteResolver()->getSitesForEntity($revision); - if (!count($sites)) { - throw new \Exception('Next.js sites for the entity could not be resolved.'); - } - - $config = $this->config('next.settings'); - $site_previewer_id = $config->get('site_previewer') ?? 'iframe'; - - /** @var \Drupal\next\Plugin\SitePreviewerInterface $site_previewer */ - $site_previewer = $this->sitePreviewerManager->createInstance($site_previewer_id, $config->get('site_previewer_configuration') ?? []); - if (!$site_previewer) { - throw new PluginNotFoundException('Invalid site previewer.'); - } - - // Build preview. - $preview = $site_previewer->render($revision, $sites); - - $context = [ - 'plugin' => $site_previewer, - 'entity' => $revision, - 'sites' => $sites, - ]; - - // Allow modules to alter the preview. - $this->moduleHandler()->alter('next_site_preview', $preview, $context); - - return $preview; + $config = $this->config('next.settings'); + $site_previewer_id = $config->get('site_previewer') ?? 'iframe'; + + /** @var \Drupal\next\Plugin\SitePreviewerInterface $site_previewer */ + $site_previewer = $this->sitePreviewerManager->createInstance($site_previewer_id, $config->get('site_previewer_configuration') ?? []); + if (!$site_previewer) { + throw new PluginNotFoundException('Invalid site previewer.'); } + + // Build preview. + $preview = $site_previewer->render($revision, $sites); + + $context = [ + 'plugin' => $site_previewer, + 'entity' => $revision, + 'sites' => $sites, + ]; + + // Allow modules to alter the preview. + $this->moduleHandler()->alter('next_site_preview', $preview, $context); + + return $preview; + } + }