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 definiowany na poziomie klasy i służy do wyświetlania dowolnego obiektu powiązanego z klasą. Szablon określa, które pola mają być wyświetlane w różnych sekcjach karty.

Szablon jest podzielony na te sekcje:

Android

Omówienie sekcji i pozycji układu szablonu karty

Sieć

Omówienie sekcji i pozycji układu szablonu karty

Tytuł karty

Android

Elementy układu tytułu karty i pozycje pól Tytuł karty domyślnej
  1. class.flightHeader.carrier.airlineLogo
  2. class.flightHeader.carrier.airlineName
    lub class.localizedIssuerName
    lub class.issuerName
  3. (class.flightHeader.carrier.carrierIataCode
    lub class.flightHeader.carrier.carrierIcaoCode)
    oraz class.flightHeader.flightNumber
  4. miasto, w którym znajduje się lotnisko (na podstawie class.origin.airportIataCode)
    lub class.origin.airportNameOverride
  5. class.origin.airportIataCode
  6. miasto, w którym znajduje się lotnisko (na podstawie 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)
    oraz class.flightHeader.flightNumber
  3. miasto, w którym znajduje się lotnisko (na podstawie class.origin.airportIataCode)
    lub class.origin.airportNameOverride
  4. class.origin.airportIataCode
  5. miasto, w którym znajduje się lotnisko (na podstawie class.destination.airportIataCode)
    lub class.destination.airportNameOverride
  6. class.destination.airportIataCode
  7. object.hexBackgroundColor
    lub class.hexBackgroundColor

Sieć

Elementy układu tytułu karty i pozycje pól Tytuł karty domyślnej
  1. class.flightHeader.carrier.airlineLogo
  2. class.flightHeader.carrier.airlineName
    lub class.localizedIssuerName
    lub class.issuerName
  3. (class.flightHeader.carrier.carrierIataCode
    lub class.flightHeader.carrier.carrierIcaoCode)
    oraz class.flightHeader.flightNumber
  4. miasto, w którym znajduje się lotnisko (na podstawie class.origin.airportIataCode)
    lub class.origin.airportNameOverride
  5. class.origin.airportIataCode
  6. miasto, w którym znajduje się lotnisko (na podstawie 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)
    oraz class.flightHeader.flightNumber
  3. miasto, w którym znajduje się lotnisko (na podstawie class.origin.airportIataCode)
    lub class.origin.airportNameOverride
  4. class.origin.airportIataCode
  5. miasto, w którym znajduje się lotnisko (na podstawie class.destination.airportIataCode)
    lub class.destination.airportNameOverride
  6. class.destination.airportIataCode
  7. object.hexBackgroundColor
    lub class.hexBackgroundColor

W sekcji tytułu karty wyświetlane jest logo, nazwa linii lotniczej i podsumowanie lotu. Wszystkie te 3 elementy są wymagane i nie można zmienić ani odwołań do pól używanych do ich wypełniania, ani ich pozycji.

Jeśli parametry class.origin.airportNameOverride lub class.destination.airportNameOverride nie są ustawione, nazwa miasta, w którym znajduje się lotnisko, jest automatycznie wypełniana nazwą miasta powiązaną z kodem IATA odpowiednio w parametrach class.origin.airportIataCode i class.destination.airportIataCode.

Jeśli pole szerokiego logo jest ustawione, na urządzeniach mobilnych domyślny nagłówek szablonu z logo i nazwą wydawcy jest zastępowany szerokim logo.

Podczas tworzenia szerokiego logo nagłówka postępuj zgodnie ze wskazówkami dotyczącymi szerokiego logo, aby obraz był optymalnie wyświetlany na kartach.

Szablon karty

Android

Elementy układu wiersza szablonu karty i pozycje pól

Sieć

Elementy układu wiersza szablonu karty i pozycje pól

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

Możesz określić liczbę wierszy, która definiuje liczbę obiektów na liście class.classTemplateInfo.cardTemplateOverride.cardRowTemplateInfos[]. Lista musi zawierać co najmniej 1 element, ale zalecamy użycie maksymalnie 2 elementów. Każdy element musi być jednego z tych typów:

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

Każdy element można zdefiniować jako pojedynczy selektor pola (.firstValue), 2 selektory pola (.firstValue i .secondValue) lub wstępnie zdefiniowany element (.predefinedItem). Wyświetlane są zarówno wartości wybranego pola, jak i ich etykiety. Jeśli zdefiniujesz 2 selektory 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 w szablonie 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 i ich nagłówków jako etykiet:

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ę z tym formatem sekcji szablonu kodu:

