Szablon karty pokładowej

Karty pokładowe obsługują renderowanie szablonów. Jeśli nie zdefiniowano żadnego szablonu, używany jest szablon domyślny.

Definicja szablonu

Szablon karty jest zdefiniowany na poziomie klasy i służy do wyświetlania wszelkich powiązanych z nią obiektów. Szablon określa pola, które mają wyświetlać się w poszczególnych sekcjach karty.

Szablon dzieli się na te sekcje:

Android

Omówienie szablonu

Internet

Omówienie szablonu

Tytuł karty

Android

Elementy tytułu karty Domyślny tytuł karty
  1. class.flightHeader.carrier.airlineLogo
  2. class.flightHeader.carrier.airlineName
    , class.localizedIssuerName
    lub class.issuerName
  3. (class.flightHeader.carrier.carrierIataCode
    lub class.flightHeader.carrier.carrierIcaoCode)
    i class.flightHeader.flightNumber
  4. miasto lotniska (pochodzące z class.origin.airportIataCode)
    lub class.origin.airportNameOverride
  5. class.origin.airportIataCode
  6. miasto lotniska (pochodzące z class.destination.airportIataCode)
    lub class.destination.airportNameOverride
  7. class.destination.airportIataCode
  8. object.hexBackgroundColor
    lub class.hexBackgroundColor

Tytuł karty z szerokim logo
  1. class.flightHeader.wideAirlineLogo
  2. (class.flightHeader.carrier.carrierIataCode
    lub class.flightHeader.carrier.carrierIcaoCode)
    i class.flightHeader.flightNumber
  3. miasto lotniska (pochodzące z class.origin.airportIataCode)
    lub class.origin.airportNameOverride
  4. class.origin.airportIataCode
  5. miasto lotniska (pochodzące z class.destination.airportIataCode)
    lub class.destination.airportNameOverride
  6. class.destination.airportIataCode
  7. object.hexBackgroundColor
    lub class.hexBackgroundColor

Internet

Elementy tytułu karty
  1. class.flightHeader.carrier.airlineLogo
  2. class.flightHeader.carrier.airlineName
    , class.localizedIssuerName
    lub class.issuerName
  3. (class.flightHeader.carrier.carrierIataCode
    lub class.flightHeader.carrier.carrierIcaoCode)
    i class.flightHeader.flightNumber
  4. miasto lotniska (pochodzące z class.origin.airportIataCode)
    lub class.origin.airportNameOverride
  5. class.origin.airportIataCode
  6. miasto lotniska (pochodzące z class.destination.airportIataCode)
    lub class.destination.airportNameOverride
  7. class.destination.airportIataCode
  8. object.hexBackgroundColor
    lub class.hexBackgroundColor

Sekcja tytułu karty służy do wyświetlania logo, nazwy linii lotniczej i podsumowania lotu. Każdy z tych elementów jest wymagany. Nie można zmieniać odwołań do pól, które je wypełniają, ani ich pozycji.

Jeśli nie ustawisz class.origin.airportNameOverride lub class.detination.airportNameOverride, nazwa miasta lotniska jest wypełniona automatycznie nazwą miasta powiązanego z kodem IATA w polu class.origin.airportIataCode i class.destination.airportIataCode.

Po ustawieniu szerokiego pola logo na urządzeniach z Androidem domyślny nagłówek szablonu z logo i nazwą wydawcy jest zastępowany szerokim logo.

Tworząc szerokie logo w nagłówku, postępuj zgodnie z wytycznymi dotyczącymi obrazu szerokiego logo, aby optymalnie wyświetlać obraz w dokumentach.

Szablon karty

Android

Omówienie szablonu

Internet

Omówienie szablonu

Sekcja szablonu karty służy do wyświetlania dodatkowych wierszy. Te wiersze mogą zawierać pola tekstowe uporządkowanych danych lub pola modułu tekstowego.

