公交卡模板

公交卡支持模板渲染。如果未定义模板,系统将使用默认模板。

模板定义

卡券模板在类级别定义,用于显示与类相关联的任何对象。该模板可定义要在卡券的不同部分中显示的字段。

该模板分为以下部分:

Android

模板概览

网站

模板概览

卡片标题

Android

卡片标题元素 默认卡片标题
  1. class.logo
  2. class.localizedIssuerName
    class.issuerName
  3. object.ticketLeg.originName
  4. object.ticketLeg.destinationName
  5. object.ticketLeg.originStationCode
  6. object.ticketLeg.destinationStationCode
  7. object.tripType
  8. object.hexBackgroundColor
    class.hexBackgroundColor

宽徽标卡片标题
  1. class.wideLogo
  2. object.ticketLeg.originName
  3. object.ticketLeg.destinationName
  4. object.ticketLeg.originStationCode
  5. object.ticketLeg.destinationStationCode
  6. object.tripType
  7. object.hexBackgroundColor
    class.hexBackgroundColor

网站

卡片标题元素 默认卡片标题
  1. class.logo
  2. class.localizedIssuerName
    class.issuerName
  3. object.ticketLeg.originName
  4. object.ticketLeg.destinationName
  5. object.ticketLeg.originStationCode
  6. object.ticketLeg.destinationStationCode
  7. object.tripType
  8. object.hexBackgroundColor
    class.hexBackgroundColor

宽徽标卡片标题
  1. class.wideLogo
  2. object.ticketLeg.originName
  3. object.ticketLeg.destinationName
  4. object.ticketLeg.originStationCode
  5. object.ticketLeg.destinationStationCode
  6. object.tripType
  7. object.hexBackgroundColor
    class.hexBackgroundColor

卡片标题部分会显示公交运营商的徽标和名称以及旅程摘要。 所有这三个要素都是必需的,用于填充这些要素的字段引用以及这些要素的位置都不能更改。

不过,呈现逻辑允许顶行具有一定的灵活性。卡券的顶行(表示旅程摘要)由单路段旅程 TransitObject 中的以下字段控制:

  • object.tripType
  • object.ticketLeg.originName
  • object.ticketLeg.destinationName
  • object.ticketLeg.originStationCode
  • object.ticketLeg.destinationStationCode

卡券的渲染方式取决于哪些字段是非空的。它可以通过以下方式进行渲染:

  • 仅显示出发地名称:出发地名称是唯一显示的信息。这对于覆盖某个区域而非特定旅程的车票特别有用。
  • 出发地和目的地:出发地位于左侧,目的地位于右侧。两者之间的符号取决于行程类型。出发地和目的地会以下列其中一种方式显示:
    • 名称和站点代码:我们会在顶部用较小的文本显示站点代码和名称。
    • 仅显示名称:我们会显示名称。
    • 仅显示站点代码:我们会显示站点代码。

多路段 TransitObject 对象的工作方式非常相似。在这种情况下,不要使用 object.ticketLeg,必须改用 object.ticketLegs[] 列表。出发地和目的地都必须指定。在每个路段中使用的名称和/或站点代码必须保持一致。显示的出发地是数组中第一个元素的出发地,而显示的目的地是数组中最后一个元素的目的地。

卡券的背景颜色不是必填字段,可以在类级别和对象级别进行定义。对象字段具有更高的优先级,可用于替换类字段。

设置宽徽标字段后,在 Android 设备上,包含徽标和发卡机构名称的默认模板标头会替换为宽徽标。

创建宽标题徽标时,请遵循 宽徽标图片准则,以便以最佳方式在卡券上显示您的图片。

卡片模板

Android

模板概览

网站

模板概览

卡片模板部分用于显示额外的行。这些行可以包含文本型结构化数据字段或文本模块字段。

