登机牌支持模板渲染。如果未定义任何模板,则使用默认模板。
模板定义
卡券模板在类级别定义,用于显示与该类关联的任何对象。该模板定义了要在卡券的不同部分中显示的字段。
该模板分为以下几个部分:
Android
Web
卡片标题
Android
|
默认卡片标题
宽徽标卡片标题
|
Web
|
|
默认卡片标题
宽徽标卡片标题
|
卡片标题部分会显示航空公司的徽标、名称以及航班摘要。 这三个元素都是必需的,用于填充这些元素的字段引用及其位置都不能更改。
如果未设置 class.origin.airportNameOverride 或 class.destination.airportNameOverride,系统会自动使用 class.origin.airportIataCode 和 class.destination.airportIataCode 中与 IATA 代码关联的城市填充机场的城市名称。
设置宽徽标字段后,在移动设备上,包含徽标和颁发者名称的默认模板标题会被替换为宽徽标。
在创建宽幅标题徽标时,请遵循宽幅徽标图片指南,以便在卡券上以最佳方式显示图片。
卡片模板
Android
Web
卡片模板部分用于显示额外行。这些行可以包含基于文本的结构化数据字段或文本模块字段。
您可以指定行数,以定义 class.classTemplateInfo.cardTemplateOverride.cardRowTemplateInfos[] 列表中的对象数量。该列表至少需要一个元素,我们建议最多使用两个元素。每个元素都必须是以下类型之一:
-
oneItem,接受一个项:item
-
twoItems,它接受两个项:startItemendItem
-
threeItems,它接受三个项:startItemmiddleItemendItem
每个项都可以定义为单个字段选择器 (.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);
该代码会创建一个具有以下代码模板部分格式的卡券:
如果某项内容为空,则不会显示。如需了解详情,请参阅字段引用。如果某行中的所有项都为空,则该行不会显示。如果某行中的部分(而非全部)内容为空,则非空内容会重新排列,并显示为内容较少的一行。
如果您不替换卡片模板,系统会使用默认行数、默认项数和默认字段引用。如需了解详情,请参阅默认模板。
定义主打图片后,如果 cardRowTemplateInfos 列表中有多行,则主打图片可以显示在第一行之后;如果只有一行,则可以显示在该行上方。
卡条形码
Android
|
|
|
Web
|
|
|
卡券条形码部分用于在条形码前后显示额外的文字或图片。此部分中的所有字段都不是必填项。
您可以使用三个字段选择器来定义条形码前面的两个并排字段和后面的一个字段。这些字段不显示标签,可以是基于文本的结构化数据字段、文本模块字段或图片模块字段。如果您使用图片,这些图片应遵循品牌推广指南。
条形码由类型和值定义。如需查看支持的条形码类型列表,请参阅参考。此外,还可以在条形码正下方显示文本。此文本可让您更轻松地扫描条形码,以及执行其他操作。
以下代码示例展示了如何替换卡券的条形码部分,以便在条形码上方显示图片:
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);
该代码会创建具有以下条形码部分格式的卡券:
如果您未替换条形码部分,系统将使用默认条形码字段。 如需了解详情,请参阅默认模板。
底部版块
Android
|
|
|
Web
|
|
|
底部部分是项列表 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
该代码会创建具有以下底部版块格式的卡券:
如果某项内容为空,则不会显示。如需了解详情,请参阅字段引用。
如果您不替换底部部分,系统会按默认顺序显示参考字段的默认列表。如需了解详情,请参阅默认模板。
列表模板
|
|
|
列表模板部分用于选择要在 Google 钱包应用的“卡券”视图中显示的字段。卡券在列表中以徽标、背景颜色和三行内容表示。
以下代码示例展示了如何替换卡券的列表模板,以便在列表模板的第一行中显示单个卡券对象的失效日期字段:
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
该代码会创建一个具有以下列表模板呈现形式的卡券:
这三行可以使用字段选择器进行定义。 这些字段在显示时没有标签。 对于分组卡券,第二行始终显示当地预定出发日期,第三行始终显示分组卡券的数量。
字段引用
字段引用在模板的不同部分中使用,格式为 class.classTemplateInfo.*.fields[]。字段引用包含指向结构化数据字段、文本模块字段、链接模块字段、图片模块字段或消息的路径列表。
并非所有类型的路径都允许在每个字段引用中使用。例如,某些字段引用仅允许指向基于文本的结构化数据字段或文本模块字段的路径。基于文本的结构化字段是字符串、本地化字符串、日期或货币类型的结构化数据字段。
该列表可用于实现回退逻辑。这意味着,如果列表中的第一个路径解析为空字段,则系统会评估下一个路径。后备逻辑主要针对基于文本的结构化数据字段或文本模块字段。请勿在同一列表中混用不同类型的字段。请谨慎使用回退逻辑,并且仅在特定情况下使用,即您预计某些对象中存在一致的字段模式,而其他对象中不存在。在大多数情况下,为不同的用例创建不同的类会更容易。
如果字段引用列表中的所有路径都解析为空字段,则不会显示使用该字段引用的项。如果您希望使用字段引用的项始终存在,请确保至少有一个路径不为空。我们建议您将字段设置为特殊字符(例如“-”)来表示 null 值,即使某些字段允许仅包含空格的字符串。
如需引用列表中包含的字段,您可以使用该字段在列表中的索引,或者在大多数情况下,您可以使用引用 ID。可通过 ID 引用的列表项具有 .id 字段。我们建议您使用引用 ID,而不是列表中字段的索引(如果可用)。
以下示例展示了如何引用列表中包含的字段。
object.imageModulesData[0].id = my-first-idobject.imageModulesData[1].id = my-second-idclass.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]
在这种情况下,卡券详细信息部分中的第一项是对象中声明的第二张图片。而卡券详细信息部分的第二项是对象中声明的第一张图片。
默认模板
Android
|
|
|
Web
|
|
|
默认情况下,如果卡片部分被替换,并且这些字段不再出现在卡片部分中,则底部部分还会显示 object.boardingAndSeatingInfo.boardingGroup、object.boardingAndSeatingInfo.seatClass 和 object.boardingAndSeatingInfo.seatNumber。
对于图片模块字段,我们会显示类中的一个且仅一个图片模块字段,以及对象中的一个且仅一个图片模块字段。如果您在任一级别需要多个图片模块字段,请替换默认模板。
对于文本模块字段,我们最多只能显示类中的 20 个文本模块字段和对象中的 20 个文本模块字段。这些字段的显示顺序与它们在数组中的定义顺序相同。如果您在任一级别需要 20 个以上的文本模块字段,请替换默认模板。
对于消息,我们最多只会显示来自类的 20 条消息和来自对象的 20 条消息。我们不保证消息的顺序。如果您在任一级别需要 20 条以上的消息,或者需要为任何订单提供保证,请替换默认模板。
对于链接模块字段,您可以定义的 URI 数量没有限制。URI 按以下顺序分组显示,每个级别(类或对象)对应一个分组:
- 地图坐标
- 电话号码
- 电子邮件地址
- 网页
对于每个组,URI 的显示顺序与其在数组中的定义顺序相同。 如果您需要不同的排序,请替换默认模板。
|
|
|