Przykład zastąpienia etykiety.

Jeśli element jest pusty, nie jest wyświetlany. Więcej informacji znajdziesz w dokumentacji dotyczącej odwołań do pól. Jeśli wszystkie elementy w wierszu są puste, wiersz nie jest wyświetlany. Jeśli niektóre, ale nie wszystkie elementy w wierszu są puste, elementy niepuste są ponownie rozmieszczane i wyświetlane jako wiersz z mniejszą liczbą elementów.

Jeśli nie zastąpisz szablonu karty, używana będzie domyślna liczba wierszy, domyślna liczba elementów i domyślne odwołania do pól. Więcej informacji znajdziesz w sekcji Szablon domyślny.

Po zdefiniowaniu banera powitalnego może on pojawić się po pierwszym wierszu, jeśli na liście cardRowTemplateInfos jest wiele wierszy, lub nad wierszem, jeśli jest tylko jeden.

Kod kreskowy karty

Android

Elementy i pozycje układu 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

Sieć

Elementy i pozycje układu 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 przed kodem kreskowym i po nim. Żadne z pól w tej sekcji nie jest wymagane.

Dostępne są 3 selektory pól, za pomocą których można zdefiniować 2 pola obok siebie przed kodem kreskowym i 1 pole po nim. Są one wyświetlane bez etykiety i mogą być polami uporządkowanych danych tekstowych, polami modułu tekstowego lub polami modułu graficznego. 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. Dodatkowo pod kodem kreskowym może być wyświetlany tekst. Ten tekst może ułatwić 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ę z tym formatem sekcji kodu kreskowego:

Przykład zastąpienia kodu kreskowego karty.

Jeśli nie zastąpisz sekcji kodu kreskowego, używane są domyślne pola kodu kreskowego. Więcej informacji znajdziesz w artykule Szablon domyślny.

Dolna sekcja

Android

Dolne sekcje i elementy 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
  • …

Sieć

Dolne sekcje i elementy 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
  • …

Dolna sekcja 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 zdefiniować jako selektor pojedynczego pola (.firstValue), selektor 2 pól (.firstValue i .secondValue) lub wstępnie zdefiniowany element (.predefinedItem). Wyświetlane są zarówno wartości wybranego pola, jak i ich etykiety. Jeśli zdefiniujesz 2 selektory 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 obrazu są renderowane na pełną szerokość bez etykiety.

Poniższy przykładowy kod pokazuje, jak zastąpić dolną sekcję karty, aby wyświetlić jedno 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ę z tym formatem dolnej sekcji:

Przykład zastąpienia dolnej sekcji.

Jeśli element jest pusty, nie jest wyświetlany. Więcej informacji znajdziesz w dokumentacji dotyczącej odwołań do pól.

Jeśli nie zastąpisz dolnej sekcji, wyświetli się domyślna lista pól referencyjnych w domyślnej kolejności. Więcej informacji znajdziesz w artykule o szablonie domyślnym.

Szablon listy

Wyświetlanie elementów szablonu listy
  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. <# karty> (pogrupowane)

Sekcja szablonu listy służy do wybierania pola, które ma być wyświetlane w widoku „Karty” w aplikacji Portfel Google. Karta jest reprezentowana na liście za pomocą logo, koloru tła i 3 wierszy.

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

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 tą wersją szablonu listy:

Przykład zastąpienia listy.

Te 3 wiersze można zdefiniować za pomocą selektora pól. Pola są wyświetlane bez etykiety. W przypadku zgrupowanych kart niepłatniczych drugi wiersz zawsze pokazuje lokalną zaplanowaną datę odlotu, a trzeci wiersz zawsze pokazuje liczbę zgrupowanych kart niepłatniczych.

Odwołania do pól

Odwołania do pól są używane w różnych częściach szablonu w postaci 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 pola. Na przykład niektóre odwołania do pól zezwalają tylko na ścieżki do pól tekstowych uporządkowanych danych lub pól modułów tekstowych. Tekstowe pola uporządkowane to pola danych uporządkowanych typu ciąg znaków, zlokalizowany ciąg znaków, data lub waluta.

Listę można wykorzystać do wdrożenia logiki kreacji zastępczej. Oznacza to, że jeśli pierwsza ścieżka na liście prowadzi do pustego pola, oceniana jest następna ścieżka. Logika kreacji zastępczej jest przeznaczona głównie do pól uporządkowanych danych tekstowych lub pól modułów tekstowych. Nie mieszaj różnych typów pól na tej samej liście. Logiki zastępczej używaj ostrożnie i tylko w określonych sytuacjach, gdy spodziewasz się spójnego wzorca pól, które występują w niektórych obiektach, ale nie we wszystkich. W większości przypadków łatwiej jest utworzyć osobne klasy dla różnych przypadków użycia.

