禮物卡支援範本顯示功能。如未定義任何範本,系統會使用預設範本。
範本定義
票證範本是在類別層級定義,用來顯示與該類別相關聯的任何物件。範本會定義要在票證的不同區段中顯示哪些欄位,
範本分為以下幾個部分:
Android
網站
資訊卡標題
Android
預設資訊卡標題
寬標誌資訊卡標題
|
網站
預設資訊卡標題
寬標誌資訊卡標題
|
卡片標題區段會顯示商家的標誌、名稱和餘額。填入這些元素時參照的欄位以及這些元素的位置都無法變更。
設定寬標誌欄位後,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
|
網站
|
卡片條碼區段是用來在條碼上方和下方顯示額外的文字或圖片。這個專區所有欄位均為必填。
我們總共提供三個欄位選取器,可用來定義兩個位於條碼上方的並排欄位,以及一個位於條碼下方的欄位。這些欄位不會顯示標籤,可以是結構化文字資料欄位、文字模組欄位或圖片模組欄位。如要使用圖片,請務必遵守品牌規範。
條碼是由類型和值定義。如需支援的條碼類型清單,請參閱「參考資料」。此外,文字可直接顯示在條碼下方。方便您掃描條碼和其他用途。
下列程式碼範例說明如何覆寫票證的條碼區段,以在條碼上方顯示圖片:
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[]
項目的清單。項目可包含任何種類的結構化資料欄位、文字模組欄位、連結模組欄位、圖片模組欄位或訊息。
每個項目都可以定義為單一欄位選取器 (.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
程式碼會建立票證,並在其中包含採用以下的清單範本:
您可以使用欄位選取器定義這三個列。這些欄位都不會顯示任何標籤。
標籤
所有結構化資料欄位都有 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
|
網站
|
以圖片模組欄位而言,系統只會顯示該類別中的一個圖片模組欄位,以及該物件中的一個圖片模組欄位。如果您在任一層級需要多個圖片模組欄位,請覆寫預設範本。
以文字模組欄位而言,系統最多只會顯示類別中的 20 個文字模組欄位,以及物件中的 20 個文字模組欄位。系統會按照欄位在陣列中的定義順序顯示這些欄位。如果您在任一層級需要超過 20 個文字模組欄位,請覆寫預設範本。
對於訊息,我們最多只會顯示類別中的 20 則訊息,以及物件中的 20 則訊息。我們無法保證這些郵件的顯示順序。如果您在任一層級需要超過 20 則訊息,或是要保證所有訂單,請覆寫預設範本。
在連結模組欄位中,可定義的 URI 數量沒有限制。系統在顯示各層級 (類別或物件) 的 URI 時,會依下列順序分組:
- 地圖座標
- 電話號碼
- 電子郵件地址
- 網頁
每個群組 URI 的顯示順序與在陣列中的定義相同。如要調整順序,請覆寫預設範本。
|