3namespace Bitrix\Conversion;
6use Bitrix\Main\Application;
7use Bitrix\Main\Data\LocalStorage\SessionLocalStorage;
8use Bitrix\Main\SiteTable;
9use Bitrix\Main\EventManager;
10use Bitrix\Main\Web\Json;
11use Bitrix\Main\Type\Date;
12use Bitrix\Main\ArgumentException;
13use Bitrix\Main\ArgumentTypeException;
18 private static self $instance;
20 private static array $contextData;
32 if (func_num_args() === 2)
41 if ($this->
getId() ===
null && $this === $instance)
52 parent::addCounter($day,
$name, $value);
67 if ($this->
getId() ===
null && $this === $instance)
70 $context[
'PENDING_DAY_COUNTERS'] ??= [];
103 $isToday = $day instanceof
Date && $day->
format(
'dmY') === date(
'dmY');
159 if (!is_scalar($item))
166 if ($this->
getId() ===
null && $this === $instance)
169 $context[
'PENDING_ENTITY_ITEMS'] ??= [];
181 Internals\ContextEntityItemTable::add([
182 'CONTEXT_ID' => $this->
id,
204 $context = Internals\ContextEntityItemTable::getRow([
214 $contextId = (int)(!empty(
$context[
'CONTEXT_ID']) ?
$context[
'CONTEXT_ID'] : self::EMPTY_CONTEXT_ID);
215 if ($contextId !== $instance->getId())
217 $instance =
new self;
218 $instance->setId($contextId);
236 if (preg_match(
'/[a-z0-9_]{2}/i',
$siteId) && self::getSiteId() !==
$siteId && \CSite::getById(
$siteId)->fetch())
238 $instance =
new self;
241 foreach (
$eventManager->findEventHandlers(
'conversion',
'OnSetDayContextAttributes') as $handler)
252 $instance->setAttribute(
'conversion_site',
$siteId);
266 if (!isset(self::$instance))
268 $instance =
new self;
270 $currentContext = self::getDataFromStorage();
271 if ($currentContext ===
null)
273 $currentContext = self::getDataFromCookie();
275 if ($currentContext ===
null)
277 $currentContext = self::getDefaultData();
279 self::setContextData($currentContext);
280 $instance->setId($currentContext[
'ID']);
282 self::$instance = $instance;
285 return self::$instance;
289 private function setCookie(): void
292 $session = self::getContextData();
297 'ID' => $session[
'ID'],
298 'EXPIRE' => $session[
'EXPIRE'],
299 'UNIQUE' => $session[
'UNIQUE'],
301 strtotime(
'+1 year'),
304 $cookie->setHttpOnly(
false);
306 Main\Context::getCurrent()->getResponse()->addCookie($cookie);
314 if ($instance->getId() ===
null)
317 foreach (
$eventManager->findEventHandlers(
'conversion',
'OnSetDayContextAttributes') as $handler)
331 $session = self::getContextData();
332 $session[
'ID'] = $instance->getId();
333 self::setContextData($session);
334 $instance->setCookie();
336 if (!empty($session[
'PENDING_COUNTERS']) && is_array($session[
'PENDING_COUNTERS']))
339 foreach ($session[
'PENDING_COUNTERS'] as
$name => $value)
341 $instance->addCounter($date,
$name, $value);
346 if (!empty($session[
'PENDING_DAY_COUNTERS']) && is_array($session[
'PENDING_DAY_COUNTERS']))
348 foreach ($session[
'PENDING_DAY_COUNTERS'] as
$name => $value)
350 $instance->addDayCounter(
$name, $value);
354 if (!empty($session[
'PENDING_ENTITY_ITEMS']) && is_array($session[
'PENDING_ENTITY_ITEMS']))
356 foreach ($session[
'PENDING_ENTITY_ITEMS'] as
$i)
358 $instance->attachEntityItem(
$i[
'ENTITY'],
$i[
'ITEM']);
385 $row = SiteTable::getRow([
415 return Application::getInstance()->getLocalSession(self::getVarName());
418 private static function getDataFromStorage(): ?
array
423 return self::checkStorageData(
$data) ?
$data :
null;
426 private static function setDataToStorage(
array $data): void
432 private static function checkStorageData(mixed
$data): bool
434 if (!is_array(
$data))
438 if (!is_int(
$data[
'ID'] ??
null))
442 if ((
$data[
'EXPIRE'] ??
null) !== self::getCurrentExpireValue())
446 if (!is_array(
$data[
'UNIQUE'] ??
null))
454 private static function getCurrentExpireValue(): int
456 $result = strtotime(
'today 23:59');
461 private static function getDefaultData():
array
465 'EXPIRE' => self::getCurrentExpireValue(),
470 private static function getDataFromCookie(): ?
array
472 $request = Main\Context::getCurrent()->getRequest();
474 $cookie =
$request->getCookie(self::getVarName());
475 if ($cookie ===
null || $cookie ===
'')
481 $data = Json::decode($cookie);
483 catch (ArgumentException)
488 return self::checkCookieData(
$data) ?
$data :
null;
491 private static function checkCookieData(mixed $cookie): bool
493 if (!is_array($cookie))
497 if (!is_array($cookie[
'UNIQUE'] ??
null))
501 if (($cookie[
'EXPIRE'] ??
null) !== self::getCurrentExpireValue())
506 $id = $cookie[
'ID'] ??
null;
511 if (
$id === self::EMPTY_CONTEXT_ID)
516 $row = Internals\ContextTable::getRow([
525 return $row !==
null;
528 private static function setContextData(
array $data): void
530 self::$contextData =
$data;
531 self::setDataToStorage(self::$contextData);
534 private static function getContextData():
array
536 return self::$contextData;
if(!Loader::includeModule('catalog')) if(!AccessController::getCurrent() ->check(ActionDictionary::ACTION_PRICE_EDIT)) if(!check_bitrix_sessid()) $request
static getSiteInstance($siteId)
static getEntityItemInstance($entity, $item)
addDayCounter($name, $value)
subDayCounter($day, $name, $value)
subCurrencyCounter($day, $name, $value, $currency)
attachEntityItem($entity, $item)
addCounter($day, $name, $value=null)
addCurrencyCounter($name, $value, $currency)
subCounter($day, $name, $value=1)
static convertToBaseCurrency($value, $currency)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
ExecuteModuleEventEx($arEvent, $arParams=[])
if(empty($decryptedData)) $storage