Szablon biletu na przejazd

Bilety na przejazdy obsługują renderowanie szablonów. Jeśli nie zdefiniowano żadnego szablonu, używany jest domyślny.

Definicja szablonu

Szablon karty jest określony 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 następujące 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.logo
  2. class.localizedIssuerName
    lub class.issuerName
  3. object.ticketLeg.originName
  4. object.ticketLeg.destinationName
  5. object.ticketLeg.originStationCode
  6. object.ticketLeg.destinationStationCode
  7. object.tripType
  8. object.hexBackgroundColor
    lub class.hexBackgroundColor

Tytuł karty z logo w formacie panoramicznym
  1. class.wideLogo
  2. object.ticketLeg.originName
  3. object.ticketLeg.destinationName
  4. object.ticketLeg.originStationCode
  5. object.ticketLeg.destinationStationCode
  6. object.tripType
  7. object.hexBackgroundColor
    lub class.hexBackgroundColor

Sieć

Elementy układu tytułu karty i pozycje pól Tytuł karty domyślnej
  1. class.logo
  2. class.localizedIssuerName
    lub class.issuerName
  3. object.ticketLeg.originName
  4. object.ticketLeg.destinationName
  5. object.ticketLeg.originStationCode
  6. object.ticketLeg.destinationStationCode
  7. object.tripType
  8. object.hexBackgroundColor
    lub class.hexBackgroundColor

Tytuł karty z logo w formacie panoramicznym
  1. class.wideLogo
  2. object.ticketLeg.originName
  3. object.ticketLeg.destinationName
  4. object.ticketLeg.originStationCode
  5. object.ticketLeg.destinationStationCode
  6. object.tripType
  7. object.hexBackgroundColor
    lub class.hexBackgroundColor

Sekcja tytułu karty służy do wyświetlania logo i nazwy operatora biletu oraz podsumowania przejazdu. 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.

Jednak logika renderowania w górnym wierszu pozwala na pewną elastyczność. Górny wiersz biletu, który zawiera podsumowanie przejazdu, zależy od tych pól obiektu TransitObject (przejazd jednoetapowy):

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

Sposób renderowania biletu zależy od tego, które pola nie są puste. Bilet może renderować się na kilka sposobów:

  • Tylko nazwa miejsca odjazdu: wyświetlane jest tylko miejsce odjazdu. Jest to przydatne, gdy bilet dotyczy obszaru, a nie konkretnego przejazdu.
  • Miejsce wyjazdu i miejsce docelowe: po lewej wyświetla się miejsce odjazdu, a po prawej miejsce docelowe. Symbol między nimi zależy od rodzaju przejazdu. Miejsce odjazdu i miejsce docelowe mogą wyświetlać się jako:
    • Nazwy i kody stacji: kody stacji i nazwy wyświetlają się u góry w formie mniejszego tekstu.
    • Tylko nazwy: wyświetlają się nazwy.
    • Tylko kody stacji: wyświetlają się kody stacji.

Wieloetapowe obiekty TransitObject działają bardzo podobnie. W tym przypadku nie używaj object.ticketLeg. Zamiast tego musisz użyć listy object.ticketLegs[]. Musisz określić miejsca odjazdu i miejsca docelowe. Każdy etap musi mieć spójne nazwy lub kody stacji. Wyświetlane miejsce odjazdu pochodzi z pierwszego elementu tablicy, a wyświetlane miejsce docelowe z jej ostatniego elementu.

Kolor tła biletu nie jest polem wymaganym i można go określić na poziomie klasy i obiektu. Pole obiektu ma wyższy priorytet i może zastąpić pole klasy.

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