Możesz podać liczbę wierszy, która określa liczbę obiektów na liście class.classTemplateInfo.cardTemplateOverride.cardRowTemplateInfos[]. Lista wymaga co najmniej 1 elementu. Zalecamy użycie maksymalnie 2 elementów. Dozwolone są te typy elementów:

  • oneItem, który akceptuje 1 element:
    • item
  • twoItems, który akceptuje 2 elementy:
    • startItem
    • endItem
  • threeItems, który akceptuje 3 elementy:
    • startItem
    • middleItem
    • endItem

Każdy element można określić jako selektor pojedynczego pola (.firstValue), selektory dwóch pól (.firstValue i .secondValue) lub zdefiniowany wstępnie element (.predefinedItem). Wyświetlają się wartości wybranego pola i ich etykiety. Jeśli określisz selektory 2 pól, wartości wybranych pól będą wyświetlane z separatorem „/”. To samo dotyczy etykiet wybranych pól. Wstępnie zdefiniowane elementy służą do definiowania bardziej złożonego renderowania.

Poniższy przykładowy kod pokazuje, jak zastąpić sekcje wierszy karty szablonu karty, aby określić 2 wiersze. Każdy wiersz zawiera 3 elementy, z których każdy odwołuje się do 6 pól niestandardowych textModuleData na poziomie klasy, a ich nagłówki jako etykiety:

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);
    

Kod tworzy kartę w następującym formacie sekcji szablonu kodu:

Przykład zastąpienia etykiety.

Puste elementy nie są wyświetlane. Więcej informacji znajdziesz w opisie odwołań do pól. Jeśli wszystkie elementy wiersza są puste, wiersz się nie wyświetli. Jeśli puste są tylko niektóre elementy wiersza, elementy z zawartością zostaną odpowiednio rozmieszczone i wyświetlą się jako wiersz z mniejszą liczbą elementów.

Jeśli nie zastąpisz szablonu karty, zostaną użyte: domyślna liczba wierszy i elementów oraz domyślne odwołania do pól. Więcej informacji znajdziesz w opisie domyślnego szablonu.

Gdy zdefiniujesz baner powitalny, może on pojawić się po pierwszym wierszu, jeśli na liście cardRowTemplateInfos jest wiele wierszy, lub nad nim (jeśli jest tylko jeden).

Kod kreskowy karty

Android

Elementy kodu kreskowego karty
  1. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .firstTopDetail
  2. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .secondTopDetail
  3. object.barcode.type i object.barcode.value
    lub object.reservationInfo.confirmationCode
  4. object.barcode.alternateText
  5. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .firstBottomDetail

Internet

Elementy kodu kreskowego karty
  1. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .firstTopDetail
  2. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .secondTopDetail
  3. object.barcode.type i object.barcode.value
    lub object.reservationInfo.confirmationCode
  4. object.barcode.alternateText
  5. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .firstBottomDetail

Sekcja kodu kreskowego karty służy do wyświetlania dodatkowego tekstu lub obrazów nad i pod kodem kreskowym. Żadne z pól w tej sekcji nie jest wymagane.

Dostępne są selektory 3 pól, które pozwalają zdefiniować 2 pola obok siebie nad kodem kreskowym i jedno pole pod nim. Wyświetlają się one bez etykiet i mogą być polami tekstowymi uporządkowanych danych, polami modułu tekstowego lub polami modułu obrazów. Jeśli używasz obrazów, powinny być one zgodne ze wskazówkami dotyczącymi marki.

Kod kreskowy jest określany przez typ i wartość. Listę obsługiwanych typów kodów kreskowych znajdziesz w dokumentacji. Można też wyświetlić tekst zaraz pod kodem kreskowym. Tekst ten ułatwia m.in. skanowanie kodów kreskowych.

Poniższy przykładowy kod pokazuje, jak zastąpić sekcję kodu kreskowego na karcie, aby wyświetlić obraz nad kodem kreskowym:

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);
    

Kod tworzy kartę w następującym formacie sekcji kodu kreskowego:

Przykład zastąpienia kodu kreskowego karty.

Jeśli nie zastąpisz sekcji kodu kreskowego, zostaną użyte domyślne pola kodu kreskowego. Więcej informacji znajdziesz w sekcji Domyślny szablon.

