<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ namespace Magento\Ui\Config; use Magento\Framework\Config\CacheInterface; use Magento\Framework\Serialize\SerializerInterface; use Magento\Ui\Config\Converter; use Magento\Framework\Data\Argument\InterpreterInterface; /** * UI Component configuration data */ class Data implements \Magento\Framework\Config\DataInterface { /** * ID in the storage cache */ const CACHE_ID = 'ui_component_configuration_data'; /** * Search pattern */ const SEARCH_PATTERN = '%s.xml'; /** * Config data * * @var array */ private $data = []; /** * @var ReaderFactory */ private $readerFactory; /** * @var CacheInterface */ private $cache; /** * @var string */ private $cacheId; /** * @var SerializerInterface */ private $serializer; /** * @var string */ private $componentName; /** * Argument interpreter. * * @var InterpreterInterface */ private $argumentInterpreter; /** * @param string $componentName * @param ReaderFactory $readerFactory * @param CacheInterface $cache * @param SerializerInterface $serializer * @param InterpreterInterface $argumentInterpreter, */ public function __construct( $componentName, ReaderFactory $readerFactory, CacheInterface $cache, SerializerInterface $serializer, InterpreterInterface $argumentInterpreter ) { $this->readerFactory = $readerFactory; $this->cache = $cache; $this->serializer = $serializer; $this->componentName = $componentName; $this->argumentInterpreter = $argumentInterpreter; $this->cacheId = static::CACHE_ID . '_' . $componentName; } /** * Initialise data for configuration * * @return void */ private function initData() { $data = $this->cache->load($this->cacheId); if (false === $data) { /** @var Reader $reader */ $reader = $this->readerFactory->create( ['fileName' => sprintf(self::SEARCH_PATTERN, $this->componentName)] ); $data = $reader->read(); $this->cache->save($this->serializer->serialize($data), $this->cacheId); } else { $data = $this->serializer->unserialize($data); } if (!empty($data)) { $this->data[$this->componentName] = [Converter::DATA_ATTRIBUTES_KEY => ['name' => $this->componentName]]; $this->merge([$this->componentName => $data]); $this->data = $this->evaluateComponentArguments($this->data); } } /** * Merge config data to the object * * @param array $config * @return void */ public function merge(array $config) { $this->data = array_replace_recursive($this->get(), $config); } /** * Get config value by key * * @param string $path * @param mixed $default * @return mixed */ public function get($path = null, $default = null) { if (empty($this->data)) { $this->initData(); } if ($path === null) { return $this->data; } $keys = explode('/', $path); $data = $this->data; foreach ($keys as $key) { if (is_array($data) && array_key_exists($key, $data)) { $data = $data[$key]; } else { return $default; } } return $data; } /** * Evaluated components arguments recursively * * @param array $components * @return array */ private function evaluateComponentArguments($components) { foreach ($components as &$component) { foreach ($component[Converter::DATA_ARGUMENTS_KEY] as $argumentName => $argument) { $component[Converter::DATA_ARGUMENTS_KEY][$argumentName] = $this->argumentInterpreter->evaluate($argument); } $component[Converter::DATA_COMPONENTS_KEY] = $this->evaluateComponentArguments( $component[Converter::DATA_COMPONENTS_KEY] ); } return $components; } }