您可以在 class.classTemplateInfo.cardTemplateOverride.cardRowTemplateInfos[] 列表中指定用于定义对象数量的行数。该列表至少需要一个元素,我们建议最多使用两个元素。每个元素都必须是以下某种类型:

  • oneItem,接受一项:
    • item
  • twoItems,接受两项:
    • startItem
    • endItem
  • threeItems,接受三项:
    • startItem
    • middleItem
    • 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);
    

此代码会按照以下代码模板部分的格式创建卡券:

标签替换示例。

如果某项内容为空,则不会显示。如需了解详情,请参阅字段引用。如果某行中的所有项均为空,则不会显示该行。如果某行中部分(而非所有)项为空,系统会重新排列非空项并将其显示为项数较少的行。

如果您没有替换卡片模板,则使用默认行数、默认项数和默认字段引用。如需了解详情,请参阅默认模板

定义主打图片后,如果 cardRowTemplateInfos 列表中有多个行,主打图片可以显示在第一行之后或该行上方(如果只有一行)。

卡片条形码

Android

卡片条形码元素
  1. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .firstTopDetail
  2. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .secondTopDetail
  3. object.barcode.typeobject.barcode.value
    object.ticketNumber
  4. object.barcode.alternateText
  5. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .firstBottomDetail

网站

卡片条形码元素
  1. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .firstTopDetail
  2. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .secondTopDetail
  3. object.barcode.typeobject.barcode.value
    object.ticketNumber
  4. object.barcode.alternateText
  5. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .firstBottomDetail

卡片条形码部分用于在条形码上方和下方显示额外的文本或图片。此部分中的所有字段均非必填字段。

有三个字段选择器,可用于定义两个并排字段(在条形码上方)和另一个字段(下方字段)。这些字段不带标签,可以是文本型结构化数据字段、文本模块字段或图片模块字段。如果您使用图片,则应遵循品牌指南。

条形码由类型和值定义。要查看受支持的条形码类型的列表,请参阅引用。此外,文本可以显示在条形码的正下方。这种文本可用于更轻松地扫描条形码,此外还有许多其他用途。

以下代码示例展示了如何替换卡券的条形码部分,以在条形码上方显示图片:

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

详细信息模板部分
  • 多段行程
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[0].item
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[1].item
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[2].item
  • ...

网站

详细信息模板部分
  • 多段行程
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[0].item
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[1].item
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[2].item
  • ...