Szablon szczegółów

Android

Sekcje szablonu szczegółów
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[0].item
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[1].item
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[2].item
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[3].item
  • ...

Internet

Sekcje szablonu szczegółów
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[0].item
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[1].item
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[2].item
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[3].item
  • ...

Sekcja szablonu szczegółów to lista elementów class.classTemplateInfo.detailsTemplateOverride.detailsItemInfos[]. Elementy mogą zawierać dowolne pola uporządkowanych danych, pola modułu tekstowego, pola modułu linków, pola modułu obrazów lub wiadomości.

Każdy element można określić jako selektor jednego pola (.firstValue), selektory dwóch pól (.firstValue i .secondValue) lub zdefiniowany wstępnie element (.predefinedItem). Wyświetlają się wartości wybranego pola i ich etykiety. Jeśli określisz selektory 2 pól, wartości wybranych pól będą wyświetlane z separatorem „/”. To samo dotyczy etykiet wybranych pól. Wstępnie zdefiniowane elementy służą do definiowania bardziej złożonego renderowania. Pola modułu obrazów renderują się w pełnej szerokości bez etykiety.

Poniższy przykładowy kod pokazuje, jak zastąpić sekcję szczegółów karty, aby wyświetlić pojedyncze pole linksModuleData z etykietą:

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
    

Kod tworzy kartę w następującym formacie sekcji szczegółów:

Przykład zastąpienia szczegółów.

Puste elementy nie są wyświetlane. Więcej informacji znajdziesz w opisie odwołań do pól.

Jeśli nie zastąpisz szablonu szczegółów, wyświetli się domyślna lista pól, do których należy się odwołać w kolejności domyślnej. Więcej informacji znajdziesz w opisie domyślnego szablonu.

Szablon listy

Lista elementów szablonu
  1. class.classTemplateInfo.listTemplateOverride
      .firstRowOption.fieldOption.fields[]
  2. class.localScheduledDepartureDateTime
    (tylko data) (pogrupowane)
    lub class.classTemplateInfo.listTemplateOverride
      .secondRowOption.fields[]
  3. class.flightHeader.carrier.airlineLogo
  4. object.hexBackgroundColor
    lub class.hexBackgroundColor
  5. <# kart> (pogrupowanych)

Sekcja szablonu listy pozwala wybrać pole, które wyświetla się w widoku kart w aplikacji Portfel Google. Karta wyświetla się na liście razem z logo, kolorem tła i 3 wierszami.

Poniższy przykładowy kod pokazuje, jak zastąpić szablon listy karty, aby wyświetlić pole daty ważności obiektu pojedynczej karty w pierwszym wierszu szablonu listy:

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
    

Kod tworzy kartę z następującym odwzorowaniem szablonu listy:

Przykład zastąpienia listy.

Te 3 wiersze można określić za pomocą selektora pól. Pola wyświetlają się bez etykiet. W zgrupowanych kartach pokładowych drugi wiersz zawsze zawiera datę wylotu, a trzeci wiersz zawsze zawiera liczbę zgrupowanych kart.

Odwołania do pól

Odwołania do pól są używane w różnych częściach szablonu w formie class.classTemplateInfo.*.fields[]. Odwołanie do pola zawiera listę ścieżek do pól uporządkowanych danych, pól modułu tekstowego, pól modułu linków, pól modułu obrazów lub wiadomości.

Nie wszystkie typy ścieżek są dozwolone w każdym odwołaniu do pól. Na przykład niektóre odwołania obsługują tylko ścieżki do pól tekstowych uporządkowanych danych lub pól modułu tekstowego. Pola tekstowe uporządkowanych danych to pola uporządkowanych danych typu ciąg znaków, zlokalizowany ciąg znaków, data lub kwota.

