vendor/sulu/sulu/src/Sulu/Bundle/PageBundle/Markup/Link/PageLinkProvider.php line 67

Open in your IDE?
  1. <?php
  2. /*
  3. * This file is part of Sulu.
  4. *
  5. * (c) Sulu GmbH
  6. *
  7. * This source file is subject to the MIT license that is bundled
  8. * with this source code in the file LICENSE.
  9. */
  10. namespace Sulu\Bundle\PageBundle\Markup\Link;
  11. use Sulu\Bundle\MarkupBundle\Markup\Link\LinkConfigurationBuilder;
  12. use Sulu\Bundle\MarkupBundle\Markup\Link\LinkItem;
  13. use Sulu\Bundle\MarkupBundle\Markup\Link\LinkProviderInterface;
  14. use Sulu\Bundle\PageBundle\Admin\PageAdmin;
  15. use Sulu\Component\Content\Document\RedirectType;
  16. use Sulu\Component\Content\Repository\Content;
  17. use Sulu\Component\Content\Repository\ContentRepositoryInterface;
  18. use Sulu\Component\Content\Repository\Mapping\MappingBuilder;
  19. use Sulu\Component\Security\Authentication\UserInterface;
  20. use Sulu\Component\Security\Authorization\AccessControl\AccessControlManagerInterface;
  21. use Sulu\Component\Webspace\Manager\WebspaceManagerInterface;
  22. use Symfony\Component\HttpFoundation\RequestStack;
  23. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  24. use Symfony\Contracts\Translation\TranslatorInterface;
  25. class PageLinkProvider implements LinkProviderInterface
  26. {
  27. public function __construct(
  28. protected ContentRepositoryInterface $contentRepository,
  29. protected WebspaceManagerInterface $webspaceManager,
  30. protected RequestStack $requestStack,
  31. private TranslatorInterface $translator,
  32. protected string $environment,
  33. private AccessControlManagerInterface $accessControlManager,
  34. private ?TokenStorageInterface $tokenStorage = null
  35. ) {
  36. }
  37. public function getConfiguration()
  38. {
  39. /** @var LinkConfigurationBuilder $configurationBuilder */
  40. $configurationBuilder = LinkConfigurationBuilder::create()
  41. ->setTitle($this->translator->trans('sulu_page.pages', [], 'admin'))
  42. ->setResourceKey('pages')
  43. ->setListAdapter('column_list')
  44. ->setDisplayProperties(['title'])
  45. ->setOverlayTitle($this->translator->trans('sulu_page.single_selection_overlay_title', [], 'admin'))
  46. ->setEmptyText($this->translator->trans('sulu_page.no_page_selected', [], 'admin'))
  47. ->setIcon('su-document');
  48. return $configurationBuilder;
  49. }
  50. public function preload(array $hrefs, $locale, $published = true)
  51. {
  52. $request = $this->requestStack->getCurrentRequest();
  53. $scheme = 'http';
  54. $domain = null;
  55. if ($request) {
  56. $scheme = $request->getScheme();
  57. $domain = $request->getHost();
  58. }
  59. $contents = $this->contentRepository->findByUuids(
  60. \array_unique(\array_values($hrefs)),
  61. $locale,
  62. MappingBuilder::create()
  63. ->setResolveUrl(true)
  64. ->addProperties(['title', 'published', 'external'])
  65. ->setOnlyPublished($published)
  66. ->setHydrateGhost(false)
  67. ->getMapping()
  68. );
  69. $contents = \array_filter($contents, function(Content $content) {
  70. $webspaceKey = $content->getWebspaceKey();
  71. $targetWebspace = $this->webspaceManager->findWebspaceByKey($webspaceKey);
  72. $security = $targetWebspace->getSecurity();
  73. $system = $security ? $security->getSystem() : null;
  74. if (!$targetWebspace->hasWebsiteSecurity()) {
  75. return true;
  76. }
  77. $userPermissions = $this->accessControlManager->getUserPermissionByArray(
  78. $content->getLocale(),
  79. PageAdmin::SECURITY_CONTEXT_PREFIX . $webspaceKey,
  80. $content->getPermissions(),
  81. $this->getCurrentUser(),
  82. $system
  83. );
  84. return !isset($userPermissions['view']) || $userPermissions['view'];
  85. });
  86. return \array_map(
  87. function(Content $content) use ($locale, $scheme, $domain) {
  88. return $this->getLinkItem($content, $locale, $scheme, $domain);
  89. },
  90. $contents
  91. );
  92. }
  93. /**
  94. * Returns new link item.
  95. *
  96. * @param string $locale
  97. * @param string $scheme
  98. *
  99. * @return LinkItem
  100. */
  101. protected function getLinkItem(Content $content, $locale, $scheme, $domain = null)
  102. {
  103. $published = !empty($content->getPropertyWithDefault('published'));
  104. if (RedirectType::EXTERNAL === $content->getNodeType()) {
  105. $external = $content->getPropertyWithDefault('external');
  106. $url = \is_string($external) ? $external : null;
  107. } else {
  108. $url = $this->webspaceManager->findUrlByResourceLocator(
  109. $content->getUrl(),
  110. $this->environment,
  111. $locale,
  112. $content->getWebspaceKey(),
  113. $domain,
  114. $scheme
  115. );
  116. }
  117. return new LinkItem($content->getId(), $content->getPropertyWithDefault('title'), $url, $published);
  118. }
  119. /**
  120. * Returns current user or null if no user is loggedin.
  121. *
  122. * @return UserInterface|null
  123. */
  124. private function getCurrentUser()
  125. {
  126. if (!$this->tokenStorage) {
  127. return null;
  128. }
  129. $token = $this->tokenStorage->getToken();
  130. if (!$token) {
  131. return null;
  132. }
  133. $user = $token->getUser();
  134. if ($user instanceof UserInterface) {
  135. return $user;
  136. }
  137. return null;
  138. }
  139. }