0, 'full' => false, 'partial' => false, 'swept' => false, 'started' => 0, 'forced' => false], is_array($data) ? $data : []); } /** * Новый сеанс. Если был запрошен принудительный полный обмен — он применяется к этому сеансу. */ public static function start(): void { $previous = self::get(); $forced = (bool) get_option(self::FORCE_OPTION, false); update_option(self::OPTION, [ 'id' => max(time(), $previous['id'] + 1), 'full' => false, 'partial' => false, 'swept' => false, 'started' => time(), 'forced' => $forced, ], false); if ($forced) { delete_option(self::FORCE_OPTION); } } /** * В этом сеансе обновляем всё, не пропуская неизменённые товары. */ public static function isForced(): bool { return (bool) self::get()['forced']; } public static function requestForced(bool $on): void { $on ? update_option(self::FORCE_OPTION, 1, false) : delete_option(self::FORCE_OPTION); } public static function forcedRequested(): bool { return (bool) get_option(self::FORCE_OPTION, false); } public static function id(): int { return self::get()['id']; } /** * Файл каталога объявил тип выгрузки. Если в сеансе есть хоть один файл «только изменения», * сеанс полным не считается — так безопаснее для пакетной выгрузки. */ public static function markCatalogType(bool $changesOnly): void { $data = self::get(); if ($changesOnly) { $data['partial'] = true; } else { $data['full'] = true; } update_option(self::OPTION, $data, false); } public static function isFull(): bool { $data = self::get(); return $data['full'] && !$data['partial']; } public static function markChecked(): void { $data = self::get(); $data['checked'] = true; update_option(self::OPTION, $data, false); } public static function markSwept(): void { $data = self::get(); $data['swept'] = true; update_option(self::OPTION, $data, false); } /** * Для страницы настроек: «полная» / «только изменения» / null. */ public static function label(): ?string { $data = self::get(); $label = match (true) { $data['partial'] => 'только изменения', $data['full'] => 'полная', default => null, }; return $label !== null && $data['forced'] ? $label . ', принудительно' : $label; } }