![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/old/vendor/magento/module-theme/Model/Design/Config/ |
<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ namespace Magento\Theme\Model\Design\Config; use \Magento\Framework\Exception\LocalizedException; use \Magento\Theme\Api\Data\DesignConfigInterface; use \Magento\Theme\Api\Data\DesignConfigDataInterface; use \Magento\Framework\Mail\TemplateInterfaceFactory as TemplateFactory; use \Magento\Framework\Filter\Template; use \Magento\Framework\Filter\Template\Tokenizer\Parameter as ParameterTokenizer; /** * Design configuration validator */ class Validator { /** * @var string[] */ private $fields = []; /** * @var TemplateFactory */ private $templateFactory; /** * Initialize dependencies. * * @param TemplateFactory $templateFactory * @param string[] $fields */ public function __construct(TemplateFactory $templateFactory, $fields = []) { $this->templateFactory = $templateFactory; $this->fields = $fields; } /** * Validate if design configuration has recursive references * * @param DesignConfigInterface $designConfig * * @throws LocalizedException * @return void */ public function validate(DesignConfigInterface $designConfig) { /** @var DesignConfigDataInterface[] $designConfigData */ $designConfigData = $designConfig->getExtensionAttributes()->getDesignConfigData(); $elements = []; foreach ($designConfigData as $designElement) { if (!in_array($designElement->getFieldConfig()['field'], $this->fields)) { continue; } /* Save mapping between field names and config paths */ $elements[$designElement->getFieldConfig()['field']] = [ 'config_path' => $designElement->getPath(), 'value' => $designElement->getValue() ]; } foreach ($elements as $name => $data) { $templateId = $data['value']; $text = $this->getTemplateText($templateId, $designConfig); // Check if template body has a reference to the same config path if (preg_match_all(Template::CONSTRUCTION_TEMPLATE_PATTERN, $text, $constructions, PREG_SET_ORDER)) { foreach ($constructions as $construction) { $configPath = isset($construction[2]) ? $construction[2] : ''; $params = $this->getParameters($configPath); if (isset($params['config_path']) && $params['config_path'] == $data['config_path']) { throw new LocalizedException( __( 'The "%templateName" template contains an incorrect configuration, with a reference ' . 'to itself. Remove or change the reference, then try again.', ["templateName" => $name] ) ); } } } } } /** * Returns store identifier if is store scope * * @param DesignConfigInterface $designConfig * @return string|bool */ private function getScopeId(DesignConfigInterface $designConfig) { if ($designConfig->getScope() == 'stores') { return $designConfig->getScopeId(); } return false; } /** * Load template text in configured scope * * @param integer|string $templateId * @param DesignConfigInterface $designConfig * @return string */ private function getTemplateText($templateId, DesignConfigInterface $designConfig) { // Load template object by configured template id $template = $this->templateFactory->create(); $template->emulateDesign($this->getScopeId($designConfig)); if (is_numeric($templateId)) { $template->load($templateId); } else { $template->setForcedArea($templateId); $template->loadDefault($templateId); } $text = $template->getTemplateText(); $template->revertDesign(); return $text; } /** * Return associative array of parameters. * * @param string $value raw parameters * @return array */ private function getParameters($value) { $tokenizer = new ParameterTokenizer(); $tokenizer->setString($value); $params = $tokenizer->tokenize(); return $params; } }