大眾運輸票證範本

大眾運輸票證支援範本顯示功能。如果您未定義任何範本,系統會使用預設範本。

範本定義

您必須在類別層級定義票證範本,以便用來顯示所有與該類別相關聯的物件。範本會定義要在票證的不同區段中顯示哪些欄位。

範本可分為下列區段:

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.type 和 object.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.type 和 object.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. COACH 或 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
    或 NO SPECIFIC SEAT
  9. object.hexBackgroundColor
    或 class.hexBackgroundColor
  10. object.ticketLegs[i].destinationName
    或 object.ticketLegs[i].destinationStationCode
  11. object.ticketLegs[i].arrivalDateTime (僅限時間)
  12. 轉移至「
    」平台 或轉移至「class.customPlatformLabel
    」 或轉移 (如未定義平台)
  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. <# passes> (grouped)

清單範本區段是用來選取要在 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[]。欄位參照包含結構化資料欄位、文字模組欄位、連結模組欄位、圖片模組欄位或訊息的路徑清單。

並非所有欄位參照都允許使用所有類型的路徑。例如,某些欄位參照只允許結構化資料欄位或文字模組欄位的路徑。結構化文字欄位是指類型字串、本地化字串、日期或金錢的結構化資料欄位。

您可以使用該清單實作備用邏輯。也就是說,如果清單中的第一個路徑解析為空白欄位,系統就會評估下一個路徑。備用邏輯主要用於結構化文字資料欄位或文字模組欄位。請勿在同一份清單中混合使用不同類型的欄位。另外,使用備用邏輯時請多加小心,並僅在特定情況下使用 (特定物件中的欄位模式一致,其他欄位則否)。一般來說,針對個別用途建立不同的類別較為簡單。

如果欄位參照清單中的所有路徑皆解析為空白欄位,使用該欄位參考資料的項目就不會顯示。如果您希望系統持續顯示使用該欄位參考資料的項目,請確定至少一個路徑並非空白欄位。建議您將某個欄位設為代表空值的特殊字元 (例如「-」),即使某些欄位允許使用僅有一個空格的字串也是如此。

如要參照清單中的欄位,您可以使用清單中的欄位索引,而在大多數情況下,您也可以使用參照 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. PASSENGER
  9. object.passengerNames
  10. CARRIAGE 或 class.customCarriageLabel
  11. object.ticketLeg.carriage
  12. COACH 或 class.customCoachLabel
  13. object.ticketLeg.ticketSeat.coach
  14. SEAT 或 class.customSeatLabel
  15. object.ticketLeg.ticketSeat.seat
    或 object.ticketLeg.ticketSeat.seatAssignment
  16. object.barcode.type 和 object.barcode.value
    或 object.ticketNumber
  17. object.barcode.alternateText
  18. object.hexBackgroundColor
    或 class.hexBackgroundColor
  19. 多段車程的行程
  20. 票券號碼或 class.customTicketNumberLabel
  21. object.ticketNumber
  22. 票券狀態
  23. object.ticketStatus 或 object.customTicketStatus
  24. DEPARTURE
  25. object.ticketLeg.departureDateTime
  26. 抵達時間
  27. object.ticketLeg.arrivalDateTime
  28. 票價名稱或 class.customFareNameLabel
  29. object.ticketLeg.fareName
  30. 平台或 class.customPlatformLabel
  31. object.ticketLeg.platform
  32. ZONE 或 class.customZoneLabel
  33. object.ticketLeg.zone
  34. FARE CLASS 或 class.customFareClassLabel
  35. object.ticketLeg.ticketSeat.fareClass
    或 object.ticketLeg.ticketSeat.customFareClass
  36. 優惠類別
    或 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. 面額或 class.customPurchaseFaceValueLabel
  55. object.purchaseDetails.ticketCost.faceValue
  56. 價格或 class.customPurchasePriceLabel
  57. object.purchaseDetails.ticketCost.purchasePrice
  58. 折扣訊息
    或 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. PASSENGER
  9. object.passengerNames
  10. CARRIAGE 或 class.customCarriageLabel
  11. object.ticketLeg.carriage
  12. COACH 或 class.customCoachLabel
  13. object.ticketLeg.ticketSeat.coach
  14. SEAT 或 class.customSeatLabel
  15. object.ticketLeg.ticketSeat.seat
    或 object.ticketLeg.ticketSeat.seatAssignment
  16. object.barcode.type 和 object.barcode.value
    或 object.ticketNumber
  17. object.barcode.alternateText
  18. object.hexBackgroundColor
    或 class.hexBackgroundColor
  19. 多段車程的行程
  20. 票券號碼或 class.customTicketNumberLabel
  21. object.ticketNumber
  22. 票券狀態
  23. object.ticketStatus 或 object.customTicketStatus
  24. DEPARTURE
  25. object.ticketLeg.departureDateTime
  26. 抵達時間
  27. object.ticketLeg.arrivalDateTime
  28. 票價名稱或 class.customFareNameLabel
  29. object.ticketLeg.fareName
  30. 平台或 class.customPlatformLabel
  31. object.ticketLeg.platform
  32. ZONE 或 class.customZoneLabel
  33. object.ticketLeg.zone
  34. FARE CLASS 或 class.customFareClassLabel
  35. object.ticketLeg.ticketSeat.fareClass
    或 object.ticketLeg.ticketSeat.customFareClass
  36. 優惠類別
    或 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. 面額或 class.customPurchaseFaceValueLabel
  55. object.purchaseDetails.ticketCost.faceValue
  56. 價格或 class.customPurchasePriceLabel
  57. object.purchaseDetails.ticketCost.purchasePrice
  58. 折扣訊息
    或 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 則訊息,以及該物件中的 20 則訊息。不過,我們無法保證訊息的顯示順序。如果您在任一層級需要超過 20 則訊息,或是必須確定訊息的顯示順序,請覆寫預設範本。

以連結模組欄位而言,您可以定義數量不限的 URI。系統在顯示各個層級 (類別或物件) 的 URI 時,會依據下列順序進行分組:

  1. 地圖座標
  2. 電話號碼
  3. 電子郵件地址
  4. 網頁

系統會按照 URI 在陣列中的定義順序顯示各個群組的 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. <# passes> (grouped)