Jeśli wszystkie ścieżki na liście odwołań do pól prowadzą do pustych pól, element, który używa odwołania do pola, nie jest wyświetlany. Jeśli chcesz, aby element, który używa odwołania do pola, był zawsze obecny, upewnij się, że co najmniej jedna ścieżka nie jest pusta. Zalecamy ustawienie pola na znak specjalny, np. „-”, aby reprezentować wartość null, nawet jeśli niektóre pola zezwalają na ciągi znaków zawierające tylko spację.

Aby odwołać się do pola zawartego na liście, możesz użyć indeksu pola na liście lub, w większości przypadków, identyfikatora referencyjnego. Elementy listy, do których można się odwoływać za pomocą identyfikatora, mają pole .id. Zalecamy używanie identyfikatora referencyjnego zamiast indeksu pola na liście, jeśli jest dostępny.

Oto przykład odwoływania się do pól zawartych 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 pierwszym elementem w sekcji szczegółów karty jest drugi obraz zadeklarowany w obiekcie. Drugim elementem w sekcji szczegółów karty jest pierwszy obraz zadeklarowany w obiekcie.

Domyślny szablon

Android

Domyślne elementy i pozycje układu szablonu karty
  1. class.flightHeader.carrier.airlineLogo
  2. class.flightHeader.carrier.airlineName
    lub class.localizedIssuerName
    lub class.issuerName
  3. class.origin.airportIataCode
  4. class.destination.airportIataCode
  5. miasto, w którym znajduje się lotnisko (na podstawie class.origin.airportIataCode)
    lub class.origin.airportNameOverride
  6. miasto, w którym znajduje się lotnisko (na podstawie class.destination.airportIataCode)
    lub class.destination.airportNameOverride
  7. (class.flightHeader.carrier.carrierIataCode
    lub class.flightHeader.carrier.carrierIcaoCode)
    oraz class.flightHeader.flightNumber
  8. object.securityProgramLogo
  9. object.boardingAndSeatingInfo.boardingPrivilegeImage
  10. object.barcode.type i object.barcode.value
    lub object.reservationInfo.confirmationCode
  11. object.barcode.alternateText
  12. class.flightHeader.carrier.airlineAllianceLogo
  13. PASSENGER
  14. object.passengerName
  15. ZONE (domyślnie) lub GROUP (zależy od
    class.boardingAndSeatingPolicy.boardingPolicy) oraz
  16. SEAT
  17. object.boardingAndSeatingInfo.boardingGroup i
  18. object.boardingAndSeatingInfo.seatNumber
    lub object.boardingAndSeatingInfo.seatAssignment
  19. TERMINAL
  20. BRAMKA
  21. class.origin.terminal
  22. class.origin.gate
  23. BOARDING
  24. class.localBoardingDateTime
  25. CABIN (domyślna), CLASS lub TIER (zależy od
    class.boardingAndSeatingPolicy.SeatClassPolicy)
  26. object.boardingAndSeatingInfo.SeatClass
  27. ODLOT
  28. class.localScheduledDepartureDateTime
  29. object.hexBackgroundColor
    lub class.hexBackgroundColor
  30. object.heroImage
    lub class.heroImage
  31. NUMER POTWIERDZENIA
  32. object.reservationInfo.confirmationCode
  33. NUMER PROGRAMU LOJALNOŚCIOWEGO LINII LOTNICZEJ
  34. object.reservationInfo.frequentFlyerInfo.frequentFlyerNumber
    i object.reservationInfo.frequentFlyerInfo.frequentFlyerProgramName
  35. PLANOWANY CZAS PRZYLOTU
  36. class.localScheduledArrivalDateTime
  37. class.messages[].header
  38. class.messages[].body
  39. object.messages[].header
  40. object.messages[].body
  41. class.textModulesData[0..9].header
  42. class.textModulesData[0..9].body
  43. object.textModulesData[0..9].header
  44. object.textModulesData[0..9].body
  45. class.linksModuleData.uris[].description
  46. object.linksModuleData.uris[].description

Sieć