Lista może posłużyć do zaimplementowania logiki zastępczej. Oznacza to, że jeśli pierwsza ścieżka na liście prowadzi do pustego pola, sprawdzana jest następna ścieżka. Logika awaryjna dotyczy głównie pól tekstowych uporządkowanych danych i pól modułu tekstowego. Nie używaj różnych typów pól na jednej liście. Logiki awaryjnej należy używać rozważnie i tylko w określonych sytuacjach, gdy oczekujesz spójnego wzorca pól, które istnieją w niektórych obiektach, a w innych nie. W większości przypadków łatwiej jest utworzyć osobne klasy dla poszczególnych przypadków użycia.

Jeśli wszystkie ścieżki na liście odwołań do pól prowadzą do pustych pól, element używający odwołania nie wyświetli się. Jeśli chcesz, aby element, który korzysta z odwołania do pola, był zawsze obecny, upewnij się, że co najmniej 1 ścieżka nie jest pusta. Zalecamy ustawienie w polu znaku specjalnego, np. „-”, który będzie reprezentował wartość null nawet wtedy, gdy niektóre pola obsługują ciągi z samą spacją.

Aby odwołać się do pola na liście, możesz użyć indeksu pola na liście lub, w większości przypadków, identyfikatora odwołania. Elementy listy, do których można się odwołać za pomocą identyfikatora, zawierają pole .id. Zalecamy, by używać identyfikatora odwołania, a nie indeksu pola na liście, jeśli jest dostępne.

Oto przykład odwoływania się do pól na liście.

  • 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]

W tym przypadku pierwszy element w sekcji szczegółów karty jest drugim obrazem zadeklarowanym w obiekcie. Natomiast drugi element w sekcji szczegółów karty jest pierwszym obrazem zadeklarowanym w obiekcie.

Domyślny szablon

Android

Domyślne elementy szablonu
  1. class.flightHeader.carrier.airlineLogo
  2. class.flightHeader.carrier.airlineName
    , class.localizedIssuerName
    lub class.issuerName
  3. (class.flightHeader.carrier.carrierIataCode
    lub class.flightHeader.carrier.carrierIcaoCode)
    i class.flightHeader.flightNumber
  4. miasto lotniska (pochodzące z adresu class.origin.airportIataCode)
    lub class.origin.airportNameOverride
  5. class.origin.airportIataCode
  6. miasto lotniska (pochodzące z adresu class.destination.airportIataCode)
    lub class.destination.airportNameOverride
  7. class.destination.airportIataCode
  8. TERMINAL
  9. class.origin.terminal
  10. Przygotowanie do egzaminów GATE
  11. class.origin.gate
  12. CABIN (domyślny), CLASS lub TIER (zależnie od:
    class.boardingAndSeatingPolicy.SeatClassPolicy)
  13. object.boardingAndSeatingInfo.SeatClass
  14. WSIADANIE
    lub ZAMKNIĘCIE GATE
    lub WYJAZD
  15. class.localBoardingDateTime
    , class.localGateClosingDateTime
    , class.localEstimatedOrActualDepartureDateTime
    lub class.localScheduledDepartureDateTime
  16. PASSENGER
  17. object.passengerName
  18. ZONE (domyślna) lub GROUP (zależnie od:
    class.boardingAndSeatingPolicy.boardingPolicy)
  19. object.boardingAndSeatingInfo.boardingGroup
  20. SEAT
  21. object.boardingAndSeatingInfo.seatNumber
    lub object.boardingAndSeatingInfo.seatAssignment
  22. object.securityProgramLogo
  23. object.boardingAndSeatingInfo.boardingPrivilegeImage
  24. object.barcode.type i object.barcode.value
    lub object.reservationInfo.confirmationCode
  25. object.barcode.alternateText
  26. class.flightHeader.carrier.airlineAllianceLogo
  27. object.hexBackgroundColor
    lub class.hexBackgroundColor
  28. POZYCJA
  29. object.boardingAndSeatingInfo.boardingPosition
  30. SEKWENCJA
  31. object.boardingAndSeatingInfo.sequenceNumber
  32. DŹWIĘKI POTOKALNE
  33. object.boardingAndSeatingInfo.boardingDoor
  34. LOT
  35. (class.flightHeader.operatingCarrier.carrierIataCode
    lub class.flightHeader.operatingCarrier.carrierIcaoCode)
    i class.flightHeader.operatingFlightNumber
    i class.flightHeader.operatingCarrier.airlineName
  36. NUMER POTWIERDZENIA
  37. object.reservationInfo.confirmationCode
  38. NUMER BILETU
  39. object.reservationInfo.eticketNumber
  40. NUMER CZĘSTOTLIWEGO LOKALIZACJI
  41. object.reservationInfo
      .frequentFlyerInfo.frequentFlyerNumber
    i object.reservationInfo
      .frequentFlyerInfo.frequentFlyerProgramName
  42. ZAMKNIĘCIA GATE
  43. class.localGateClosingDateTime
  44. ZAPLANOWANY ODJAZD
  45. class.localScheduledDepartureDateTime
  46. SZACOWANY CZAS ODJAZDU
  47. class.localEstimatedOrActualDepartureDateTime
  48. ZAPLANOWANA GODZINA PRZYJAZDU
  49. class.localScheduledArrivalDateTime
  50. SZACOWANA GODZINA PRZYJAZDU
  51. class.localEstimatedOrActualArrivalDateTime
  52. TERMINAL PRZYJAZDU
  53. class.destination.terminal
  54. PRZYJAŚĆ GATE
  55. class.destination.gate
  56. class.imageModulesData[0].mainImage
  57. object.imageModulesData[0].mainImage
  58. class.messages[].header
  59. class.messages[].body
  60. object.messages[].header
  61. object.messages[].body
  62. class.textModulesData[0..9].header
  63. class.textModulesData[0..9].body
  64. object.textModulesData[0..9].header
  65. object.textModulesData[0..9].body
  66. class.linksModuleData.uris[].description
  67. object.linksModuleData.uris[].description

