123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\CurrencySymbol\Model\System;
- use Magento\Framework\App\ObjectManager;
- use Magento\Framework\Locale\Bundle\CurrencyBundle;
- use Magento\Framework\Serialize\Serializer\Json;
- /**
- * Custom currency symbol model
- *
- * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
- *
- * @api
- * @since 100.0.2
- */
- class Currencysymbol
- {
- /**
- * Custom currency symbol properties
- *
- * @var array
- */
- protected $_symbolsData = [];
- /**
- * Store id
- *
- * @var string|null
- */
- protected $_storeId;
- /**
- * Website id
- *
- * @var string|null
- */
- protected $_websiteId;
- /**
- * Cache types which should be invalidated
- *
- * @var array
- */
- protected $_cacheTypes = [
- \Magento\Framework\App\Cache\Type\Config::TYPE_IDENTIFIER,
- \Magento\Framework\App\Cache\Type\Block::TYPE_IDENTIFIER,
- \Magento\Framework\App\Cache\Type\Layout::TYPE_IDENTIFIER,
- \Magento\PageCache\Model\Cache\Type::TYPE_IDENTIFIER,
- ];
- /**
- * Config path to custom currency symbol value
- */
- const XML_PATH_CUSTOM_CURRENCY_SYMBOL = 'currency/options/customsymbol';
- const XML_PATH_ALLOWED_CURRENCIES = \Magento\Directory\Model\Currency::XML_PATH_CURRENCY_ALLOW;
- /*
- * Separator used in config in allowed currencies list
- */
- const ALLOWED_CURRENCIES_CONFIG_SEPARATOR = ',';
- /**
- * Config currency section
- */
- const CONFIG_SECTION = 'currency';
- /**
- * Core event manager proxy
- *
- * @var \Magento\Framework\Event\ManagerInterface
- */
- protected $_eventManager;
- /**
- * @var \Magento\Framework\App\Cache\TypeListInterface
- */
- protected $_cacheTypeList;
- /**
- * @var \Magento\Config\Model\Config\Factory
- */
- protected $_configFactory;
- /**
- * @var \Magento\Store\Model\System\Store
- */
- protected $_systemStore;
- /**
- * @var \Magento\Store\Model\StoreManagerInterface
- */
- protected $_storeManager;
- /**
- * @var \Magento\Framework\Locale\ResolverInterface
- */
- protected $localeResolver;
- /**
- * @var \Magento\Framework\App\Config\ReinitableConfigInterface
- */
- protected $_coreConfig;
- /**
- * Core store config
- *
- * @var \Magento\Framework\App\Config\ScopeConfigInterface
- */
- protected $_scopeConfig;
- /**
- * @var Json
- */
- private $serializer;
- /**
- * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
- * @param \Magento\Framework\App\Config\ReinitableConfigInterface $coreConfig
- * @param \Magento\Config\Model\Config\Factory $configFactory
- * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList
- * @param \Magento\Store\Model\StoreManagerInterface $storeManager
- * @param \Magento\Framework\Locale\ResolverInterface $localeResolver
- * @param \Magento\Store\Model\System\Store $systemStore
- * @param \Magento\Framework\Event\ManagerInterface $eventManager
- * @param Json|null $serializer
- */
- public function __construct(
- \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
- \Magento\Framework\App\Config\ReinitableConfigInterface $coreConfig,
- \Magento\Config\Model\Config\Factory $configFactory,
- \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList,
- \Magento\Store\Model\StoreManagerInterface $storeManager,
- \Magento\Framework\Locale\ResolverInterface $localeResolver,
- \Magento\Store\Model\System\Store $systemStore,
- \Magento\Framework\Event\ManagerInterface $eventManager,
- Json $serializer = null
- ) {
- $this->_coreConfig = $coreConfig;
- $this->_configFactory = $configFactory;
- $this->_cacheTypeList = $cacheTypeList;
- $this->_storeManager = $storeManager;
- $this->localeResolver = $localeResolver;
- $this->_systemStore = $systemStore;
- $this->_eventManager = $eventManager;
- $this->_scopeConfig = $scopeConfig;
- $this->serializer = $serializer ?: ObjectManager::getInstance()->get(Json::class);
- }
- /**
- * Return currency symbol properties array based on config values
- *
- * @return array
- */
- public function getCurrencySymbolsData()
- {
- if ($this->_symbolsData) {
- return $this->_symbolsData;
- }
- $this->_symbolsData = [];
- $currentSymbols = $this->_unserializeStoreConfig(self::XML_PATH_CUSTOM_CURRENCY_SYMBOL);
- foreach ($this->getAllowedCurrencies() as $code) {
- $currencies = (new CurrencyBundle())->get($this->localeResolver->getLocale())['Currencies'];
- $symbol = $currencies[$code][0] ?: $code;
- $name = $currencies[$code][1] ?: $code;
- $this->_symbolsData[$code] = ['parentSymbol' => $symbol, 'displayName' => $name];
- if (isset($currentSymbols[$code]) && !empty($currentSymbols[$code])) {
- $this->_symbolsData[$code]['displaySymbol'] = $currentSymbols[$code];
- } else {
- $this->_symbolsData[$code]['displaySymbol'] = $this->_symbolsData[$code]['parentSymbol'];
- }
- $this->_symbolsData[$code]['inherited'] =
- ($this->_symbolsData[$code]['parentSymbol'] == $this->_symbolsData[$code]['displaySymbol']);
- }
- return $this->_symbolsData;
- }
- /**
- * Save currency symbol to config
- *
- * @param array $symbols
- * @return $this
- */
- public function setCurrencySymbolsData($symbols = [])
- {
- if (!$this->_storeManager->isSingleStoreMode()) {
- foreach ($this->getCurrencySymbolsData() as $code => $values) {
- if (isset($symbols[$code]) && ($symbols[$code] == $values['parentSymbol'] || empty($symbols[$code]))) {
- unset($symbols[$code]);
- }
- }
- }
- $value = [];
- if ($symbols) {
- $value['options']['fields']['customsymbol']['value'] = $this->serializer->serialize($symbols);
- } else {
- $value['options']['fields']['customsymbol']['inherit'] = 1;
- }
- $this->_configFactory->create()
- ->setSection(self::CONFIG_SECTION)
- ->setWebsite(null)
- ->setStore(null)
- ->setGroups($value)
- ->save();
- $this->_eventManager->dispatch(
- 'admin_system_config_changed_section_currency_before_reinit',
- ['website' => $this->_websiteId, 'store' => $this->_storeId]
- );
- // reinit configuration
- $this->_coreConfig->reinit();
- $this->clearCache();
- //Reset symbols cache since new data is added
- $this->_symbolsData = [];
- $this->_eventManager->dispatch(
- 'admin_system_config_changed_section_currency',
- ['website' => $this->_websiteId, 'store' => $this->_storeId]
- );
- return $this;
- }
- /**
- * Return custom currency symbol by currency code
- *
- * @param string $code
- * @return string|false
- */
- public function getCurrencySymbol($code)
- {
- $customSymbols = $this->_unserializeStoreConfig(self::XML_PATH_CUSTOM_CURRENCY_SYMBOL);
- if (array_key_exists($code, $customSymbols)) {
- return $customSymbols[$code];
- }
- return false;
- }
- /**
- * Clear translate cache
- *
- * @return $this
- */
- protected function clearCache()
- {
- // clear cache for frontend
- foreach ($this->_cacheTypes as $cacheType) {
- $this->_cacheTypeList->invalidate($cacheType);
- }
- return $this;
- }
- /**
- * Unserialize data from Store Config.
- *
- * @param string $configPath
- * @param int $storeId
- * @return array
- */
- protected function _unserializeStoreConfig($configPath, $storeId = null)
- {
- $result = [];
- $configData = (string)$this->_scopeConfig->getValue(
- $configPath,
- \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
- $storeId
- );
- if ($configData) {
- $result = $this->serializer->unserialize($configData);
- }
- return is_array($result) ? $result : [];
- }
- /**
- * Return allowed currencies
- *
- * @return array
- */
- protected function getAllowedCurrencies()
- {
- $allowedCurrencies = explode(
- self::ALLOWED_CURRENCIES_CONFIG_SEPARATOR,
- $this->_scopeConfig->getValue(
- self::XML_PATH_ALLOWED_CURRENCIES,
- \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
- null
- )
- );
- $storeModel = $this->_systemStore;
- /** @var \Magento\Store\Model\Website $website */
- foreach ($storeModel->getWebsiteCollection() as $website) {
- $websiteShow = false;
- /** @var \Magento\Store\Model\Group $group */
- foreach ($storeModel->getGroupCollection() as $group) {
- if ($group->getWebsiteId() != $website->getId()) {
- continue;
- }
- /** @var \Magento\Store\Model\Store $store */
- foreach ($storeModel->getStoreCollection() as $store) {
- if ($store->getGroupId() != $group->getId()) {
- continue;
- }
- if (!$websiteShow) {
- $websiteShow = true;
- $websiteSymbols = $website->getConfig(self::XML_PATH_ALLOWED_CURRENCIES);
- $allowedCurrencies = array_merge(
- $allowedCurrencies,
- explode(self::ALLOWED_CURRENCIES_CONFIG_SEPARATOR, $websiteSymbols)
- );
- }
- $storeSymbols = $this->_scopeConfig->getValue(
- self::XML_PATH_ALLOWED_CURRENCIES,
- \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
- $store
- );
- $allowedCurrencies = array_merge(
- $allowedCurrencies,
- explode(self::ALLOWED_CURRENCIES_CONFIG_SEPARATOR, $storeSymbols)
- );
- }
- }
- }
- return array_unique($allowedCurrencies);
- }
- }
|