/home/sharedstore/public_html/prestashop.sharedstore.ma/src/Adapter
NameSizeModeActions
Address/-0755rm
Admin/-0755rm
Assets/-0755rm
Attachment/-0755rm
Attribute/-0755rm
AttributeGroup/-0755rm
Backup/-0755rm
BestSales/-0755rm
Cache/-0755rm
Carrier/-0755rm
Cart/-0755rm
CartRule/-0755rm
CatalogPriceRule/-0755rm
Category/-0755rm
CMS/-0755rm
Configuration/-0755rm
Contact/-0755rm
Container/-0755rm
Converter/-0755rm
Country/-0755rm
CreditSlip/-0755rm
Currency/-0755rm
Customer/-0755rm
Debug/-0755rm
Domain/-0755rm
Email/-0755rm
Employee/-0755rm
EntityTranslation/-0755rm
Feature/-0755rm
File/-0755rm
Form/-0755rm
Geolocation/-0755rm
Grid/-0755rm
Group/-0755rm
Hook/-0755rm
Hosting/-0755rm
Image/-0755rm
Import/-0755rm
Invoice/-0755rm
Kpi/-0755rm
Language/-0755rm
Localization/-0755rm
Mail/-0755rm
MailTemplate/-0755rm
Manufacturer/-0755rm
Media/-0755rm
Meta/-0755rm
Module/-0755rm
NewProducts/-0755rm
Notification/-0755rm
Number/-0755rm
OptionalFeatures/-0755rm
Order/-0755rm
OrderMessage/-0755rm
OrderReturn/-0755rm
OrderReturnState/-0755rm
OrderState/-0755rm
Pack/-0755rm
PDF/-0755rm
Preferences/-0755rm
Presenter/-0755rm
PricesDrop/-0755rm
Product/-0755rm
Profile/-0755rm
Requirement/-0755rm
Routes/-0755rm
Routing/-0755rm
Search/-0755rm
SearchEngine/-0755rm
Security/-0755rm
Session/-0755rm
Shop/-0755rm
Smarty/-0755rm
SpecificPrice/-0755rm
SqlManager/-0755rm
State/-0755rm
Store/-0755rm
Supplier/-0755rm
Support/-0755rm
System/-0755rm
Tab/-0755rm
Tax/-0755rm
TaxRulesGroup/-0755rm
Theme/-0755rm
Title/-0755rm
Translations/-0755rm
Twig/-0755rm
Upload/-0755rm
Warehouse/-0755rm
Webservice/-0755rm
Zone/-0755rm
AbstractObjectModelValidator.php37190644editdlrm
AddressFactory.php20510644editdlrm
CacheManager.php14500644editdlrm
ClassLang.php17160644editdlrm
CombinationDataProvider.php85800644editdlrm
Configuration.php139590644editdlrm
ContainerBuilder.php89660644editdlrm
ContainerFinder.php23980644editdlrm
ContextStateManager.php103360644editdlrm
CoreException.php12290644editdlrm
Database.php26980644editdlrm
EntityMapper.php55730644editdlrm
EntityMetaDataRetriever.php20340644editdlrm
Environment.php26700644editdlrm
GeneralConfiguration.php43310644editdlrm
HookManager.php39690644editdlrm
ImageManager.php43200644editdlrm
LegacyContext.php110080644editdlrm
LegacyContextLoader.php42620644editdlrm
LegacyHookSubscriber.php47800644editdlrm
LegacyLogger.php48980644editdlrm
ObjectPresenter.php13270644editdlrm
RoundingMapper.php25230644editdlrm
ServiceLocator.php20650644editdlrm
StockManager.php79140644editdlrm
SymfonyContainer.php19700644editdlrm
Tools.php59320644editdlrm
Validate.php38330644editdlrm
Edit: /home/sharedstore/public_html/prestashop.sharedstore.ma/src/Adapter/ContextStateManager.php (10336B)
* @copyright Since 2007 PrestaShop SA and Contributors * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) */ declare(strict_types=1); namespace PrestaShop\PrestaShop\Adapter; use Cart; use Context; use Country; use Currency; use Customer; use Language; use Shop; /** * Allows manipulating context state. * This was adapted for specific broken legacy use cases when the previous state of context must be restored after some actions. * * e.g. order creation from back office. * Legacy requires Context properties (currency, country etc.) instead of using cart properties * so some context props must be changed for a while and then restored to previous state. */ final class ContextStateManager { private const MANAGED_FIELDS = [ 'cart', 'country', 'currency', 'language', 'customer', 'shop', 'shopContext', ]; /** * @var LegacyContext */ private $legacyContext; /** * @var array|null */ private $contextFieldsStack = null; /** * @param LegacyContext $legacyContext */ public function __construct(LegacyContext $legacyContext) { $this->legacyContext = $legacyContext; } /** * @return Context */ public function getContext(): Context { return $this->legacyContext->getContext(); } /** * Sets context cart and saves previous value * * @param Cart|null $cart * * @return $this */ public function setCart(?Cart $cart): self { $this->saveContextField('cart'); $this->getContext()->cart = $cart; return $this; } /** * Sets context country and saves previous value * * @param Country|null $country * * @return $this */ public function setCountry(?Country $country): self { $this->saveContextField('country'); $this->getContext()->country = $country; return $this; } /** * Sets context currency and saves previous value * * @param Currency|null $currency * * @return $this */ public function setCurrency(?Currency $currency): self { $this->saveContextField('currency'); $this->getContext()->currency = $currency; return $this; } /** * Sets context language and saves previous value * * @param Language|null $language * * @return $this */ public function setLanguage(?Language $language): self { $this->saveContextField('language'); $this->getContext()->language = $language; if ($language) { $this->getContext()->getTranslator()->setLocale($language->locale); } return $this; } /** * Sets context customer and saves previous value * * @param Customer|null $customer * * @return $this */ public function setCustomer(?Customer $customer): self { $this->saveContextField('customer'); $this->getContext()->customer = $customer; return $this; } /** * Sets context shop and saves previous value * * @param Shop $shop * * @return $this * * @throws \PrestaShopException */ public function setShop(Shop $shop): self { $this->saveContextField('shop'); $this->getContext()->shop = $shop; Shop::setContext(Shop::CONTEXT_SHOP, $shop->id); return $this; } /** * Sets context shop and saves previous value * * @param int $shopContext * @param int|null $shopContextId * * @return $this * * @throws \PrestaShopException */ public function setShopContext(int $shopContext, ?int $shopContextId = null): self { $this->saveContextField('shopContext'); if ($shopContext === Shop::CONTEXT_SHOP) { $this->getContext()->shop = new Shop($shopContextId); } Shop::setContext($shopContext, $shopContextId); return $this; } /** * Restores context to a state before changes * * @return self */ public function restorePreviousContext(): self { $stackFields = array_keys($this->contextFieldsStack[$this->getCurrentStashIndex()]); foreach ($stackFields as $fieldName) { $this->restoreContextField($fieldName); } $this->removeLastSavedContext(); return $this; } /** * Saves the current overridden fields in the context, allowing you to set new values to the * current Context. Next time you call restorePreviousContext the context will be refilled with * the values that were saved during this call. * * This is useful if several services use the ContextStateManager, this way if every service * saved the context before modifying it there is no risk of removing previous modifications * when you restore the context, because the different states have been stacked. * * @return $this */ public function saveCurrentContext(): self { // No context field has been overridden yet so no need to save/stack it if (null === $this->contextFieldsStack) { return $this; } // Saves all the fields that have not been overridden foreach (self::MANAGED_FIELDS as $contextField) { $this->saveContextField($contextField); } // Add a new empty layer $this->contextFieldsStack[] = []; return $this; } /** * Return the stack of modified fields * If it's null, no context field has been overridden * * @return array|null */ public function getContextFieldsStack(): ?array { return $this->contextFieldsStack; } /** * Save context field into local array * * @param string $fieldName */ private function saveContextField(string $fieldName) { $currentStashIndex = $this->getCurrentStashIndex(); // NOTE: array_key_exists important here, isset cannot be used because it would not detect if null is stored if (!array_key_exists($fieldName, $this->contextFieldsStack[$currentStashIndex])) { switch ($fieldName) { case 'shop': case 'shopContext': $this->contextFieldsStack[$currentStashIndex]['shop'] = $this->getContext()->shop; $this->contextFieldsStack[$currentStashIndex]['shopContext'] = Shop::getContext(); break; default: $this->contextFieldsStack[$currentStashIndex][$fieldName] = $this->getContext()->$fieldName; } } } /** * Restores context saved value, and remove save value from local array * * @param string $fieldName */ private function restoreContextField(string $fieldName): void { $currentStashIndex = $this->getCurrentStashIndex(); // NOTE: array_key_exists important here, isset cannot be used because it would not detect if null is stored if (array_key_exists($fieldName, $this->contextFieldsStack[$currentStashIndex])) { if ('shop' === $fieldName) { $this->restoreShopContext($currentStashIndex); } if ('language' === $fieldName && $this->contextFieldsStack[$currentStashIndex][$fieldName] instanceof Language) { $this->getContext()->getTranslator()->setLocale($this->contextFieldsStack[$currentStashIndex][$fieldName]->locale); } $this->getContext()->$fieldName = $this->contextFieldsStack[$currentStashIndex][$fieldName]; unset($this->contextFieldsStack[$currentStashIndex][$fieldName]); } } /** * Returns the index of the current stack * * @return int */ private function getCurrentStashIndex(): int { // If this is the first time the index is needed we need to init the stack if (null === $this->contextFieldsStack) { $this->contextFieldsStack = [[]]; } return array_key_last($this->contextFieldsStack); } /** * Restore the ShopContext, this is used when Shop has been overridden, we need to * restore context->shop of course But also the static fields in Shop class * * @param int $currentStashIndex */ private function restoreShopContext(int $currentStashIndex): void { $shop = $this->contextFieldsStack[$currentStashIndex]['shop']; $shopId = $shop instanceof Shop ? $shop->id : null; $shopContext = $this->contextFieldsStack[$currentStashIndex]['shopContext']; if (null !== $shopContext) { Shop::setContext($shopContext, $shopId); } unset($this->contextFieldsStack[$currentStashIndex]['shopContext']); } /** * Removes the last saved stashed context, in case this method is called too many times * we always keep one layer available */ private function removeLastSavedContext(): void { array_pop($this->contextFieldsStack); // When all layers have been popped we restore the initial null value if (empty($this->contextFieldsStack)) { $this->contextFieldsStack = null; } } }