Internet

Domyślne elementy szablonu
  1. class.flightHeader.carrier.airlineLogo
  2. class.flightHeader.carrier.airlineName
    , class.localizedIssuerName
    lub class.issuerName
  3. (class.flightHeader.carrier.carrierIataCode
    lub class.flightHeader.carrier.carrierIcaoCode)
    i class.flightHeader.flightNumber
  4. miasto lotniska (pochodzące z adresu class.origin.airportIataCode)
    lub class.origin.airportNameOverride
  5. class.origin.airportIataCode
  6. miasto lotniska (pochodzące z adresu class.destination.airportIataCode)
    lub class.destination.airportNameOverride
  7. class.destination.airportIataCode
  8. TERMINAL
  9. class.origin.terminal
  10. Przygotowanie do egzaminów GATE
  11. class.origin.gate
  12. CABIN (domyślny), CLASS lub TIER (zależnie od:
    class.boardingAndSeatingPolicy.SeatClassPolicy)
  13. object.boardingAndSeatingInfo.SeatClass
  14. WSIADANIE
    lub ZAMKNIĘCIE GATE
    lub WYJAZD
  15. class.localBoardingDateTime
    , class.localGateClosingDateTime
    , class.localEstimatedOrActualDepartureDateTime
    lub class.localScheduledDepartureDateTime
  16. PASSENGER
  17. object.passengerName
  18. ZONE (domyślna) lub GROUP (zależnie od:
    class.boardingAndSeatingPolicy.boardingPolicy)
  19. object.boardingAndSeatingInfo.boardingGroup
  20. SEAT
  21. object.boardingAndSeatingInfo.seatNumber
    lub object.boardingAndSeatingInfo.seatAssignment
  22. object.securityProgramLogo
  23. object.boardingAndSeatingInfo.boardingPrivilegeImage
  24. object.barcode.type i object.barcode.value
    lub object.reservationInfo.confirmationCode
  25. object.barcode.alternateText
  26. class.flightHeader.carrier.airlineAllianceLogo
  27. object.hexBackgroundColor
    lub class.hexBackgroundColor
  28. POZYCJA
  29. object.boardingAndSeatingInfo.boardingPosition
  30. SEKWENCJA
  31. object.boardingAndSeatingInfo.sequenceNumber
  32. DŹWIĘKI POTOKALNE
  33. object.boardingAndSeatingInfo.boardingDoor
  34. LOT
  35. (class.flightHeader.operatingCarrier.carrierIataCode
    lub class.flightHeader.operatingCarrier.carrierIcaoCode)
    i class.flightHeader.operatingFlightNumber
    i class.flightHeader.operatingCarrier.airlineName
  36. NUMER POTWIERDZENIA
  37. object.reservationInfo.confirmationCode
  38. NUMER BILETU
  39. object.reservationInfo.eticketNumber
  40. NUMER CZĘSTOTLIWEGO LOKALIZACJI
  41. object.reservationInfo
      .frequentFlyerInfo.frequentFlyerNumber
    i object.reservationInfo
      .frequentFlyerInfo.frequentFlyerProgramName
  42. ZAMKNIĘCIA GATE
  43. class.localGateClosingDateTime
  44. ZAPLANOWANY ODJAZD
  45. class.localScheduledDepartureDateTime
  46. SZACOWANY CZAS ODJAZDU
  47. class.localEstimatedOrActualDepartureDateTime
  48. ZAPLANOWANA GODZINA PRZYJAZDU
  49. class.localScheduledArrivalDateTime
  50. SZACOWANA GODZINA PRZYJAZDU
  51. class.localEstimatedOrActualArrivalDateTime
  52. TERMINAL PRZYJAZDU
  53. class.destination.terminal
  54. PRZYJAŚĆ GATE
  55. class.destination.gate
  56. class.imageModulesData[0].mainImage
  57. object.imageModulesData[0].mainImage
  58. class.messages[].header
  59. class.messages[].body
  60. object.messages[].header
  61. object.messages[].body
  62. class.textModulesData[0..9].header
  63. class.textModulesData[0..9].body
  64. object.textModulesData[0..9].header
  65. object.textModulesData[0..9].body
  66. class.linksModuleData.uris[].description
  67. object.linksModuleData.uris[].description

