Маркетплейс игр на своем сайте
Виджет игр-шаблонов — подключение и настройка
Виджет «Маркетплейс» позволяет разместить на сайте каталог игр QQ для авторов. Такую игру можно приобрести и проводить самому. Вы можете настроить, какие игры показывать, сколько карточек выводить, какие фильтры доступны посетителям, а также выбрать светлую или тёмную тему и собственный акцентный цвет.
1. Быстрое подключение
Добавьте следующий код в нужное место внутри <body> вашей страницы:
<script type="module" src="https://qq.land/widget-mp/index.js"></script>
<qq-template-games></qq-template-games>
Готово! Если сайт разрешает выполнять JavaScript и использовать пользовательские HTML-элементы, каталог появится на странице.
2. Подключение с настройками
Чтобы изменить виджет, найдите его элемент в JavaScript и установите нужные свойства.
Пример: шесть игр, фильтры для посетителей и тёмное оформление:
<!-- Подключение скрипта и место отображения -->
<script type="module" src="https://qq.land/widget-mp/index.js"></script>
<qq-template-games></qq-template-games>
<!-- Настройка -->
<script type="module">
const widgetComponent = document.querySelector('qq-template-games');
widgetComponent.filter = JSON.stringify({
records: 6
});
widgetComponent.userFilters = 'format,transport,franchise,author';
widgetComponent.showUserFilters = 'true';
widgetComponent.accentColor = '#ffeb3b';
widgetComponent.theme = 'dark';
</script>
В этом примере посетители видят до 6 игр, могут фильтровать их по формату, транспорту, франшизе и автору, а сам виджет оформлен в тёмной теме с жёлтым акцентом.
Принцип настройки:
filter— какие игры отбирать изначально; объект условий передаётся черезJSON.stringify(...).userFilters— какие переключаемые фильтры будут доступны посетителю сайта.showUserFilters— включает панель с фильтрами, поиском и сортировкой.accentColorиtheme— внешний вид.
3. Основные параметры виджета
| Свойство | Назначение | Пример |
|---|---|---|
filter |
Начальные условия отбора и количество игр | JSON.stringify({ records: 6 }) |
userFilters |
Список доступных посетителям фильтров | 'format,transport,franchise,author' |
showUserFilters |
Показать фильтры, поиск и сортировку | 'true' |
accentColor |
Акцентный цвет интерфейса в формате HEX | '#ffeb3b' |
theme |
Цветовая тема | 'light' или 'dark' |
Обратите внимание:
filterполучает строку с JSON, аshowUserFiltersв примере разработчика включается строкой'true'(в кавычках).
4. Начальная фильтрация игр: filter
Через filter можно заранее задать условия отбора. Например, показывать только игры из определённого города, от конкретного автора или с определённой последовательностью заданий.
widgetComponent.filter = JSON.stringify({
'cities.name': 'Владимир',
transport: 'FOOT',
records: 6
});
Значение filter — JavaScript-объект, преобразованный в JSON-строку. Все условия записываются внутри фигурных скобок и разделяются запятыми.
4.1. Полный перечень известных полей фильтрации
Поле внутри filter |
Что отбирает | Пример значения |
|---|---|---|
records |
Количество выводимых игр | 6 |
'games.name' |
Название игры | { ilike: 'достать ножи' } |
'cities.name' |
Город или несколько городов | 'Владимир' либо ['Владимир', 'Дмитров'] |
tags |
Форматы/теги игры | { inArray: ['PHOTO', 'BRAIN'] } |
transport |
Транспорт | 'CAR' либо ['CAR', 'FOOT'] |
schema |
Последовательность заданий | 'LINEAR' либо ['LINEAR', 'RANDOM'] |
'games.id' |
ID конкретных игр | '1' либо ['1', '2', '3'] |
start_type |
Способ запуска игры | { eq: ['team'] } |
franchise_id |
ID франшизы или нескольких франшиз | '1' либо ['1', '2', '3'] |
owner |
ID автора игры | { eq: '1' } |
'-or' |
Условие ИЛИ для перечисленных внутри него полей | { 'cities.name': 'Владимир', transport: 'NONE' } |
Количество игр по умолчанию — 3. Чтобы вывести другое количество, задайте records.
4.2. Название игры: games.name
Для поиска по названию используется оператор ilike. По сообщению разработчика, такой поиск не зависит от регистра букв.
widgetComponent.filter = JSON.stringify({
'games.name': {
ilike: 'достать ножи'
},
records: 6
});
Например, запрос достать ножи не требует точно повторять заглавные и строчные буквы в названии игры.
4.3. Город: cities.name
Один город:
widgetComponent.filter = JSON.stringify({
'cities.name': 'Владимир',
records: 6
});
Несколько городов:
widgetComponent.filter = JSON.stringify({
'cities.name': ['Владимир', 'Дмитров'],
records: 6
});
Совет: указывайте названия городов соблюдая регистр, в каком они заведены на QQ.
4.4. Форматы игр: tags
Форматы задаются массивом значений через оператор inArray.
| Значение | Формат игры |
|---|---|
STREET |
Лёгкие уличные квесты |
URBAN |
Сложные квесты по заброшенным местам |
BRAIN |
Виртуальные игры |
SNOOP |
Детективные квесты |
MAZE |
Квесты-лабиринты |
TOUR |
Экскурсии |
COMBAT |
Межкомандные сражения |
PHOTO |
Фото-игры |
Пример: фото-игры и детективные квесты:
widgetComponent.filter = JSON.stringify({
tags: {
inArray: ['PHOTO', 'SNOOP']
},
records: 6
});
Пример со всеми перечисленными форматами:
widgetComponent.filter = JSON.stringify({
tags: {
inArray: [
'PHOTO', 'BRAIN', 'COMBAT', 'SNOOP',
'TOUR', 'MAZE', 'STREET', 'URBAN'
]
}
});
Важно: значения тегов в этом виджете записываются заглавными буквами:
PHOTO,BRAINи т. д. Не путайте их со строчными значениями атрибутаformatиз другого виджета<qq-list-games>.
4.5. Транспорт: transport
| Значение | Описание |
|---|---|
NONE |
Без транспорта (например, виртуальные игры) |
ANY |
Любой транспорт |
CAR |
Автомобиль |
FOOT |
Пешком |
BIKE |
Велосипед |
Только пешие игры:
widgetComponent.filter = JSON.stringify({
transport: 'FOOT'
});
Автомобильные и пешие игры:
widgetComponent.filter = JSON.stringify({
transport: ['CAR', 'FOOT']
});
4.6. Последовательность заданий: schema
| Значение | Описание |
|---|---|
LINEAR |
Линейная последовательность |
RANDOM |
Случайная последовательность |
ALL |
Все задания доступны сразу |
CUSTOM |
Сложная, настраиваемая последовательность |
Только линейные игры:
widgetComponent.filter = JSON.stringify({
schema: 'LINEAR'
});
Линейные и случайные:
widgetComponent.filter = JSON.stringify({
schema: ['LINEAR', 'RANDOM']
});
4.7. Конкретные игры по ID: games.id
Если нужно показывать заранее выбранные игры, используйте их ID.
Одна игра:
widgetComponent.filter = JSON.stringify({
'games.id': '118'
});
Несколько игр:
widgetComponent.filter = JSON.stringify({
'games.id': ['118', '119', '120']
});
ID в примере приведены для иллюстрации синтаксиса, а не как подтверждённые ID доступных шаблонов.
4.8. Способ запуска: start_type
Для этого поля применяется оператор eq с массивом значений.
| Значение | Как указано разработчиком |
|---|---|
team |
Игры типа fun |
auto |
Игры типа run |
manual |
Игры типа run |
Для fun:
widgetComponent.filter = JSON.stringify({
start_type: {
eq: ['team']
}
});
Для run:
widgetComponent.filter = JSON.stringify({
start_type: {
eq: ['auto', 'manual']
}
});
Обратите внимание: здесь используется поле
start_type, а не атрибутtypeвиджета списка игр. Значенияteam,auto,manualи связь сfun/runприведены по примеру разработчика.
4.9. Франшиза: franchise_id
Одна франшиза:
widgetComponent.filter = JSON.stringify({
franchise_id: '1'
});
Несколько франшиз:
widgetComponent.filter = JSON.stringify({
franchise_id: ['1', '2', '3']
});
Замените значения на нужные ID франшиз.
4.10. Автор игры: owner
Для отбора по автору используется поле owner с оператором eq.
widgetComponent.filter = JSON.stringify({
owner: {
eq: '1'
},
records: 6
});
Замените '1' на ID нужного автора.
4.11. Условие «ИЛИ»: -or
По умолчанию отдельные условия в объекте filter задают совместный отбор. Если нужно объединить несколько условий по принципу «ИЛИ», поместите их внутрь поля '-or'.
Пример: показать игры из Владимира ИЛИ игры без транспорта (в том числе из других городов):
widgetComponent.filter = JSON.stringify({
'-or': {
'cities.name': 'Владимир',
transport: 'NONE'
},
records: 6
});
Подойдут игры, удовлетворяющие хотя бы одному из этих двух условий.
Важно: поле записывается строго как
'-or', с дефисом и в кавычках, внутри объектаfilter. Это не отдельное JavaScript-свойство виджета и не HTML-атрибутorиз виджета<qq-list-games>.
5. Фильтры для посетителей: userFilters
Помимо начальной выборки, можно разрешить посетителям самостоятельно выбирать параметры игр.
Поддерживаемые элементы панели:
Значение в userFilters |
Что сможет выбирать посетитель |
|---|---|
format |
Формат игры |
transport |
Транспорт |
franchise |
Франшизу |
author |
Автора |
Значения перечисляются через запятую в одной строке.
Показать все четыре фильтра:
widgetComponent.userFilters = 'format,transport,franchise,author';
widgetComponent.showUserFilters = 'true';
Показать только франшизу и автора:
widgetComponent.userFilters = 'franchise,author';
widgetComponent.showUserFilters = 'true';
Важно:
userFiltersуправляет фильтрами для посетителя, аfilterограничивает исходный набор игр. Для отображения панели необходимоshowUserFilters = 'true'; вместе с фильтрами разработчик указывает отображение поиска и сортировки.
6. Оформление: цвет и тема
6.1. Акцентный цвет: accentColor
Укажите собственный цвет в формате HEX:
widgetComponent.accentColor = '#ffeb3b';
Примеры цветов:
| Цвет | Код |
|---|---|
| Жёлтый | #ffeb3b |
| Зелёный | #4caf50 |
| Синий | #2196f3 |
| Оранжевый | #ff9800 |
| Красный | #f44336 |
Это примеры HEX-цветов, а не встроенные цветовые схемы.
6.2. Светлая и тёмная темы: theme
| Значение | Результат |
|---|---|
'light' |
Светлая тема (по умолчанию) |
'dark' |
Тёмная тема |
widgetComponent.theme = 'dark';
Тему и акцентный цвет можно настраивать независимо. Разработчик указывает, что цвет по умолчанию — зеленовато-жёлтый; точный HEX по умолчанию не предоставлен.
Демонстрация двух тем: qq.land/widget-mp/.
7. Готовые примеры для копирования
Во всех примерах ниже приводится полный код одного виджета. Выберите подходящий вариант и вставьте его в разрешающий JavaScript HTML-блок на странице.
Пример 1. Обычный каталог без настроек
<script type="module" src="https://qq.land/widget-mp/index.js"></script>
<qq-template-games></qq-template-games>
Пример 2. Шесть игр из Владимира, светлая тема
<script type="module" src="https://qq.land/widget-mp/index.js"></script>
<qq-template-games></qq-template-games>
<script type="module">
const widgetComponent = document.querySelector('qq-template-games');
widgetComponent.filter = JSON.stringify({
'cities.name': 'Владимир',
records: 6
});
widgetComponent.theme = 'light';
widgetComponent.accentColor = '#4caf50';
</script>
Пример 3. Пешие и автомобильные игры с выбором формата
<script type="module" src="https://qq.land/widget-mp/index.js"></script>
<qq-template-games></qq-template-games>
<script type="module">
const widgetComponent = document.querySelector('qq-template-games');
widgetComponent.filter = JSON.stringify({
transport: ['FOOT', 'CAR'],
records: 6
});
widgetComponent.userFilters = 'format,transport';
widgetComponent.showUserFilters = 'true';
</script>
Пример 4. Виртуальные и детективные игры, тёмная тема
<script type="module" src="https://qq.land/widget-mp/index.js"></script>
<qq-template-games></qq-template-games>
<script type="module">
const widgetComponent = document.querySelector('qq-template-games');
widgetComponent.filter = JSON.stringify({
tags: {
inArray: ['BRAIN', 'SNOOP']
},
records: 6
});
widgetComponent.theme = 'dark';
widgetComponent.accentColor = '#ffeb3b';
</script>
Пример 5. Игры выбранного автора и франшизы
<script type="module" src="https://qq.land/widget-mp/index.js"></script>
<qq-template-games></qq-template-games>
<script type="module">
const widgetComponent = document.querySelector('qq-template-games');
widgetComponent.filter = JSON.stringify({
franchise_id: '1',
owner: {
eq: '1'
},
records: 6
});
</script>
Здесь '1' — пример ID, подставьте реальные идентификаторы.
Пример 6. Вывод только выбранных игр по ID
<script type="module" src="https://qq.land/widget-mp/index.js"></script>
<qq-template-games></qq-template-games>
<script type="module">
const widgetComponent = document.querySelector('qq-template-games');
widgetComponent.filter = JSON.stringify({
'games.id': ['118', '119', '120'],
records: 3
});
</script>
Указанные ID условные: замените их на нужные ID игр-шаблонов.
Пример 7. Игры из Владимира ИЛИ игры без транспорта
<script type="module" src="https://qq.land/widget-mp/index.js"></script>
<qq-template-games></qq-template-games>
<script type="module">
const widgetComponent = document.querySelector('qq-template-games');
widgetComponent.filter = JSON.stringify({
'-or': {
'cities.name': 'Владимир',
transport: 'NONE'
},
records: 6
});
widgetComponent.userFilters = 'format,transport,franchise,author';
widgetComponent.showUserFilters = 'true';
</script>
Пример 8. Полная настройка со всеми основными возможностями
В примере отбираются линейные или случайные игры заданных форматов, доступные в двух городах, с запуском auto или manual. Посетителям доступны фильтры, поиск и сортировка.
<script type="module" src="https://qq.land/widget-mp/index.js"></script>
<qq-template-games></qq-template-games>
<script type="module">
const widgetComponent = document.querySelector('qq-template-games');
widgetComponent.filter = JSON.stringify({
'cities.name': ['Владимир', 'Дмитров'],
tags: {
inArray: ['STREET', 'URBAN', 'PHOTO']
},
transport: ['CAR', 'FOOT'],
schema: ['LINEAR', 'RANDOM'],
start_type: {
eq: ['auto', 'manual']
},
records: 6
});
widgetComponent.userFilters = 'format,transport,franchise,author';
widgetComponent.showUserFilters = 'true';
widgetComponent.accentColor = '#ffeb3b';
widgetComponent.theme = 'dark';
</script>
Важно: условия отбора в этом примере применяются совместно. Если игр, соответствующих сразу всем условиям, нет, каталог может оказаться пустым. Уберите лишние ограничения, если результат слишком узкий.
Пример 9. Два каталога на одной странице с разными настройками
Если на странице несколько экземпляров виджета, используйте уникальные id вместо общего querySelector('qq-template-games'), который находит только первый элемент.
<script type="module" src="https://qq.land/widget-mp/index.js"></script>
<h2>Игры во Владимире</h2>
<qq-template-games id="qq-local"></qq-template-games>
<h2>Виртуальные игры</h2>
<qq-template-games id="qq-online"></qq-template-games>
<script type="module">
const localWidget = document.querySelector('#qq-local');
const onlineWidget = document.querySelector('#qq-online');
localWidget.filter = JSON.stringify({
'cities.name': 'Владимир',
records: 6
});
localWidget.theme = 'light';
onlineWidget.filter = JSON.stringify({
transport: 'NONE',
records: 6
});
onlineWidget.theme = 'dark';
onlineWidget.accentColor = '#ffeb3b';
</script>
Примечание: здесь показан способ независимо назначать настройки двум HTML-элементам. Одновременная работа нескольких экземпляров зависит от реализации установленной версии скрипта; в предоставленной информации она отдельно не подтверждена.
8. Типичные ошибки и решения
| Проблема | Что проверить |
|---|---|
| Виджет не отображается | Добавлены ли <qq-template-games> и скрипт https://qq.land/widget-mp/index.js |
| На сайте виден код, а не каталог | HTML-редактор экранирует пользовательский HTML или запрещает JavaScript |
| Настройки фильтрации не применяются | Используется ли JSON.stringify({...}), верно ли записаны имена полей |
| Поиск по названию не работает как ожидается | Указаны ли 'games.name' и оператор ilike |
| Не фильтруются теги | Указан ли tags: { inArray: [...] } и значения в верхнем регистре |
| Не работает объединение «ИЛИ» | Используется ли поле '-or' внутри filter |
| Показано только три игры | Задайте records: 6 или другое нужное число; по умолчанию — 3 |
| Не появляется панель фильтров | Указано ли widgetComponent.showUserFilters = 'true' |
| Не те фильтры в панели | Проверить строку userFilters, например 'franchise,author' |
| Не меняется тема или цвет | Проверьте theme, HEX-значение accentColor и имя переменной виджета |
| Настраивается не тот виджет | Используйте индивидуальные id и точный селектор элемента |