详细信息模板部分是多个项 (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
    

此代码会按照以下详细信息部分的格式创建卡券:

详细信息替换示例。

如果某项内容为空,则不会显示。如需了解详情,请参阅字段引用

如果您没有替换详细信息模板,则系统将按默认顺序显示默认引用字段列表。如需了解详情,请参阅默认模板

如果旅程包含多个路段,则会在该部分的顶部显示一个简单的行程,并且无法移动该行程。如果旅程仅包含一个路段,则可以通过设置 class.enableSingleLegItinerary 来显示简单的行程。

多路段行程
  1. class.tranistType
  2. object.ticketLegs[i].originName
    object.ticketLegs[i].originStationCode
  3. object.ticketLegs[i].departureDateTime(仅限时间)
  4. object.ticketLegs[i].transitOperatorName
  5. 教练或class.customCoachLabel
  6. object.ticketLegs[i].ticketSeat.coach
    object.ticketLegs[i].ticketSeats[*].coach
  7. SEAT 或class.customSeatLabel
  8. object.ticketLegs[i].ticketSeat.seat
    object.ticketLegs[i].ticketSeat.seatAssignment
    object.ticketLegs[i].ticketSeats[*].seat
    object.ticketLegs[i].ticketSeats[*].seatAssignment
    或无具体座位
  9. object.hexBackgroundColor
    class.hexBackgroundColor
  10. object.ticketLegs[i].destinationName
    object.ticketLegs[i].destinationStationCode
  11. object.ticketLegs[i].arrivalDateTime(仅限时间)
  12. 转移到:PLATFORM
    或转移到:class.customPlatformLabel
    或 TRANSFER(如果未指定平台)
  13. object.ticketLegs[i+1].platform

列表模板

列表模板元素
  1. class.classTemplateInfo.listTemplateOverride
      .firstRowOption.fieldOption.fields[]
  2. object.ticketLeg.departureDateTime(已分组)
    class.classTemplateInfo.listTemplateOverride
      .secondRowOption.fields[]
  3. class.logo
  4. object.hexBackgroundColor
    class.hexBackgroundColor
  5. <# 张卡券>(已分组)

列表模板部分用于选择要在 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
    

此代码会按照以下列表模板呈现方式创建卡券:

列表替换示例。

可以使用字段选择器定义第一行,或者第一行显示历程摘要。摘要可以采用以下格式之一:

  • originAndDestinationCodes
  • originAndDestinationNames
  • originName

只能使用字段选择器定义第二行和第三行。 显示的字段没有标签。 对于已分组的卡券,第二行始终会显示出发日期,第三行始终会显示已分组卡券的数量。

标签

所有结构化数据字段都有一个由 Google 提供的标签。Google 负责以所有支持的语言为每个标签提供译文。

您可以使用某个 class.custom<name_of_the_field>Label 字段自定义其中某些标签。当您自定义某个标签时,您将负责以您希望支持的所有语言为该特定标签提供译文。

字段引用

字段引用用于模板的不同部分,其格式为 class.classTemplateInfo.*.fields[]。字段引用包含结构化数据字段、文本模块字段、链接模块字段、图片模块字段或消息的路径列表。

并非每个字段引用中都允许使用所有类型的路径。例如,某些字段引用仅允许文本型结构化数据字段或文本模块字段的路径。文本型结构化字段是字符串、本地化字符串、日期或货币类型的结构化数据字段。

该列表可用于实现回退逻辑。这意味着,如果列表中的第一个路径解析为空字段,则系统会评估下一个路径。回退逻辑主要针对文本型结构化数据字段或文本模块字段。请勿在同一列表中混合使用不同类型的字段。使用回退逻辑时应谨慎,并且仅在您希望某些对象中存在一致的字段模式(而在其他对象中,不存在)的情况下使用。大多数情况下,为不同的用例创建单独的类更容易。

如果字段引用列表中的所有路径都解析为空字段,则系统不会显示使用该字段引用的项。如果您希望使用字段引用的项始终存在,请确保至少有一个路径不为空。我们建议您将某个字段设置为特殊字符(例如“-”)以表示 null 值,即使某些字段允许仅包含空格的字符串也是如此。

如需引用列表中包含的字段,您可以使用列表中字段的索引,或者在大多数情况下,您可以使用引用 ID。可通过 ID 引用的列表中的项都具有 .id 字段。我们建议您使用引用 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]

在本例中,卡券的详细信息部分中的第一项是在对象中声明的第二张图片。而卡券的详细信息部分中的第二项是在对象中声明的第一张图片。

默认模板

Android