Podczas tworzenia szerokiego logo nagłówka postępuj zgodnie z  wytycznymi dotyczącymi obrazu szerokiego logo, aby optymalnie wyświetlać obraz 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 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 musi zawierać co najmniej 1 element, ale zalecamy używanie maksymalnie 2 elementów. Każdy element musi być jednego z tych typó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 jednego pola (.firstValue), selektory dwóch pól (.firstValue i .secondValue) lub zdefiniowany wcześniej element (.predefinedItem). Wyświetlają się wartości wybranego pola i ich etykiety. Jeśli określisz selektory dwóch pól, wartości wybranych pól będą wyświetlane z separatorem „/”. To samo dotyczy etykiet wybranych pól. Zdefiniowane wcześniej elementy są używane, gdy renderowanie jest bardziej złożone.

Poniższy przykładowy kod pokazuje, jak zastąpić sekcje wierszy karty szablonu, aby określić dwa 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ę w następującym formacie sekcji kodu szablonu:

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świetli się 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.

Po zdefiniowaniu banera powitalnego może się on pojawić 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 układu kodu kreskowego karty i ich położenie
  1. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .firstTopDetail
  2. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .secondTopDetail
  3. object.barcode.typeobject.barcode.value
    lub object.ticketNumber
  4. object.barcode.alternateText
  5. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .firstBottomDetail

Sieć

Elementy układu kodu kreskowego karty i ich położenie
  1. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .firstTopDetail
  2. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .secondTopDetail
  3. object.barcode.typeobject.barcode.value
    lub object.ticketNumber
  4. object.barcode.alternateText
  5. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .firstBottomDetail

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

Dostępne są selektory 3 pól, które pozwalają ustawić 2 pola obok siebie przed kodem kreskowym i 1 pole po 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, muszą 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. Ułatwia on 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, używane będą domyślne pola kodu kreskowego. Więcej informacji znajdziesz w opisie domyślnego szablonu.

Dolna sekcja

Android

Sekcje i elementy u dołu szablonu szczegółów
  • Plan podróży wieloetapowej
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[0].item
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[1].item
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[2].item

Sieć

Sekcje i elementy u dołu szablonu szczegółów
  • Plan podróży wieloetapowej
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[0].item
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[1].item
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[2].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 określić jako selektor jednego pola (.firstValue), selektory dwóch pól (.firstValue i .secondValue) lub zdefiniowany wcześniej element (.predefinedItem). Wyświetlają się wartości wybranego pola i ich etykiety. Jeśli określisz selektory dwóch pól, wartości wybranych pól będą wyświetlane z separatorem „/”. To samo dotyczy etykiet wybranych pól. Zdefiniowane wcześniej elementy są używane, gdy renderowanie jest bardziej złożone. Pola modułu obrazów renderują się w pełnej szerokości bez etykiety.

Poniższy przykładowy kod pokazuje, jak zastąpić dolną sekcję 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 dolnej:

Przykład zastąpienia sekcji u dołu.

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

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

Jeśli przejazd ma wiele etapów, u góry sekcji wyświetla się prosty plan przejazdu, którego nie można przenieść. Jeśli przejazd ma tylko 1 etap, możesz ustawić class.enableSingleLegItinerary, aby wyświetlić prosty plan podróży.

Plan podróży wieloetapowej
  1. class.tranistType
  2. object.ticketLegs[i].originName
    lub object.ticketLegs[i].originStationCode
  3. object.ticketLegs[i].departureDateTime (tylko czas)
  4. object.ticketLegs[i].transitOperatorName
  5. COACH lub class.customCoachLabel
  6. object.ticketLegs[i].ticketSeat.coach
    lub object.ticketLegs[i].ticketSeats[*].coach
  7. SEAT lub class.customSeatLabel
  8. object.ticketLegs[i].ticketSeat.seat
    lub object.ticketLegs[i].ticketSeat.seatAssignment
    lub object.ticketLegs[i].ticketSeats[*].seat
    lub object.ticketLegs[i].ticketSeats[*].seatAssignment
    lub NO SPECIFIC SEAT
  9. object.hexBackgroundColor
    lub class.hexBackgroundColor
  10. object.ticketLegs[i].destinationName
    lub object.ticketLegs[i].destinationStationCode
  11. object.ticketLegs[i].arrivalDateTime (tylko czas)
  12. PRZESIADKA NA: PERON
    lub PRZESIADKA NA: class.customPlatformLabel
    lub PRZESIADKA (jeśli nie określono peronu)
  13. object.ticketLegs[i+1].platform