Domyślne elementy i pozycje układu szablonu karty
  1. class.flightHeader.carrier.airlineLogo
  2. class.flightHeader.carrier.airlineName
    lub class.localizedIssuerName
    lub class.issuerName
  3. class.origin.airportIataCode
  4. class.destination.airportIataCode
  5. miasto, w którym znajduje się lotnisko (na podstawie class.origin.airportIataCode)
    lub class.origin.airportNameOverride
  6. miasto, w którym znajduje się lotnisko (na podstawie class.destination.airportIataCode)
    lub class.destination.airportNameOverride
  7. (class.flightHeader.carrier.carrierIataCode
    lub class.flightHeader.carrier.carrierIcaoCode)
    oraz class.flightHeader.flightNumber
  8. object.securityProgramLogo
  9. object.boardingAndSeatingInfo.boardingPrivilegeImage
  10. object.barcode.type i object.barcode.value
    lub object.reservationInfo.confirmationCode
  11. object.barcode.alternateText
  12. class.flightHeader.carrier.airlineAllianceLogo
  13. PASSENGER
  14. object.passengerName
  15. ZONE (domyślnie) lub GROUP (zależy od
    class.boardingAndSeatingPolicy.boardingPolicy) oraz
  16. SEAT
  17. object.boardingAndSeatingInfo.boardingGroup i
  18. object.boardingAndSeatingInfo.seatNumber
    lub object.boardingAndSeatingInfo.seatAssignment
  19. TERMINAL
  20. BRAMKA
  21. class.origin.terminal
  22. class.origin.gate
  23. BOARDING
  24. class.localBoardingDateTime
  25. CABIN (domyślna), CLASS lub TIER (zależy od
    class.boardingAndSeatingPolicy.SeatClassPolicy)
  26. object.boardingAndSeatingInfo.SeatClass
  27. ODLOT
  28. class.localScheduledDepartureDateTime
  29. object.hexBackgroundColor
    lub class.hexBackgroundColor
  30. object.heroImage
    lub class.heroImage
  31. NUMER POTWIERDZENIA
  32. object.reservationInfo.confirmationCode
  33. NUMER PROGRAMU LOJALNOŚCIOWEGO LINII LOTNICZEJ
  34. object.reservationInfo.frequentFlyerInfo.frequentFlyerNumber
    i object.reservationInfo.frequentFlyerInfo.frequentFlyerProgramName
  35. PLANOWANY CZAS PRZYLOTU
  36. class.localScheduledArrivalDateTime
  37. class.messages[].header
  38. class.messages[].body
  39. object.messages[].header
  40. object.messages[].body
  41. class.textModulesData[0..9].header
  42. class.textModulesData[0..9].body
  43. object.textModulesData[0..9].header
  44. object.textModulesData[0..9].body
  45. class.linksModuleData.uris[].description
  46. object.linksModuleData.uris[].description

Domyślnie w dolnej sekcji wyświetlane są też pola object.boardingAndSeatingInfo.boardingGroup, object.boardingAndSeatingInfo.seatClass i object.boardingAndSeatingInfo.seatNumber, jeśli sekcja karty została zastąpiona i te pola nie są już w niej obecne.

W przypadku pól modułu obrazu wyświetlamy tylko jedno pole modułu obrazu z klasy i tylko jedno pole modułu obrazu z obiektu. Jeśli potrzebujesz więcej niż 1 pola modułu obrazu na dowolnym poziomie, zastąp szablon domyślny.

W przypadku pól modułu tekstowego wyświetlamy maksymalnie 20 pól modułu tekstowego z klasy i 20 pól modułu tekstowego z obiektu. Pola są wyświetlane w tej samej kolejności, w jakiej są zdefiniowane w tablicy. Jeśli potrzebujesz więcej niż 20 pól modułu tekstowego na dowolnym poziomie, zastąp szablon domyślny.

W przypadku wiadomości wyświetlamy maksymalnie 20 wiadomości z klasy i 20 wiadomości z obiektu. Nie gwarantujemy zachowania kolejności wiadomości. Jeśli potrzebujesz więcej niż 20 wiadomości na dowolnym poziomie lub gwarancji dotyczącej zamówień, zastąp szablon domyślny.

W przypadku pola modułu linków nie ma limitu liczby identyfikatorów URI, które można zdefiniować. Identyfikatory URI są wyświetlane w grupach w tej kolejności na każdym poziomie (klasy lub obiektu):

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

W każdej grupie identyfikatory URI są wyświetlane w takiej samej kolejności, w jakiej są zdefiniowane w tablicy. Jeśli potrzebujesz innej kolejności, zastąp domyślny szablon.

Elementy i pozycje domyślnego układu 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. <# karty> (pogrupowane)