Чтобы посмотреть подробную информацию, выберите категорию.
Для отображения специальных предложений используются шаблоны. Если определить шаблон не удается, используется шаблон по умолчанию.
Шаблон
Шаблон проездного билета определяется на уровне класса, и в соответствии с ним показываются объекты, связанные с этим классом. В зависимости от шаблона элементы билета располагаются по-разному.
На рисунке ниже представлены составные части шаблона.
Название карты
В разделе с названием карты отображается логотип, название эмитента и название специального предложения. Ссылки на поля, которые используются, чтобы указать значения перечисленных элементов, так же как и их положение, менять нельзя.
Шаблон карты
В разделе с шаблоном карты содержатся дополнительные строки. Они могут быть представлены в виде полей с текстовыми структурированными данными или текстовыми модулями.
Вы можете указать число строк; от него будет зависеть количество объектов в списке class.classTemplateInfo.cardTemplateOverride.cardRowTemplateInfos[]
.
В списке может быть один или два объекта следующих типов:
oneItem
с одним элементом:item
twoItems
с двумя элементами:startItem
endItem
threeItems
с тремя элементами:startItem
midItem
endItem
Каждый из элементов – это поле для выбора одного (.firstValue
) или двух (.firstValue
и .secondValue
) значений или предопределенное значение (.predefinedItem
). Выбранные значения отображаются вместе с ярлыками. Если значений два, для их разделения используется символ "/". Так же отделяются друг от друга и связанные с ними ярлыки. В более сложных случаях подходит предопределенное значение.
Ниже приведен пример кода, который позволяет переопределить строки в шаблоне карты таким образом, чтобы указать две строки с тремя элементами в каждой. В таком случае эти строки ссылаются на шесть дополнительных полей textModuleData
на уровне класса, а также их заголовки и ярлыки.
Python
{ ... //Rest of class "textModulesData": [ { "header": "Label 1", "body": "Some info 1", "id": "myfield1" }, { "header": "Label 2", "body": "Some info 2", "id": "myfield2" }, { "header": "Label 3", "body": "Some info 3", "id": "myfield3" }, { "header": "Label 4", "body": "Some info 4", "id": "myfield4" }, { "header": "Label 5", "body": "Some info 5", "id": "myfield5" }, { "header": "Label 6", "body": "Some info 6", "id": "myfield6" } ], "classTemplateInfo": { "cardTemplateOverride": { "cardRowTemplateInfos": [{ "threeItems": { "startItem": { "firstValue": { "fields": [{ "fieldPath": "class.textModulesData['myfield1']" }] } }, "middleItem": { "firstValue": { "fields": [{ "fieldPath": "class.textModulesData['myfield2']" }] } }, "endItem": { "firstValue": { "fields": [{ "fieldPath": "class.textModulesData['myfield3']" }] } }, } },{ "threeItems": { "startItem": { "firstValue": { "fields": [{ "fieldPath": "class.textModulesData['myfield4']" }] } }, "middleItem": { "firstValue": { "fields": [{ "fieldPath": "class.textModulesData['myfield5']" }] } }, "endItem": { "firstValue": { "fields": [{ "fieldPath": "class.textModulesData['myfield6']" }] } }, } }] } } }
Java
// Rest of class .setTextModulesData((new ArrayList<TextModuleData>() { { add((new TextModuleData()).setHeader("Label 1") .setBody("Some info 1") .setId("myfield1")); add((new TextModuleData()).setHeader("Label 2") .setBody("Some info 1") .setId("myfield2")); add((new TextModuleData()).setHeader("Label 3") .setBody("Some info 3") .setId("myfield3")); add((new TextModuleData()).setHeader("Label 4") .setBody("Some info 4") .setId("myfield4")); add((new TextModuleData()).setHeader("Label 5") .setBody("Some info 5") .setId("myfield5")); add((new TextModuleData()).setHeader("Label 6") .setBody("Some info 5") .setId("myfield6")); } })) .setClassTemplateInfo((new ClassTemplateInfo()) .setCardTemplateOverride((new CardTemplateOverride()) .setCardRowTemplateInfos(new ArrayList<CardRowTemplateInfo>() { { add((new CardRowTemplateInfo()).setThreeItems((new CardRowThreeItems()) .setStartItem((new TemplateItem()).setFirstValue((new FieldSelector()).setFields(new ArrayList<FieldReference>(){ { add((new FieldReference()).setFieldPath("class.textModulesData['myfield1']")); } }))) .setMiddleItem((new TemplateItem()).setFirstValue((new FieldSelector()).setFields(new ArrayList<FieldReference>(){ { add((new FieldReference()).setFieldPath("class.textModulesData['myfield2']")); } }))) .setEndItem((new TemplateItem()).setFirstValue((new FieldSelector()).setFields(new ArrayList<FieldReference>(){ { add((new FieldReference()).setFieldPath("class.textModulesData['myfield3']")); } }))) )); add((new CardRowTemplateInfo()).setThreeItems((new CardRowThreeItems()) .setStartItem((new TemplateItem()).setFirstValue((new FieldSelector()).setFields(new ArrayList<FieldReference>(){ { add((new FieldReference()).setFieldPath("class.textModulesData['myfield4']")); } }))) .setMiddleItem((new TemplateItem()).setFirstValue((new FieldSelector()).setFields(new ArrayList<FieldReference>(){ { add((new FieldReference()).setFieldPath("class.textModulesData['myfield5']")); } }))) .setEndItem((new TemplateItem()).setFirstValue((new FieldSelector()).setFields(new ArrayList<FieldReference>(){ { add((new FieldReference()).setFieldPath("class.textModulesData['myfield6']")); } }))) )); } })))
PHP
// Rest of class $textModulesData1 = new Google_Service_Walletobjects_TextModuleData(); $textModulesData1->setBody("Some info 1"); $textModulesData1->setHeader("Label 1"); $textModulesData1->setId("myfield1"); $textModulesData2 = new Google_Service_Walletobjects_TextModuleData(); $textModulesData2->setBody("Some info 2"); $textModulesData2->setHeader("Label 2"); $textModulesData2->setId("myfield2"); $textModulesData3 = new Google_Service_Walletobjects_TextModuleData(); $textModulesData3->setBody("Some info 3"); $textModulesData3->setHeader("Label 3"); $textModulesData3->setId("myfield3"); $textModulesData4 = new Google_Service_Walletobjects_TextModuleData(); $textModulesData4->setBody("Some info 4"); $textModulesData4->setHeader("Label 4"); $textModulesData4->setId("myfield4"); $textModulesData5 = new Google_Service_Walletobjects_TextModuleData(); $textModulesData5->setBody("Some info 5"); $textModulesData5->setHeader("Label 5"); $textModulesData5->setId("myfield5"); $textModulesData6 = new Google_Service_Walletobjects_TextModuleData(); $textModulesData6->setBody("Some info 6"); $textModulesData6->setHeader("Label 6"); $textModulesData6->setId("myfield6"); $textModulesDatas = array($textModulesData1, $textModulesData2, $textModulesData3, $textModulesData4, $textModulesData5, $textModulesData6); $startItemField = new Google_Service_Walletobjects_FieldReference(); $startItemField->setFieldPath("class.textModulesData['myfield1']"); $startItemFirstValue = new Google_Service_Walletobjects_FieldSelector(); $startItemFirstValue->setFields(array($startItemField)); $startItem = new Google_Service_Walletobjects_TemplateItem(); $startItem->setFirstValue($startItemFirstValue); $middleItemField = new Google_Service_Walletobjects_FieldReference(); $middleItemField->setFieldPath("class.textModulesData['myfield2']"); $middleItemFirstValue = new Google_Service_Walletobjects_FieldSelector(); $middleItemFirstValue->setFields(array($middleItemField)); $middleItem = new Google_Service_Walletobjects_TemplateItem(); $middleItem->setFirstValue($middleItemFirstValue); $endItemField = new Google_Service_Walletobjects_FieldReference(); $endItemField->setFieldPath("class.textModulesData['myfield3']"); $endItemFirstValue = new Google_Service_Walletobjects_FieldSelector(); $endItemFirstValue->setFields(array($endItemField)); $endItem = new Google_Service_Walletobjects_TemplateItem(); $endItem->setFirstValue($endItemFirstValue); $cardRowTemplate = new Google_Service_Walletobjects_CardRowThreeItems(); $cardRowTemplate->setStartItem($startItem); $cardRowTemplate->setMiddleItem($middleItem); $cardRowTemplate->setEndItem($endItem); $cardRowTemplateInfo1 = new Google_Service_Walletobjects_CardRowTemplateInfo(); $cardRowTemplateInfo1->setThreeItems($cardRowTemplate); $startItemField2 = new Google_Service_Walletobjects_FieldReference(); $startItemField2->setFieldPath("class.textModulesData['myfield4']"); $startItemFirstValue2 = new Google_Service_Walletobjects_FieldSelector(); $startItemFirstValue2->setFields(array($startItemField2)); $startItem2 = new Google_Service_Walletobjects_TemplateItem(); $startItem2->setFirstValue($startItemFirstValue2); $middleItemField2 = new Google_Service_Walletobjects_FieldReference(); $middleItemField2->setFieldPath("class.textModulesData['myfield5']"); $middleItemFirstValue2 = new Google_Service_Walletobjects_FieldSelector(); $middleItemFirstValue2->setFields(array($middleItemField2)); $middleItem2 = new Google_Service_Walletobjects_TemplateItem(); $middleItem2->setFirstValue($middleItemFirstValue2); $endItemField2 = new Google_Service_Walletobjects_FieldReference(); $endItemField2->setFieldPath("class.textModulesData['myfield6']"); $endItemFirstValue2 = new Google_Service_Walletobjects_FieldSelector(); $endItemFirstValue2->setFields(array($endItemField2)); $endItem2 = new Google_Service_Walletobjects_TemplateItem(); $endItem2->setFirstValue($endItemFirstValue2); $cardRowTemplate2 = new Google_Service_Walletobjects_CardRowThreeItems(); $cardRowTemplate2->setStartItem($startItem2); $cardRowTemplate2->setMiddleItem($middleItem2); $cardRowTemplate2->setEndItem($endItem2); $cardRowTemplateInfo2 = new Google_Service_Walletobjects_CardRowTemplateInfo(); $cardRowTemplateInfo2->setThreeItems($cardRowTemplate2); $cardTemplateOverride = new Google_Service_Walletobjects_CardTemplateOverride(); $cardTemplateOverride->setCardRowTemplateInfos(array($cardRowTemplateInfo1, $cardRowTemplateInfo2)); $classTemplateInfo = new Google_Service_Walletobjects_ClassTemplateInfo(); $classTemplateInfo->setCardTemplateOverride($cardTemplateOverride); $payload->setTextModulesData($textModulesDatas); $payload->setClassTemplateInfo($classTemplateInfo);
Код создает карту, где раздел с шаблоном кода представлен в следующем формате:
![Пример переопределения ярлыка](https://developers.google.cn/static/pay/passes/images/template/LabelOverride.png?authuser=5&hl=ru)
Элементы, для которых не указаны значения, не отображаются. Подробнее об этом написано здесь. Это относится и к строкам. Элементы частично заполненных строк отображаются в другом, более удобном, порядке.
Если вы не выберете шаблон карты, количество строк и число элементов, будут использованы параметры по умолчанию. Подробнее…
Если вы определили главное изображение и в списке cardRowTemplateInfos
несколько строк, то оно будет отображаться под первой строкой. Если же строка одна, это изображение появится над ней.
Штрихкод карты
В разделе со штрихкодом содержатся дополнительные текстовые и графические элементы, которые отображаются под штрихкодом и над ним. Добавлять их необязательно.
В этом же разделе находятся ещё три поля для выбора значений: два расположены рядом друг с другом над штрихкодом, а одно – под ним. У этих полей нет ярлыков. Они могут содержать текстовые структурированные данные, а также текстовые или графические модули. Изображения должны соответствовать правилам фирменного оформления Google.
У штрихкода есть тип и значение. Поддерживаемые типы штрихкодов приведены здесь. Кроме того, под штрихкодом может находиться текст. Он нужен, чтобы упростить сканирование кода, но может использоваться и для других целей.
Ниже приведен пример кода, который позволяет переопределить штрихкоды карты таким образом, чтобы изображение показывалось над штрихкодом.
Python
#... rest of class "imageModulesData": [ { "mainImage": { "sourceUri": { "uri": "http://farm4.staticflickr.com/3738/12440799783_3dc3c20606_b.jpg", "description": "Coffee" } }, "Id": "myimage" } ], "classTemplateInfo": { "cardBarcodeSectionDetails": { "firstTopDetail": { "fieldSelector": { "fields": [ { "fieldPath": "class.imageModulesData['myimage'].mainImage" } ] } } } } }
Java
//... rest of class .setImageModulesData((new ArrayList<ImageModuleData>() { { add((new ImageModuleData()) .setId("myimage") .setMainImage((new Image()).setSourceUri((new ImageUri()).setDescription("Coffee beans") .setUri("http://farm4.staticflickr.com/3738/12440799783_3dc3c20606_b.jpg")))); } })) .setClassTemplateInfo((new ClassTemplateInfo()) .setCardBarcodeSectionDetails((new CardBarcodeSectionDetails()) .setFirstTopDetail((new BarcodeSectionDetail()) .setFieldSelector((new FieldSelector()) .setFields((new ArrayList<FieldReference>(){ { add((new FieldReference()).setFieldPath("class.imageModulesData['myimage'].mainImage")); } }))))) }
PHP
//... rest of class $imageUri = new Google_Service_Walletobjects_ImageUri(); $imageUri->setUri("https://farm8.staticflickr.com/7340/11177041185_a61a7f2139_o.jpg"); $imageUri->setDescription("Baconrista flights image"); $image = new Google_Service_Walletobjects_Image(); $image->setSourceUri($imageUri); $imageModulesData = new Google_Service_Walletobjects_ImageModuleData(); $imageModulesData->setMainImage($image); $imageModulesData->setId("myimage"); $cardBarcodeFieldReference = new Google_Service_Walletobjects_FieldReference(); $cardBarcodeFieldReference->setFieldPath("class.imageModulesData['myimage'].mainImage"); $cardBarcodeFieldSelector = new Google_Service_Walletobjects_FieldSelector(); $cardBarcodeFieldSelector->setFields(array($cardBarcodeFieldReference)); $cardBarcodeDetail = new Google_Service_Walletobjects_BarcodeSectionDetail(); $cardBarcodeDetail->setFieldSelector($cardBarcodeFieldSelector); $cardBarcodeSectionDetails = new Google_Service_Walletobjects_CardBarcodeSectionDetails(); $cardBarcodeSectionDetails->setFirstTopDetail($cardBarcodeDetail); $classTemplateInfo = new Google_Service_Walletobjects_ClassTemplateInfo(); $classTemplateInfo->setCardBarcodeSectionDetails($cardBarcodeSectionDetails); $payload->setClassTemplateInfo($classTemplateInfo); $payload->setImageModuleData($imageModulesData);
Код создает карту, где раздел со штрихкодом представлен в следующем формате:
![Пример переопределения штрихкода карты](https://developers.google.cn/static/pay/passes/images/template/BarcodeOverride.png?authuser=5&hl=ru)
Если вы не перезапишете раздел со штрихкодом, то будут использоваться значения по умолчанию. Подробнее…
Шаблон подробных сведений
В этом шаблоне представлен список элементов class.classTemplateInfo.detailsTemplateOverride.detailsItemInfos[]
, которые могут содержать сообщения, структурированные данные или модули "текст", "изображение" или "ссылка".
Каждый из элементов – это поле для выбора одного (.firstValue
) или двух (.firstValue
и .secondValue
) значений или предопределенное значение (.predefinedItem
). Выбранные значения отображаются вместе с ярлыками. Если значений два, для их разделения используется символ "/". Так же отделяются друг от друга и связанные с ними ярлыки. В более сложных случаях подходит предопределенное значение. Обратите внимание, что поля с графическими модулями отображаются с заданной шириной и без ярлыков.
Ниже приведен пример кода, который позволяет переопределить раздел с подробными сведениями таким образом, чтобы показывать одно поле linksModuleData
с ярлыком.
Python
//... rest of class "linksModuleData": { "uris": [ { "uri": "http://maps.google.com/", "description": "Nearby Locations", "id":"mylink" } ] }, "classTemplateInfo": { "detailsTemplateOverride": { "detailsItemInfos": [ { "item":{ "firstValue": { "fields": [{ "fieldPath": "class.linksModuleData.uris['mylink']" }] } } } ] } } //... rest of class
Java
//... rest of class .setLinksModuleData((new ArrayList<LinksModuleData>() { { add((new LinksModuleData()).setDescription("Nearby Locations") .setUri("http://maps.google.com/") .setId("mylink")); })) .setClassTemplateInfo((new ClassTemplateInfo()) .setDetailsTemplateOverride((new DetailsTemplateOverride()) .setDetailsItemInfos(new ArrayList<DetailsItemInfo>(){ { add((new DetailsItemInfo()) .setItem((new TemplateItem()).setFirstValue((new FieldSelector()).setFields(new ArrayList<FieldReference>(){ { add((new FieldReference()).setFieldPath("class.linksModuleData.uris['mylink']")); } })))); } })) //... rest of class
PHP
//... rest of class building $locationUri = new Google_Service_Walletobjects_Uri(); $locationUri->setUri("http://maps.google.com/"); $locationUri->setDescription("Nearby Locations"); $locationUri->setId("mylink"); $linksModuleData = new Google_Service_Walletobjects_LinksModuleData(); $linksModuleData->setUris(array($locationUri)); $detailItemFieldReference = new Google_Service_Walletobjects_FieldReference(); $detailItemFieldReference->setFieldPath("class.linksModuleData.uris['mylink']"); $detailItemFieldSelector = new Google_Service_Walletobjects_FieldSelector(); $detailItemFieldSelector->setFields(array($detailItemFieldReference)); $detailItem = new Google_Service_Walletobjects_TemplateItem(); $detailItem->setFirstValue($detailItemFieldSelector); $detailsItemInfo = new Google_Service_Walletobjects_DetailsItemInfo(); $detailsItemInfo->setItem($detailItem); $cardDetailsTemplateOverride = new Google_Service_Walletobjects_DetailsTemplateOverride(); $cardDetailsTemplateOverride->setDetailsItemInfos(array($detailsItemInfo)); $classTemplateInfo = new Google_Service_Walletobjects_ClassTemplateInfo(); $classTemplateInfo->setDetailsTemplateOverride($cardDetailsTemplateOverride); $payload->setClassTemplateInfo($classTemplateInfo); $payload->setLinksModuleData($linksModuleData); //... rest of class
Код создает карту, где раздел с подробными сведениями представлен в следующем формате:
![Пример переопределения подробных сведений](https://developers.google.cn/static/pay/passes/images/template/DetailOverride.png?authuser=5&hl=ru)
Элементы, для которых не указаны значения, не отображаются. Подробнее об этом написано здесь.
Если вы не перезапишете шаблон подробных сведений, то ссылки на поля в стандартном списке будут представлены в порядке по умолчанию. Подробнее…
Шаблон списка
Шаблон списка нужен для показа в приложении элементов раздела "Карты". В списке билет представлен с логотипом и на цветном фоне, а также с дополнительной информацией на трех строках.
Ниже приведен пример кода, который позволяет переопределить шаблон списка таким образом, чтобы показывать поле со сроком окончания действия одного объекта в первой строке шаблона.
Python
#... rest of class definition "classTemplateInfo": { "listTemplateOverride":{ "firstRowOption": { "fieldOption":{ "fields": [{ "fieldPath": "object.validTimeInterval.end" }] } } } } }
Java
//... rest of class .setClassTemplateInfo((new ClassTemplateInfo()) .setListTemplateOverride((new ListTemplateOverride()) .setFirstRowOption((new FirstRowOption()) .setFieldOption((new FieldSelector()).setFields(new ArrayList<FieldReference>(){ { add((new FieldReference()).setFieldPath("object.validTimeInterval.end")); } })))) //... rest of class
PHP
//... rest of class $fieldReference = new Google_Service_Walletobjects_FieldReference(); $fieldReference->setFieldPath("object.validTimeInterval.end"); $fieldOption = new Google_Service_Walletobjects_FieldSelector(); $fieldOption->setFields(array($fieldReference)); $firstRowOption = new Google_Service_Walletobjects_FirstRowOption(); $firstRowOption->setFieldOption($fieldOption); $listTemplateOverride = new Google_Service_Walletobjects_ListTemplateOverride(); $listTemplateOverride->setFirstRowOption($firstRowOption); $classTemplateInfo = new Google_Service_Walletobjects_ClassTemplateInfo(); $classTemplateInfo->setListTemplateOverride($listTemplateOverride); $payload->setClassTemplateInfo($classTemplateInfo); //... rest of class
Код создает карту, где шаблон списка представлен в следующем формате:
![Пример переопределения списка](https://developers.google.cn/static/pay/passes/images/template/ListOverride.png?authuser=5&hl=ru)
Три строки могут быть представлены в виде элементов для выбора поля без ярлыков. В случае со сгруппированными билетами в третьей строке всегда указывается их число, а во второй – дата начала.
Ярлыки
У всех полей со структурированными данными есть ярлыки, которые предоставляет Google. Мы переводим их названия на все поддерживаемые языки.
Некоторые ярлыки можно изменить, используя поля class.custom<name_of_the_field>Label
. Если вы это сделаете, вам придется самостоятельно переводить названия на все желаемые языки.
Ссылки на поля
Ссылки на поля используются в разных частях шаблона с форматом class.classTemplateInfo.*.fields[]
. В ссылке на поле содержится список путей к сообщениям, структурированным данным или модулям "текст", "изображение" или "ссылка".
В ссылку на поле можно добавить не каждый вид пути. В некоторых из них могут допускаться только пути к текстовым модулям или структурированным текстовым данным. Последние представляются в виде полей типа "строка", "локализованная строка", "дата" и "деньги".
Список можно использовать в качестве резервного способа. В таком случае, если в первом пути окажется пустое поле, будет выполнен следующий. Этот способ подходит для путей к текстовым модулям или структурированным текстовым данным. При этом допускается применение только одного из двух типов. Используйте такой способ, только если в некоторых объектах будет встречаться определенный набор полей. В остальных случаях для разных примеров использования стоит создавать отдельные классы.
Если все пути в списке возвращают пустые значения, значит элемент отображаться не будет. Чтобы такой ситуации не возникало, заполните хотя бы одно поле. Если в поле нужно указать нулевое значение, добавьте в него специальный символ, например "–". Такой метод подойдет, даже если значение в поле может состоять только из одного пробела.
Для каждого элемента в списке следует добавлять порядковый номер или идентификатор ссылки. Идентификатор можно указать в поле .id
. По возможности лучше всегда указывать идентификатор.
Ниже показано, как это сделать.
object.imageModulesData[0].id = my-first-id
object.imageModulesData[1].id = my-second-id
class.detailsTemplateOverride.detailsItemInfos[0].item.firstValue.fields[0].fieldPath = object.imageModulesData[‘my-second-id’]
class.detailsTemplateOverride.detailsItemInfos[1].item.firstValue.fields[0].fieldPath = object.imageModulesData[0]
В этом случае в подробных сведениях о билете первым элементом станет второе изображение, указанное в объекте, а вторым – первое.
Шаблон по умолчанию
Для каждого класса и объекта может быть представлен только один графический модуль. Если вам нужно больше модулей для того или иного уровня, перезапишите шаблон по умолчанию.
Модулей типа "текст" можно добавить до 10 штук как для класса, так и для объекта. Поля отображаются в том порядке, в котором они представлены в массиве. Если вам нужно больше модулей для того или иного уровня, перезапишите шаблон по умолчанию.
Можно добавить до 10 сообщений как для класса, так и для модуля. Порядок сообщений не гарантирован. Если вам нужно больше модулей для того или иного уровня либо определенный порядок, перезапишите шаблон по умолчанию.
Для модуля ссылок ограничений нет. Для каждого уровня URI будут отображаться в следующем порядке:
- Координаты на карте
- Номера телефонов
- Адреса электронной почты
- Веб-страницы