Szablon listy

Elementy szablonu listy
  1. class.classTemplateInfo.listTemplateOverride
      .firstRowOption.fieldOption.fields[]
  2. object.ticketLeg.departureDateTime (zgrupowane)
    lub class.classTemplateInfo.listTemplateOverride
      .secondRowOption.fields[]
  3. class.logo
  4. object.hexBackgroundColor
    lub class.hexBackgroundColor
  5. <# passes> (grouped)

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 z datą ważności obiektu jednej 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.

Pierwszy wiersz może być określony za pomocą selektora pola lub zawierać podsumowanie przejazdu. Może ono być w jednym z tych formatów:

  • originAndDestinationCodes
  • originAndDestinationNames
  • originName

Drugi i trzeci wiersz można określić tylko za pomocą selektora pól. Pola wyświetlają się bez etykiet. W zgrupowanych biletach drugi wiersz zawsze zawiera datę odjazdu, a trzeci wiersz zawsze zawiera liczbę zgrupowanych biletów.

Etykiety

Wszystkie pola uporządkowanych danych mają etykietę podaną przez Google. Google odpowiada za przetłumaczenie każdej etykiety na wszystkie obsługiwane języki.

Niektóre z tych etykiet można dostosować za pomocą jednego z pól class.custom<name_of_the_field>Label. Jeśli dostosujesz etykietę, to na Tobie spocznie odpowiedzialność za przetłumaczenie jej na wszystkie języki, które mają być obsługiwane.

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.

Niektóre typy ścieżek nie są dozwolone w pewnych odwołaniach 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 obsługują dane w formie ciągów znaków, zlokalizowanych ciągów znaków, dat i kwot.

Lista pozwala wdrożyć logikę awaryjną. 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 wyjątkowych sytuacjach, gdy pola mają mieć spójny wzór w niektórych obiektach, a w innych nie. Zwykle ł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 ten element ma być zawsze widoczny, przynajmniej jedna ścieżka musi mieć zawartość. Zalecamy ustawienie w polu znaku specjalnego, np. „-”, aby reprezentował wartość null, nawet jeśli 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. W miarę możliwości używaj identyfikatora odwołania, a nie indeksu pola na liście.

