isHttps() ? 'https://' : 'http://') . $host . $this->basePath(); } public function returnPageUrl(): string { return $this->baseUrl() . self::RETURN_PAGE; } /** * Путь страницы возврата от корня сайта, без схемы и хоста — для `Location` хуков `/success` * и `/fail`. `SERVER_NAME` на Apache по умолчанию берётся из заголовка `Host` запроса, и * кэширующий прокси перед магазином мог бы раздать редирект на чужой хост. */ public function returnPagePath(): string { return $this->basePath() . self::RETURN_PAGE; } public function callbackUrl(): string { return $this->baseUrl() . self::CALLBACK_PATH; } /** * ISO-код валюты заказа с учётом витрины (мультисайт). */ public function orderCurrency(): string { $system = $GLOBALS['PHPShopSystem'] ?? null; if (!is_object($system) || !method_exists($system, 'getDefaultValutaIso')) { return ''; } return (string) $system->getDefaultValutaIso(true); } /** * Язык витрины текущего покупателя: ядро кладёт его в сессию (`PHPShopElements`). */ public function shopLocale(): string { $locale = $_SESSION['lang'] ?? ''; return is_string($locale) ? $locale : ''; } /** * Запомнить в сессии покупателя заказ, форму оплаты которого ему показали: по нему страница * возврата покажет статус и гостю, оформившему заказ без входа ({@see ReturnAccess}). */ public function rememberPayableOrder(int $orderId): void { if (session_status() !== PHP_SESSION_ACTIVE) { return; } $_SESSION[ReturnAccess::SESSION_KEY] = ReturnAccess::remember( $_SESSION[ReturnAccess::SESSION_KEY] ?? null, $orderId, ); } /** * ID вошедшего покупателя (`$_SESSION['UsersId']`); 0 — не вошёл. */ public function sessionUserId(): int { return (int) ($_SESSION['UsersId'] ?? 0); } /** * Знаков после точки в ценах витрины (`admoption.price_znak`). */ public function priceDecimals(): int { $system = $GLOBALS['PHPShopSystem'] ?? null; if (!is_object($system) || !method_exists($system, 'getSerilizeParam')) { return 0; } return (int) $system->getSerilizeParam('admoption.price_znak'); } /** * Знак валюты заказа так, как его выводит витрина: для рубля ядро отдаёт * `p` — шрифт темы рисует «p» знаком рубля; для другой валюты — * обозначение из справочника. HTML ядра, в cp1251. */ public function currencyIcon(): string { $system = $GLOBALS['PHPShopSystem'] ?? null; if (!is_object($system) || !method_exists($system, 'getValutaIcon')) { return ''; } return HostCharset::fromDatabase(trim((string) $system->getValutaIcon(true))); } /** * `MNT_CMS`: версия PHPShop — из `[upload] version` конфига ядра (`670`). */ public function cms(): string { $uploadVersion = (string) ($GLOBALS['SysValue']['upload']['version'] ?? ''); return CmsInfo::format(CmsInfo::hostVersion($uploadVersion), PHP_VERSION, ModuleInfo::VERSION); } /** * Текущее время. Пояс выставляет ядро из настроек магазина (`PHPShopSystem::setTimeZone()`), * а если настройка пуста или неверна — действует пояс PHP сервера; метке * `MNT_TRANSACTION_ID` это неважно, она пишется в UTC. */ public function now(): DateTimeImmutable { return new DateTimeImmutable('now'); } /** * Каталог установки PHPShop без слэша на конце (`[dir] dir` в `inc/config.ini`), пусто — в корне сайта. */ private function basePath(): string { return rtrim((string) ($GLOBALS['SysValue']['dir']['dir'] ?? ''), '/'); } private function isHttps(): bool { $https = strtolower((string) ($_SERVER['HTTPS'] ?? '')); if (($https !== '') && ($https !== 'off')) { return true; } return strtolower((string) ($_SERVER['HTTP_X_FORWARDED_PROTO'] ?? '')) === 'https'; } }