Render.php 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Ui\Controller\Adminhtml\Index;
  7. use Magento\Backend\App\Action\Context;
  8. use Magento\Ui\Controller\Adminhtml\AbstractAction;
  9. use Magento\Framework\View\Element\UiComponentFactory;
  10. use Magento\Framework\View\Element\UiComponentInterface;
  11. use Magento\Ui\Model\UiComponentTypeResolver;
  12. use Psr\Log\LoggerInterface;
  13. use Magento\Framework\Escaper;
  14. use Magento\Framework\Controller\Result\JsonFactory;
  15. /**
  16. * Render a component.
  17. *
  18. * @SuppressWarnings(PHPMD.AllPurposeAction)
  19. */
  20. class Render extends AbstractAction
  21. {
  22. /**
  23. * @var \Magento\Ui\Model\UiComponentTypeResolver
  24. */
  25. private $contentTypeResolver;
  26. /**
  27. * @var JsonFactory
  28. */
  29. private $resultJsonFactory;
  30. /**
  31. * @var Escaper
  32. */
  33. private $escaper;
  34. /**
  35. * @var LoggerInterface
  36. */
  37. private $logger;
  38. /**
  39. * @param Context $context
  40. * @param UiComponentFactory $factory
  41. * @param UiComponentTypeResolver $contentTypeResolver
  42. * @param JsonFactory|null $resultJsonFactory
  43. * @param Escaper|null $escaper
  44. * @param LoggerInterface|null $logger
  45. */
  46. public function __construct(
  47. Context $context,
  48. UiComponentFactory $factory,
  49. UiComponentTypeResolver $contentTypeResolver,
  50. JsonFactory $resultJsonFactory = null,
  51. Escaper $escaper = null,
  52. LoggerInterface $logger = null
  53. ) {
  54. parent::__construct($context, $factory);
  55. $this->contentTypeResolver = $contentTypeResolver;
  56. $this->resultJsonFactory = $resultJsonFactory ?: \Magento\Framework\App\ObjectManager::getInstance()
  57. ->get(\Magento\Framework\Controller\Result\JsonFactory::class);
  58. $this->escaper = $escaper ?: \Magento\Framework\App\ObjectManager::getInstance()
  59. ->get(\Magento\Framework\Escaper::class);
  60. $this->logger = $logger ?: \Magento\Framework\App\ObjectManager::getInstance()
  61. ->get(\Psr\Log\LoggerInterface::class);
  62. }
  63. /**
  64. * @inheritdoc
  65. */
  66. public function execute()
  67. {
  68. if ($this->_request->getParam('namespace') === null) {
  69. $this->_redirect('admin/noroute');
  70. return;
  71. }
  72. try {
  73. $component = $this->factory->create($this->getRequest()->getParam('namespace'));
  74. if ($this->validateAclResource($component->getContext()->getDataProvider()->getConfigData())) {
  75. $this->prepareComponent($component);
  76. $this->getResponse()->appendBody((string)$component->render());
  77. $contentType = $this->contentTypeResolver->resolve($component->getContext());
  78. $this->getResponse()->setHeader('Content-Type', $contentType, true);
  79. }
  80. } catch (\Magento\Framework\Exception\LocalizedException $e) {
  81. $this->logger->critical($e);
  82. $result = [
  83. 'error' => $this->escaper->escapeHtml($e->getMessage()),
  84. 'errorcode' => $this->escaper->escapeHtml($e->getCode())
  85. ];
  86. /** @var \Magento\Framework\Controller\Result\Json $resultJson */
  87. $resultJson = $this->resultJsonFactory->create();
  88. $resultJson->setStatusHeader(
  89. \Zend\Http\Response::STATUS_CODE_400,
  90. \Zend\Http\AbstractMessage::VERSION_11,
  91. 'Bad Request'
  92. );
  93. return $resultJson->setData($result);
  94. } catch (\Exception $e) {
  95. $this->logger->critical($e);
  96. $result = [
  97. 'error' => __('UI component could not be rendered because of system exception'),
  98. 'errorcode' => $this->escaper->escapeHtml($e->getCode())
  99. ];
  100. /** @var \Magento\Framework\Controller\Result\Json $resultJson */
  101. $resultJson = $this->resultJsonFactory->create();
  102. $resultJson->setStatusHeader(
  103. \Zend\Http\Response::STATUS_CODE_400,
  104. \Zend\Http\AbstractMessage::VERSION_11,
  105. 'Bad Request'
  106. );
  107. return $resultJson->setData($result);
  108. }
  109. }
  110. /**
  111. * Call prepare method in the component UI
  112. *
  113. * @param UiComponentInterface $component
  114. * @return void
  115. */
  116. protected function prepareComponent(UiComponentInterface $component)
  117. {
  118. foreach ($component->getChildComponents() as $child) {
  119. $this->prepareComponent($child);
  120. }
  121. $component->prepare();
  122. }
  123. /**
  124. * Optionally validate ACL resource of components with a DataSource/DataProvider
  125. *
  126. * @param mixed $dataProviderConfigData
  127. * @return bool
  128. */
  129. private function validateAclResource($dataProviderConfigData)
  130. {
  131. if (isset($dataProviderConfigData['aclResource'])) {
  132. if (!$this->_authorization->isAllowed($dataProviderConfigData['aclResource'])) {
  133. if (!$this->_request->isAjax()) {
  134. $this->_redirect('admin/denied');
  135. }
  136. return false;
  137. }
  138. }
  139. return true;
  140. }
  141. }