Szablon biletu na przejazd

Karty transportu publicznego 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.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 szerokim logo
  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 szerokim logo
  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 zawiera logo, nazwę operatora transportu publicznego i podsumowanie podróży. 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.

Logika renderowania pozwala jednak na pewną elastyczność w przypadku górnego wiersza. Górny wiersz karty, który reprezentuje podsumowanie podróży, jest kontrolowany przez te pola w TransitObject w przypadku podróży z jednym odcinkiem:

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

Sposób renderowania karty zależy od tego, które pola nie są puste. Można go renderować na te sposoby:

  • Tylko nazwa źródła: wyświetlana jest tylko nazwa źródła. Jest to szczególnie przydatne w przypadku biletów, które obejmują dany obszar, a nie konkretną trasę.
  • Miejsce początkowe i docelowe: miejsce początkowe znajduje się po lewej stronie, a miejsce docelowe po prawej. Symbol między nimi zależy od typu podróży. Miejsce początkowe i cel podróży są wyświetlane jako jedna z tych opcji:
    • Nazwy i kody stacji: kody stacji są wyświetlane wraz z nazwami jako mniejszy tekst u góry.
    • Tylko nazwy: wyświetlamy nazwy.
    • Tylko kody stacji: wyświetlamy kody stacji.

Obiekty TransitObject z wieloma etapami działają bardzo podobnie. W takim przypadku nie używaj object.ticketLeg. Zamiast tego musisz użyć listy object.ticketLegs[]. Musisz określić zarówno miejsca odjazdu, jak i miejsca docelowe. Nazwy lub kody stacji (albo jedne i drugie) muszą być używane konsekwentnie na każdym odcinku. Wyświetlane miejsce początkowe to miejsce początkowe pierwszego elementu w tablicy, a wyświetlane miejsce docelowe to miejsce docelowe ostatniego elementu w tablicy.

Kolor tła karty nie jest polem wymaganym i można go zdefiniować zarówno na poziomie klasy, jak i obiektu. Pole obiektu ma wyższy priorytet i może być używane do zastępowania pola klasy.

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.ticketNumber
  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.ticketNumber
  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
  • Plan podróży z wieloma etapami
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[0].item
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[1].item
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[2].item
  • …

Sieć

Dolne sekcje i elementy szablonu szczegółów
  • Plan podróży z wieloma etapami
  • 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 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.

Jeśli podróż obejmuje kilka etapów, u góry sekcji wyświetlany jest prosty plan podróży, którego nie można przenieść. Jeśli podróż obejmuje tylko 1 etap, możesz wyświetlić prosty plan podróży, ustawiając class.enableSingleLegItinerary.

Plan podróży z wieloma etapami
  1. class.tranistType
  2. object.ticketLegs[i].originName
    lub object.ticketLegs[i].originStationCode
  3. object.ticketLegs[i].departureDateTime (tylko godzina)
  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 godzina)
  12. PRZENIEŚ NA: PLATFORMA
    lub PRZENIEŚ NA: class.customPlatformLabel
    lub PRZENIEŚ (jeśli nie określono platformy)
  13. object.ticketLegs[i+1].platform

Szablon listy

Wyświetlanie elementów szablonu listy
  1. class.classTemplateInfo.listTemplateOverride
      .firstRowOption.fieldOption.fields[]
  2. object.ticketLeg.departureDateTime (pogrupowane)
    lub class.classTemplateInfo.listTemplateOverride
      .secondRowOption.fields[]
  3. class.logo
  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.

Pierwszy wiersz można zdefiniować za pomocą selektora pola lub wyświetlić podsumowanie podróży. Podsumowanie może mieć jeden z tych formatów:

  • originAndDestinationCodes
  • originAndDestinationNames
  • originName

Drugi i trzeci wiersz można zdefiniować tylko za pomocą selektora pól. Pola są wyświetlane bez etykiety. W przypadku zgrupowanych kart w drugim wierszu zawsze wyświetlana jest data wyjazdu, a w trzecim – liczba zgrupowanych kart.

Etykiety

Wszystkie pola danych strukturalnych mają etykietę dostarczoną przez Google. Google odpowiada za zapewnienie tłumaczenia każdej z tych etykiet na wszystkie obsługiwane języki.

Niektóre z tych etykiet możesz dostosować za pomocą jednego z pól class.custom<name_of_the_field>Label. Jeśli dostosujesz etykietę, musisz podać jej tłumaczenia we wszystkich językach, które chcesz obsługiwać.

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.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. ARRIVING AT (PRZYJAZD O) lub VALID UNTIL (WAŻNY DO)
  7. object.ticketLeg.arrivalDateTime (tylko godzina)
    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.type i object.barcode.value
    lub object.ticketNumber
  17. object.barcode.alternateText
  18. object.hexBackgroundColor
    lub class.hexBackgroundColor
  19. Plan podróży z wieloma etapami
  20. NUMER BILETU lub class.customTicketNumberLabel
  21. object.ticketNumber
  22. STAN ZGŁOSZENIA
  23. object.ticketStatus lub object.customTicketStatus
  24. ODLOT
  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 BILETU lub class.customFareClassLabel
  35. object.ticketLeg.ticketSeat.fareClass
    lub object.ticketLeg.ticketSeat.customFareClass
  36. KATEGORIA ULGI
    lub class.customConcessionCategoryLabel
  37. object.concessionCategory
    lub object.customConcessionCategory
  38. ROUTE RESTRICTIONS
    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 POTWIERDZENIA
    lub class.customConfirmationCodeLabel
  53. object.purchaseDetails.confirmationCode
  54. CENA NOMINALNA lub class.customPurchaseFaceValueLabel
  55. object.purchaseDetails.ticketCost.faceValue
  56. PRICE lub class.customPurchasePriceLabel
  57. object.purchaseDetails.ticketCost.purchasePrice
  58. DISCOUNT MESSAGE
    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 i pozycje układu szablonu karty
  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. ARRIVING AT (PRZYJAZD O) lub VALID UNTIL (WAŻNY DO)
  7. object.ticketLeg.arrivalDateTime (tylko godzina)
    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.type i object.barcode.value
    lub object.ticketNumber
  17. object.barcode.alternateText
  18. object.hexBackgroundColor
    lub class.hexBackgroundColor
  19. Plan podróży z wieloma etapami
  20. NUMER BILETU lub class.customTicketNumberLabel
  21. object.ticketNumber
  22. STAN ZGŁOSZENIA
  23. object.ticketStatus lub object.customTicketStatus
  24. ODLOT
  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 BILETU lub class.customFareClassLabel
  35. object.ticketLeg.ticketSeat.fareClass
    lub object.ticketLeg.ticketSeat.customFareClass
  36. KATEGORIA ULGI
    lub class.customConcessionCategoryLabel
  37. object.concessionCategory
    lub object.customConcessionCategory
  38. ROUTE RESTRICTIONS
    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 POTWIERDZENIA
    lub class.customConfirmationCodeLabel
  53. object.purchaseDetails.confirmationCode
  54. CENA NOMINALNA lub class.customPurchaseFaceValueLabel
  55. object.purchaseDetails.ticketCost.faceValue
  56. PRICE lub class.customPurchasePriceLabel
  57. object.purchaseDetails.ticketCost.purchasePrice
  58. DISCOUNT MESSAGE
    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

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. (object.ticketLeg.originName
      oraz object.ticketLeg.destinationName)
    lub (object.ticketLeg.originStationCode
      oraz 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. <# karty> (pogrupowane)