默认模板元素
  1. class.logo
  2. class.localizedIssuerName
    class.issuerName
  3. 查看卡片标题
  4. 起飞日期或有效日期:发送者
  5. object.ticketLeg.departureDateTime(日期和时间)
    object.validTimeInterval.start.date
  6. 达到或失效
  7. object.ticketLeg.arrivalDateTime(仅限时间)
    object.validTimeInterval.end.date
  8. 乘客
  9. object.passengerNames
  10. CARRIAGE 或 class.customCarriageLabel
  11. object.ticketLeg.carriage
  12. 教练或class.customCoachLabel
  13. object.ticketLeg.ticketSeat.coach
  14. SEAT 或class.customSeatLabel
  15. object.ticketLeg.ticketSeat.seat
    object.ticketLeg.ticketSeat.seatAssignment
  16. object.barcode.typeobject.barcode.value
    object.ticketNumber
  17. object.barcode.alternateText
  18. object.hexBackgroundColor
    class.hexBackgroundColor
  19. 多段行程
  20. TICKET NUMBER 或 class.customTicketNumberLabel
  21. object.ticketNumber
  22. 票券状态
  23. object.ticketStatusobject.customTicketStatus
  24. 出发
  25. object.ticketLeg.departureDateTime
  26. 到达时间
  27. object.ticketLeg.arrivalDateTime
  28. FARE NAME 或 class.customFareNameLabel
  29. object.ticketLeg.fareName
  30. PLATFORM 或 class.customPlatformLabel
  31. object.ticketLeg.platform
  32. ZONE 或 class.customZoneLabel
  33. object.ticketLeg.zone
  34. 票价类型或class.customFareClassLabel
  35. object.ticketLeg.ticketSeat.fareClass
    object.ticketLeg.ticketSeat.customFareClass
  36. CONCESSION CATEGORY
    class.customConcessionCategoryLabel
  37. object.concessionCategory
    object.customConcessionCategory
  38. 路由限制
    class.customRouteRestrictionsLabel
  39. object.ticketRestrictions.routeRestrictions
  40. 路线限制详情
    class.customRouteRestrictionsDetailsLabel
  41. object.ticketRestrictions.routeRestrictionsDetails
  42. 时间限制
    class.customTimeRestrictionsLabel
  43. object.ticketRestrictions.timeRestrictions
  44. 其他限制
    class.customOtherRestrictionsLabel
  45. object.ticketRestrictions.otherRestrictions
  46. 收据编号
    class.customPurchaseReceiptNumberLabel
  47. object.purchaseDetails.purchaseReceiptNumber
  48. 购买日期
  49. object.purchaseDetails.purchaseDateTime
  50. 账号 ID
  51. object.purchaseDetails.accountId
  52. 确认码
    class.customConfirmationCodeLabel
  53. object.purchaseDetails.confirmationCode
  54. FACE VALUE 或 class.customPurchaseFaceValueLabel
  55. object.purchaseDetails.ticketCost.faceValue
  56. PRICE 或 class.customPurchasePriceLabel
  57. object.purchaseDetails.ticketCost.purchasePrice
  58. DISCOUNT MESSAGE
    class.customDiscountMessageLabel
  59. object.purchaseDetails.ticketCost.discountMessage
  60. class.imageModulesData[0].mainImage
  61. object.imageModulesData[0].mainImage
  62. class.messages[].header
  63. class.messages[].body
  64. object.messages[].header
  65. object.messages[].body
  66. class.textModulesData[0..9].header
  67. class.textModulesData[0..9].body
  68. object.textModulesData[0..9].header
  69. object.textModulesData[0..9].body
  70. class.linksModuleData.uris[].description
  71. object.linksModuleData.uris[].description

网站

