Страницы
Страницы задают маршруты и упорядоченные блоки контента. В конфигурации площадки находятся mainPageId и ID юридических страниц; меню также может ссылаться на сущности страниц.
Контекст выполнения: браузер витрины или сервер площадки. Браузер передаёт Content-Type, X-Game-Platform-ID, совпадающий Origin и credentials: 'include'. Сервер дополнительно передаёт X-Game-Platform-Api-Key. Не раскрывайте этот ключ браузеру.
Определение сущности по URL витрины
Перед загрузкой контента определите сущность запрошенного URL. Ответ подсказывает роутеру, какой запрос выполнить, и содержит редирект, локализованные альтернативы и SEO текущего маршрута.
query ResolvePlatformSiteRoute(
$input: GetGamePlatformEntityByUrlInput!
$lang: Lang
) {
result: GetGamePlatformEntityByUrl(input: $input) {
__typename
... on Problem {
message
}
... on GamePlatformEntity {
type
entityId
platformId
lang
redirectUrl
disablePageBanners
alternateUrls {
en
ru
}
seoSettings {
ogTitle(lang: $lang)
ogDescription(lang: $lang)
ogImage(lang: $lang)
}
}
}
}
Переменные:
{
"lang": "RU",
"input": {
"url": "https://games.example.com/ru/popular/"
}
}
Передавайте полный публичный URL без query string. Добавьте в alternateUrls поля языков, которые поддерживает ваша площадка; используйте их для переключения языка и ссылок hreflang.
- Если
redirectUrlне пуст, выполните постоянный редирект. - Направляйте
PAGEиMAIN_PAGEвFetchGamePlatformPage. - Направляйте
GAMEна публичную страницу игры, аGAME_FRAME— в режим iframe через API игр. - Направляйте
COLLECTIONв API подборок. ДляCATEGORY,CATEGORIES,TAGиTAGSиспользуйте ключи и URL из запроса площадки. - Направляйте
SEARCHна поиск по каталогу сwithMetrics: falseиfilter.searchFilterиз API игр. - Обрабатывайте
Problemс сообщениемpage_not_foundкак ответ 404.
Получение списка страниц
query PlatformPages($input: FetchGamePlatformPagesInput!, $lang: Lang) {
result: FetchGamePlatformPages(input: $input) {
__typename
... on Problem {
message
}
... on GamePlatformPagesList {
count
items {
id
platformId
isActive
slug(lang: $lang)
name(lang: $lang)
disablePageBanners
useCustomTitleInMetaTags
}
}
}
}
Переменные:
{
"lang": "RU",
"input": {
"platformId": 42
}
}
Успешный ответ:
{
"data": {
"result": {
"__typename": "GamePlatformPagesList",
"count": 2,
"items": [
{
"id": "home",
"platformId": 42,
"isActive": true,
"slug": "home",
"name": "Главная",
"disablePageBanners": false,
"useCustomTitleInMetaTags": false
}
]
}
}
}
Чтобы отфильтровать список по названию, передайте необязательное поле search. Не создавайте маршруты для неактивных страниц.
Получение страницы и её блоков
query PlatformPage(
$input: FetchGamePlatformPageInput!
$lang: Lang
) {
result: FetchGamePlatformPage(input: $input) {
__typename
... on Problem {
message
}
... on GamePlatformPage {
id
isActive
slug(lang: $lang)
name(lang: $lang)
description(lang: $lang)
disablePageBanners
useCustomTitleInMetaTags
seoSettings {
ogTitle(lang: $lang)
ogDescription(lang: $lang)
ogImage(lang: $lang)
}
blocks {
type
entityId
collectionDisplayType
collectionHideTitle
collectionWrapper {
wrapIcon
hideIcon
iconColor
hideTitle
showAllCards
sort
}
content(lang: $lang) {
__typename
... on ContentTypeBlock {
content
}
... on GamePlatformCollection {
id
name(lang: $lang)
slug(lang: $lang)
icon(lang: $lang)
games(length: 0) {
count
items {
id
name(lang: $lang)
icon(lang: $lang)
platformUrl(lang: $lang)
}
}
}
... on GamePlatformCategory {
key
name
url
games(length: 0) {
count
items {
id
name(lang: $lang)
icon(lang: $lang)
platformUrl(lang: $lang)
}
}
}
... on GamePlatformTag {
key
name
url
games(length: 0) {
count
items {
id
name(lang: $lang)
icon(lang: $lang)
platformUrl(lang: $lang)
}
}
}
}
}
}
}
}
Для содержимого внутри блока страницы API выбирает размер встроенного превью игр по collectionDisplayType. Обязательный аргумент games(length: ...) не переопределяет уже загруженное превью, поэтому в примере передаётся 0 как формальное значение. Если нужен явный размер страницы и пагинация, используйте API подборок.
Переменные:
{
"lang": "RU",
"input": {
"id": "home",
"targetOS": "Desktop"
}
}
Структура успешного ответа:
{
"data": {
"result": {
"__typename": "GamePlatformPage",
"id": "home",
"isActive": true,
"slug": "home",
"name": "Главная",
"blocks": [
{
"type": "COLLECTION",
"entityId": "7",
"collectionDisplayType": "LARGE_HORIZONTAL_TILES",
"content": {
"__typename": "GamePlatformCollection",
"id": 7,
"name": "Популярное",
"slug": "popular"
}
}
]
}
}
}
Отображайте блоки в полученном порядке. Для макета используйте collectionDisplayType и collectionWrapper. Для блока MY_GAMES получите playedGames авторизованного игрока, как описано в разделе «Игрок». Если при showAllCards нужна пагинация, продолжайте загрузку через API подборок, а не только через встроенное превью.
| Тип блока | Поведение витрины |
|---|---|
CONTENT | Отобразите ContentTypeBlock.content. Очищайте HTML перед вставкой в страницу. |
CUSTOM | Выберите специальный компонент витрины по entityId. Если интерфейс не поддерживает этот идентификатор, пропустите блок или покажите безопасную заглушку: поле content не содержит данные специального компонента. |
COLLECTION | Отобразите подборку и встроенное превью игр. |
CATEGORY или TAG | Отобразите категорию или тег и встроенное превью игр. |
MY_GAMES | Загрузите игры авторизованного игрока; для остальных покажите пустое состояние или предложение войти. |