Domyślnie sekcja szczegółów zawiera też object.boardingAndSeatingInfo.boardingGroup, object.boardingAndSeatingInfo.seatClass i object.boardingAndSeatingInfo.seatNumber, jeśli sekcja karty została zastąpiona i te pola już się w niej nie wyświetlają.

Maksymalnie może wyświetlać się tylko jedno pole modułu obrazów z klasy i tylko jedno pole modułu obrazów z obiektu. Jeśli potrzebujesz więcej niż jednego pola modułu obrazów na dowolnym poziomie, zastąp domyślny szablon.

Maksymalnie może wyświetlać się 20 pól modułu tekstowego z klasy i 20 pól modułu tekstowego z obiektu. Pola wyświetlają się w kolejności, w której są zdefiniowane w tablicy. Jeśli potrzebujesz więcej niż 20 pól modułu tekstowego na dowolnym poziomie, zastąp domyślny szablon.

Maksymalnie może wyświetlać się 20 wiadomości z klasy i 20 wiadomości z obiektu. Nie możemy zagwarantować kolejności wiadomości. Jeśli potrzebujesz więcej niż 20 wiadomości na dowolnym poziomie lub gwarancji dla dowolnych zamówień, zastąp domyślny szablon.

W polu modułu linków nie ma limitu identyfikatorów URI, które możesz zdefiniować. Identyfikatory URI są zgrupowane w tej kolejności na poszczególnych poziomach (klasa lub obiekt):

  1. Współrzędne na mapie
  2. numery telefonów;
  3. Adresy e-mail
  4. strony internetowe.

W przypadku każdej grupy identyfikatory URI są wyświetlane w kolejności, w której są zdefiniowane w tablicy. Jeśli chcesz ustawić inną kolejność, zastąp domyślny szablon.

Domyślne elementy szablonu listy
  1. class.origin.airportIataCode
    i class.destination.airportIataCode
  2. class.localScheduledDepartureDateTime
    (tylko data)
  3. class.flightHeader.carrier.airlineLogo
  4. object.hexBackgroundColor
    lub class.hexBackgroundColor
  5. <# kart> (pogrupowanych)