默认模板元素
  1. class.logo
  2. class.localizedIssuerName
    class.issuerName
  3. 查看卡片标题
  4. 起飞日期或有效日期:发送者
  5. object.ticketLeg.departureDateTime(日期和时间)
    object.validTimeInterval.start.date
  6. 达到或失效
  7. object.ticketLeg.arrivalDateTime(仅限时间)
    object.validTimeInterval.end.date
  8. 乘客
  9. object.passengerNames
  10. CARRIAGE 或 class.customCarriageLabel
  11. object.ticketLeg.carriage
  12. 教练或class.customCoachLabel
  13. object.ticketLeg.ticketSeat.coach
  14. SEAT 或class.customSeatLabel
  15. object.ticketLeg.ticketSeat.seat
    object.ticketLeg.ticketSeat.seatAssignment
  16. object.barcode.typeobject.barcode.value
    object.ticketNumber
  17. object.barcode.alternateText
  18. object.hexBackgroundColor
    class.hexBackgroundColor
  19. 多段行程
  20. TICKET NUMBER 或 class.customTicketNumberLabel
  21. object.ticketNumber
  22. 票券状态
  23. object.ticketStatusobject.customTicketStatus
  24. 出发
  25. object.ticketLeg.departureDateTime
  26. 到达时间
  27. object.ticketLeg.arrivalDateTime
  28. FARE NAME 或 class.customFareNameLabel
  29. object.ticketLeg.fareName
  30. PLATFORM 或 class.customPlatformLabel
  31. object.ticketLeg.platform
  32. ZONE 或 class.customZoneLabel
  33. object.ticketLeg.zone
  34. 票价类型或class.customFareClassLabel
  35. object.ticketLeg.ticketSeat.fareClass
    object.ticketLeg.ticketSeat.customFareClass
  36. CONCESSION CATEGORY
    class.customConcessionCategoryLabel
  37. object.concessionCategory
    object.customConcessionCategory
  38. 路由限制
    class.customRouteRestrictionsLabel
  39. object.ticketRestrictions.routeRestrictions
  40. 路线限制详情
    class.customRouteRestrictionsDetailsLabel
  41. object.ticketRestrictions.routeRestrictionsDetails
  42. 时间限制
    class.customTimeRestrictionsLabel
  43. object.ticketRestrictions.timeRestrictions
  44. 其他限制
    class.customOtherRestrictionsLabel
  45. object.ticketRestrictions.otherRestrictions
  46. 收据编号
    class.customPurchaseReceiptNumberLabel
  47. object.purchaseDetails.purchaseReceiptNumber
  48. 购买日期
  49. object.purchaseDetails.purchaseDateTime
  50. 账号 ID
  51. object.purchaseDetails.accountId
  52. 确认码
    class.customConfirmationCodeLabel
  53. object.purchaseDetails.confirmationCode
  54. FACE VALUE 或 class.customPurchaseFaceValueLabel
  55. object.purchaseDetails.ticketCost.faceValue
  56. PRICE 或 class.customPurchasePriceLabel
  57. object.purchaseDetails.ticketCost.purchasePrice
  58. DISCOUNT MESSAGE
    class.customDiscountMessageLabel
  59. object.purchaseDetails.ticketCost.discountMessage
  60. class.imageModulesData[0].mainImage
  61. object.imageModulesData[0].mainImage
  62. class.messages[].header
  63. class.messages[].body
  64. object.messages[].header
  65. object.messages[].body
  66. class.textModulesData[0..9].header
  67. class.textModulesData[0..9].body
  68. object.textModulesData[0..9].header
  69. object.textModulesData[0..9].body
  70. class.linksModuleData.uris[].description
  71. object.linksModuleData.uris[].description

对于图片模块字段,我们在类和对象中仅会显示一个图片模块字段。如果您在任一级别需要多个图片模块字段,请替换默认模板。

对于文本模块字段,我们在类和对象中最多只能显示 20 个文本模块字段。这些字段的显示顺序与在数组中定义它们的顺序相同。如果您在任一级别需要 20 个以上文本模块字段,请替换默认模板。

对于消息,我们最多只能显示来自类和对象的 20 条消息。我们不保证消息的顺序。如果您在任一级别需要 20 条以上的消息,或者需要为任何订单提供保证,请替换默认模板。

对于链接模块字段,您可以定义的 URI 数量没有限制。对于每个级别(类或对象),URI 按以下顺序进行显示和分组:

  1. 地图坐标
  2. 电话号码
  3. 电子邮件地址
  4. 网页

对于每个群组,URI 的显示顺序与在数组中定义它们的顺序相同。 如果您需要不同的顺序,请替换默认模板。

默认列表模板元素
  1. object.ticketLeg.originName
    object.ticketLeg.destinationName
    或(object.ticketLeg.originStationCode
    object.ticketLeg.destinationStationCode
    object.ticketLeg.originName
  2. object.ticketLeg.departureDateTime
    object.validTimeInterval.end.date
  3. class.logo
  4. object.hexBackgroundColor
    class.hexBackgroundColor
  5. <# 张卡券>(已分组)