dpo Posted February 10, 2021 Share Posted February 10, 2021 Buenas tardes, Agradecería vuestra ayuda. Tengo una web en prestashop 1.7.5.2 y ayer actualicé un módulo de pago (ets_paymentfee) e intenté eliminar un módulo que no utilizo (pago con cheque de prestashop). Tras esto, automáticamente la entrada al BO dejó de funcionar. No sé muy bien qué módulo da el error aunque tiene más sentido que sea el primer módulo. Este es el error que me da: (3/3) FileLoaderLoadException The file "/home/customer/www/...com/public_html/src/PrestaShopBundle/Resources/config/services/core/currency.yml" does not contain valid YAML: The constant "\PrestaShop\PrestaShop\Core\Currency\ExchangeRateProvider::CLOSED_ALLOWED_FAILURES" is not defined at line 16 (near "- !php/const \PrestaShop\PrestaShop\Core\Currency\ExchangeRateProvider::CLOSED_ALLOWED_FAILURES") in /home/customer/www/....com/public_html/src/PrestaShopBundle/Resources/config/services/core/currency.yml (which is being imported from "/home/customer/www/...com/public_html/src/PrestaShopBundle/Resources/config/services.yml"). La web funciona sin problemas, recibe pedidos pero no puedo entrar de ninguna manera al panel de administración. Lo más curioso es que restauro una copia de seguridad de días atrás, cuando la web estaba funcionando y me da exactamente el mismo error. He borrado las caché pero sigue sin funcionar. Agradecería cualquier tipo de ayuda u orientación Gracias Link to comment Share on other sites More sharing options...
juanrojas Posted February 10, 2021 Share Posted February 10, 2021 Hola intenta borrando la cache pero en esta ruta /www/var/cache/prod borras todo lo que esta dentro de esa carpeta Link to comment Share on other sites More sharing options...
dpo Posted February 10, 2021 Author Share Posted February 10, 2021 Buenas tardes Juan, Gracias por tu respuesta Juan. Sin embargo, ya había borrado esas carpetas y el problema persiste. Si se te ocurriera alguna otra idea te lo agradecería Un saludo Link to comment Share on other sites More sharing options...
joseantgv Posted February 11, 2021 Share Posted February 11, 2021 ¿Puedes copiar el contenido del fichero /src/PrestaShopBundle/Resources/config/services/core/currency.yml? Link to comment Share on other sites More sharing options...
dpo Posted February 11, 2021 Author Share Posted February 11, 2021 1 hour ago, joseantgv said: ¿Puedes copiar el contenido del fichero /src/PrestaShopBundle/Resources/config/services/core/currency.yml? Te copio el fichero aquí y también más abajo el archivo src/Core/Currency/ExchangeRateProvider.php Por alguna razón no lee el fichero src/Core/Currency/ExchangeRateProvider.php donde sí están definidas las constantes CLOSED_ALLOWED_FAILURES services: _defaults: public: true prestashop.core.currency.grid_data_factory: class: 'PrestaShop\PrestaShop\Core\Currency\CurrencyGridDataFactory' arguments: - '@prestashop.core.grid.data_provider.currency' - '@translator' prestashop.core.currency.exchange_rate.settings: class: PrestaShop\CircuitBreaker\FactorySettings arguments: - !php/const \PrestaShop\PrestaShop\Core\Currency\ExchangeRateProvider::CLOSED_ALLOWED_FAILURES - !php/const \PrestaShop\PrestaShop\Core\Currency\ExchangeRateProvider::CLOSED_TIMEOUT_SECONDS - !php/const \PrestaShop\PrestaShop\Core\Currency\ExchangeRateProvider::OPEN_THRESHOLD_SECONDS calls: - ['setStrippedFailures', [!php/const \PrestaShop\PrestaShop\Core\Currency\ExchangeRateProvider::OPEN_ALLOWED_FAILURES]] - ['setStrippedTimeout', [!php/const \PrestaShop\PrestaShop\Core\Currency\ExchangeRateProvider::OPEN_TIMEOUT_SECONDS]] - ['setStorage', ['@prestashop.core.circuit_breaker.storage']] - ['setClientOptions', [{'method': 'GET', 'subscribers': ['@prestashop.core.circuit_breaker.guzzle.cache_subscriber']}]] # create a factory for cache_subscriber so that we can easily adapt the cache duration prestashop.core.currency.exchange_rate.circuit_breaker: class: 'PrestaShop\CircuitBreaker\Contract\CircuitBreakerInterface' factory: ["@prestashop.core.circuit_breaker.advanced_factory", create] arguments: - "@prestashop.core.currency.exchange_rate.settings" prestashop.core.exchange_rate.provider: class: PrestaShop\PrestaShop\Core\Currency\ExchangeRateProvider arguments: - !php/const \PrestaShop\PrestaShop\Core\Currency\ExchangeRateProvider::CURRENCY_FEED_URL - '@=service("prestashop.adapter.data_provider.currency").getDefaultCurrencyIsoCode()' - '@prestashop.core.currency.exchange_rate.circuit_breaker' - '@cache.app' <?php /** * Copyright since 2007 PrestaShop SA and Contributors * PrestaShop is an International Registered Trademark & Property of PrestaShop SA * * NOTICE OF LICENSE * * This source file is subject to the Open Software License (OSL 3.0) * that is bundled with this package in the file LICENSE.md. * It is also available through the world-wide-web at this URL: * https://opensource.org/licenses/OSL-3.0 * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to [email protected] so we can send you a copy immediately. * * DISCLAIMER * * Do not edit or add to this file if you wish to upgrade PrestaShop to newer * versions in the future. If you wish to customize PrestaShop for your * needs please refer to https://devdocs.prestashop.com/ for more information. * * @author PrestaShop SA and Contributors <[email protected]> * @copyright Since 2007 PrestaShop SA and Contributors * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) */ namespace PrestaShop\PrestaShop\Core\Currency; use PrestaShop\CircuitBreaker\Contract\CircuitBreakerInterface; use PrestaShop\Decimal\Number; use PrestaShop\PrestaShop\Core\Currency\Exception\CurrencyFeedException; use PrestaShop\PrestaShop\Core\Domain\Currency\ValueObject\ExchangeRate; use SimpleXMLElement; use Symfony\Component\Cache\Adapter\AdapterInterface as CacheInterface; /** * Retrieves the exchange rate of a currency (based on the default currency). It uses a circuit breaker * to avoid being blocked in case of network problems and it saves each of its request in a cache to be * able to have a fallback response. */ class ExchangeRateProvider { /** * This url was set in the _PS_CURRENCY_FEED_URL_ const but it is not accessible in every * context because it is weirdly defined in defines_uri.inc.php So it is safer to define * it properly here. */ const CURRENCY_FEED_URL = 'http://api.prestashop.com/xml/currencies.xml'; const CLOSED_ALLOWED_FAILURES = 3; const CLOSED_TIMEOUT_SECONDS = 1; const OPEN_ALLOWED_FAILURES = 3; const OPEN_TIMEOUT_SECONDS = 2; const OPEN_THRESHOLD_SECONDS = 3600; // 1 hour const CACHE_KEY_XML = 'currency_feed.xml'; /** @var string */ private $currencyFeedUrl; /** @var string */ private $defaultCurrencyIsoCode; /** @var CircuitBreakerInterface */ private $remoteServiceProvider; /** @var CacheInterface */ private $cache; /** @var string */ private $sourceIsoCode; /** @var array */ private $currencies = []; /** * @param string $currencyFeedUrl * @param string $defaultCurrencyIsoCode * @param CircuitBreakerInterface $remoteServiceProvider * @param CacheInterface $cache */ public function __construct( $currencyFeedUrl, $defaultCurrencyIsoCode, CircuitBreakerInterface $remoteServiceProvider, CacheInterface $cache ) { $this->currencyFeedUrl = $currencyFeedUrl; $this->defaultCurrencyIsoCode = $defaultCurrencyIsoCode; $this->remoteServiceProvider = $remoteServiceProvider; $this->cache = $cache; } /** * @param string $currencyIsoCode * * @return Number * * @throws CurrencyFeedException */ public function getExchangeRate($currencyIsoCode) { $this->fetchCurrencyFeed(); // Default feed currency (usually EUR) if ($this->defaultCurrencyIsoCode == $currencyIsoCode) { return ExchangeRate::getDefaultExchangeRate(); } /* * Search for the currency rate in the source feed, this represents the rate * relative to the source feed (compared to the feed default currency) */ $sourceRate = $this->getExchangeRateFromFeed($currencyIsoCode); /* * Fetch the exchange rate of the default currency (compared to the source currency) * and finally compute the asked currency rate compared to the shop default currency rate */ $defaultExchangeRate = $this->getExchangeRateFromFeed($this->defaultCurrencyIsoCode); return $sourceRate->dividedBy($defaultExchangeRate); } /** * @param string $currencyIsoCode * * @return Number * * @throws CurrencyFeedException */ private function getExchangeRateFromFeed(string $currencyIsoCode) { if ($this->sourceIsoCode == $currencyIsoCode) { return new Number('1.0'); } if (!isset($this->currencies[$currencyIsoCode])) { throw new CurrencyFeedException(sprintf('Exchange rate for currency with ISO code %s was not found', $currencyIsoCode)); } return $this->currencies[$currencyIsoCode]; } /** * Fetch the currency from its url using circuit breaker, if no content was fetched * fallback on the cache file. This is only performed once per process, if the currencies * are already present then there is nothing to do. * * @throws CurrencyFeedException */ private function fetchCurrencyFeed() { if (!empty($this->currencies)) { return; } $remoteFeedData = $this->remoteServiceProvider->call($this->currencyFeedUrl); $cachedFeedData = $this->getCachedCurrencyFeed(); if (empty($remoteFeedData) && empty($cachedFeedData)) { throw new CurrencyFeedException('Currency feed could not be fetched'); } $xmlFeed = $this->parseAndSaveXMLFeed($remoteFeedData); if (null === $xmlFeed) { $xmlFeed = $this->parseAndSaveXMLFeed($cachedFeedData); } if (null === $xmlFeed) { throw new CurrencyFeedException('Invalid currency XML feed'); } $this->parseXmlFeed($xmlFeed); } /** * @param string $feedContent * * @return SimpleXMLElement|null */ private function parseAndSaveXMLFeed($feedContent) { $xmlFeed = @simplexml_load_string($feedContent); if (!$xmlFeed || !$this->isValidXMLFeed($xmlFeed)) { return null; } //Cache the feed $cacheItem = $this->cache->getItem(self::CACHE_KEY_XML); $cacheItem->set($feedContent); $this->cache->save($cacheItem); return $xmlFeed; } /** * @param SimpleXMLElement $xmlFeed */ private function parseXmlFeed($xmlFeed) { $xmlCurrencies = $xmlFeed->list->currency; $this->sourceIsoCode = (string) ($xmlFeed->source['iso_code']); foreach ($xmlCurrencies as $currency) { $this->currencies[(string) $currency['iso_code']] = new Number((string) $currency['rate']); } } /** * @return string */ private function getCachedCurrencyFeed() { $cacheItem = $this->cache->getItem(self::CACHE_KEY_XML); if (!$cacheItem->isHit()) { return ''; } $feedContent = $cacheItem->get(); return !empty($feedContent) ? $feedContent : ''; } /** * @param SimpleXMLElement $xmlFeed * * @return bool */ private function isValidXMLFeed(SimpleXMLElement $xmlFeed) { return $xmlFeed && $xmlFeed->list && count($xmlFeed->list->currency) && $xmlFeed->source; } } Gracias Link to comment Share on other sites More sharing options...
joseantgv Posted February 11, 2021 Share Posted February 11, 2021 ¿Has probado esto? Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now