Oto przykład, w jaki sposób należy odwołać 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 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 układu szablonu karty i ich położenie
  1. class.logo
  2. class.localizedIssuerName
    lub class.issuerName
  3. Zobacz tytuł karty
  4. DEPARTURE lub VALID FROM
  5. object.ticketLeg.departureDateTime (data i godzina)
    lub object.validTimeInterval.start.date
  6. PRZYJAZD lub WAŻNE DO
  7. object.ticketLeg.arrivalDateTime (tylko czas)
    lub object.validTimeInterval.end.date
  8. PASSENGER
  9. object.passengerNames
  10. CARRIAGE lub class.customCarriageLabel
  11. object.ticketLeg.carriage
  12. COACH lub class.customCoachLabel
  13. object.ticketLeg.ticketSeat.coach
  14. SEAT lub class.customSeatLabel
  15. object.ticketLeg.ticketSeat.seat
    lub object.ticketLeg.ticketSeat.seatAssignment
  16. object.barcode.typeobject.barcode.value
    lub object.ticketNumber
  17. object.barcode.alternateText
  18. object.hexBackgroundColor
    lub class.hexBackgroundColor
  19. Plan podróży wieloetapowej
  20. NUMER BILETU lub class.customTicketNumberLabel
  21. object.ticketNumber
  22. STAN ZGŁOSZENIA
  23. object.ticketStatus lub object.customTicketStatus
  24. WYJAZD
  25. object.ticketLeg.departureDateTime
  26. PRZYLOT
  27. object.ticketLeg.arrivalDateTime
  28. NAZWA TARYFY lub class.customFareNameLabel
  29. object.ticketLeg.fareName
  30. PLATFORM lub class.customPlatformLabel
  31. object.ticketLeg.platform
  32. ZONE lub class.customZoneLabel
  33. object.ticketLeg.zone
  34. KLASA TARYFY lub class.customFareClassLabel
  35. object.ticketLeg.ticketSeat.fareClass
    lub object.ticketLeg.ticketSeat.customFareClass
  36. CONCESSION CATEGORY
    lub class.customConcessionCategoryLabel
  37. object.concessionCategory
    lub object.customConcessionCategory
  38. OGRANICZENIA DOTYCZĄCE TRASY
    lub class.customRouteRestrictionsLabel
  39. object.ticketRestrictions.routeRestrictions
  40. SZCZEGÓŁY OGRANICZEŃ TRASY
    lub class.customRouteRestrictionsDetailsLabel
  41. object.ticketRestrictions.routeRestrictionsDetails
  42. OGRANICZENIA CZASOWE
    lub class.customTimeRestrictionsLabel
  43. object.ticketRestrictions.timeRestrictions
  44. INNE OGRANICZENIA
    lub class.customOtherRestrictionsLabel
  45. object.ticketRestrictions.otherRestrictions
  46. NUMER RACHUNKU
    lub class.customPurchaseReceiptNumberLabel
  47. object.purchaseDetails.purchaseReceiptNumber
  48. DATA ZAKUPU
  49. object.purchaseDetails.purchaseDateTime
  50. IDENTYFIKATOR KONTA
  51. object.purchaseDetails.accountId
  52. KOD POTWIERDZAJĄCY
    lub class.customConfirmationCodeLabel
  53. object.purchaseDetails.confirmationCode
  54. WARTOŚĆ NOMINALNA lub class.customPurchaseFaceValueLabel
  55. object.purchaseDetails.ticketCost.faceValue
  56. PRICE lub class.customPurchasePriceLabel
  57. object.purchaseDetails.ticketCost.purchasePrice
  58. WIADOMOŚĆ O RABACIE
    lub class.customDiscountMessageLabel
  59. object.purchaseDetails.ticketCost.discountMessage
  60. class.imageModulesData[0].mainImage
  61. object.imageModulesData[0].mainImage
  62. class.messages[].header
  63. class.messages[].body
  64. object.messages[].header
  65. object.messages[].body
  66. class.textModulesData[0..9].header
  67. class.textModulesData[0..9].body
  68. object.textModulesData[0..9].header
  69. object.textModulesData[0..9].body
  70. class.linksModuleData.uris[].description
  71. object.linksModuleData.uris[].description

Sieć

Domyślne elementy układu szablonu karty i ich położenie
  1. class.logo
  2. class.localizedIssuerName
    lub class.issuerName
  3. Zobacz tytuł karty
  4. DEPARTURE lub VALID FROM
  5. object.ticketLeg.departureDateTime (data i godzina)
    lub object.validTimeInterval.start.date
  6. PRZYJAZD lub WAŻNE DO
  7. object.ticketLeg.arrivalDateTime (tylko czas)
    lub object.validTimeInterval.end.date
  8. PASSENGER
  9. object.passengerNames
  10. CARRIAGE lub class.customCarriageLabel
  11. object.ticketLeg.carriage
  12. COACH lub class.customCoachLabel
  13. object.ticketLeg.ticketSeat.coach
  14. SEAT lub class.customSeatLabel
  15. object.ticketLeg.ticketSeat.seat
    lub object.ticketLeg.ticketSeat.seatAssignment
  16. object.barcode.typeobject.barcode.value
    lub object.ticketNumber
  17. object.barcode.alternateText
  18. object.hexBackgroundColor
    lub class.hexBackgroundColor
  19. Plan podróży wieloetapowej
  20. NUMER BILETU lub class.customTicketNumberLabel
  21. object.ticketNumber
  22. STAN ZGŁOSZENIA
  23. object.ticketStatus lub object.customTicketStatus
  24. WYJAZD
  25. object.ticketLeg.departureDateTime
  26. PRZYLOT
  27. object.ticketLeg.arrivalDateTime
  28. NAZWA TARYFY lub class.customFareNameLabel
  29. object.ticketLeg.fareName
  30. PLATFORM lub class.customPlatformLabel
  31. object.ticketLeg.platform
  32. ZONE lub class.customZoneLabel
  33. object.ticketLeg.zone
  34. KLASA TARYFY lub class.customFareClassLabel
  35. object.ticketLeg.ticketSeat.fareClass
    lub object.ticketLeg.ticketSeat.customFareClass
  36. CONCESSION CATEGORY
    lub class.customConcessionCategoryLabel
  37. object.concessionCategory
    lub object.customConcessionCategory
  38. OGRANICZENIA DOTYCZĄCE TRASY
    lub class.customRouteRestrictionsLabel
  39. object.ticketRestrictions.routeRestrictions
  40. SZCZEGÓŁY OGRANICZEŃ TRASY
    lub class.customRouteRestrictionsDetailsLabel
  41. object.ticketRestrictions.routeRestrictionsDetails
  42. OGRANICZENIA CZASOWE
    lub class.customTimeRestrictionsLabel
  43. object.ticketRestrictions.timeRestrictions
  44. INNE OGRANICZENIA
    lub class.customOtherRestrictionsLabel
  45. object.ticketRestrictions.otherRestrictions
  46. NUMER RACHUNKU
    lub class.customPurchaseReceiptNumberLabel
  47. object.purchaseDetails.purchaseReceiptNumber
  48. DATA ZAKUPU
  49. object.purchaseDetails.purchaseDateTime
  50. IDENTYFIKATOR KONTA
  51. object.purchaseDetails.accountId
  52. KOD POTWIERDZAJĄCY
    lub class.customConfirmationCodeLabel
  53. object.purchaseDetails.confirmationCode
  54. WARTOŚĆ NOMINALNA lub class.customPurchaseFaceValueLabel
  55. object.purchaseDetails.ticketCost.faceValue
  56. PRICE lub class.customPurchasePriceLabel
  57. object.purchaseDetails.ticketCost.purchasePrice
  58. WIADOMOŚĆ O RABACIE
    lub class.customDiscountMessageLabel
  59. object.purchaseDetails.ticketCost.discountMessage
  60. class.imageModulesData[0].mainImage
  61. object.imageModulesData[0].mainImage
  62. class.messages[].header
  63. class.messages[].body
  64. object.messages[].header
  65. object.messages[].body
  66. class.textModulesData[0..9].header
  67. class.textModulesData[0..9].body
  68. object.textModulesData[0..9].header
  69. object.textModulesData[0..9].body
  70. class.linksModuleData.uris[].description
  71. object.linksModuleData.uris[].description

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 gwarantujemy 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 podanej 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.

Identyfikatory URI w każdej grupie wyświetlają się w kolejności, w której są zdefiniowane w tablicy. Aby ustawić inną kolejność, zastąp domyślny szablon.

Elementy układu domyślnego szablonu listy i ich położenie
  1. (object.ticketLeg.originName
      i object.ticketLeg.destinationName)
    lub (object.ticketLeg.originStationCode
      i object.ticketLeg.destinationStationCode)
    lub object.ticketLeg.originName
  2. object.ticketLeg.departureDateTime
    lub object.validTimeInterval.end.date
  3. class.logo
  4. object.hexBackgroundColor
    lub class.hexBackgroundColor
  5. <# passes> (grouped)