Szablon biletu na przejazd

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

Definicja szablonu

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

Szablon dzieli się na te sekcje:

Android

Omówienie szablonu

Internet

Omówienie szablonu

Tytuł karty

Android

Elementy tytułu karty Domyślny tytuł karty
  1. class.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

Internet

Elementy tytułu karty
  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

Sekcja tytułu karty służy do wyświetlania logo, nazwy operatora transportu publicznego i 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.

Logika renderowania pozwala jednak na pewną elastyczność w przypadku górnego wiersza. 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 karty zależy od tego, które pola nie są puste. Może być renderowana na te sposoby:

  • Tylko nazwa punktu początkowego: wyświetlana jest tylko nazwa punktu początkowego. Jest to przydatne, gdy bilet dotyczy obszaru, a nie konkretnego przejazdu.
  • Miejsce odjazdu i miejsce docelowe: miejsce odjazdu jest po lewej stronie, a miejsce docelowe po prawej stronie. Symbol między nimi zależy od rodzaju podróży. 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ć zarówno miejsce wylotu, jak i przyloty. Każdy etap musi mieć spójne nazwy lub kody stacji. Wyświetlane miejsce docelowe to punkt początkowy 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 określić na poziomie klasy i obiektu. Pole obiektu ma wyższy priorytet i może służyć do zastępowania pola klasy.

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

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

Szablon karty

Android

Omówienie szablonu

Internet

Omówienie szablonu

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

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

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

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

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

Python

 {
   ... //Rest of class
   "textModulesData": [
        {
            "header": "Label 1",
            "body": "Some info 1",
            "id": "myfield1"
        },
        {
            "header": "Label 2",
            "body": "Some info 2",
            "id": "myfield2"
        },
        {
            "header": "Label 3",
            "body": "Some info 3",
            "id": "myfield3"
        },
        {
            "header": "Label 4",
            "body": "Some info 4",
            "id": "myfield4"
        },
        {
            "header": "Label 5",
            "body": "Some info 5",
            "id": "myfield5"
        },
        {
            "header": "Label 6",
            "body": "Some info 6",
            "id": "myfield6"
        }
    ],
   "classTemplateInfo": {
        "cardTemplateOverride": {
            "cardRowTemplateInfos": [{
                "threeItems": {
                    "startItem": {
                        "firstValue": {
                            "fields": [{
                                "fieldPath": "class.textModulesData['myfield1']"
                            }]
                        }
                    },
                    "middleItem": {
                        "firstValue": {
                            "fields": [{
                                "fieldPath": "class.textModulesData['myfield2']"
                            }]
                        }
                    },
                    "endItem": {
                        "firstValue": {
                            "fields": [{
                                "fieldPath": "class.textModulesData['myfield3']"
                            }]
                        }
                    },
                }
            },{
                "threeItems": {
                    "startItem": {
                        "firstValue": {
                            "fields": [{
                                "fieldPath": "class.textModulesData['myfield4']"
                            }]
                        }
                    },
                    "middleItem": {
                        "firstValue": {
                            "fields": [{
                                "fieldPath": "class.textModulesData['myfield5']"
                            }]
                        }
                    },
                    "endItem": {
                        "firstValue": {
                            "fields": [{
                                "fieldPath": "class.textModulesData['myfield6']"
                            }]
                        }
                    },
                }
            }]
        }
    }
}
    

Java

// Rest of class
  .setTextModulesData((new ArrayList<TextModuleData>() {
    {
      add((new TextModuleData()).setHeader("Label 1")
        .setBody("Some info 1")
        .setId("myfield1"));
      add((new TextModuleData()).setHeader("Label 2")
        .setBody("Some info 1")
        .setId("myfield2"));
      add((new TextModuleData()).setHeader("Label 3")
        .setBody("Some info 3")
        .setId("myfield3"));
      add((new TextModuleData()).setHeader("Label 4")
        .setBody("Some info 4")
        .setId("myfield4"));
      add((new TextModuleData()).setHeader("Label 5")
        .setBody("Some info 5")
        .setId("myfield5"));
      add((new TextModuleData()).setHeader("Label 6")
        .setBody("Some info 5")
        .setId("myfield6"));
    }
  }))
  .setClassTemplateInfo((new ClassTemplateInfo())
    .setCardTemplateOverride((new CardTemplateOverride())
      .setCardRowTemplateInfos(new ArrayList<CardRowTemplateInfo>() {
        {
          add((new CardRowTemplateInfo()).setThreeItems((new CardRowThreeItems())
            .setStartItem((new TemplateItem()).setFirstValue((new FieldSelector()).setFields(new ArrayList<FieldReference>(){
              {
                add((new FieldReference()).setFieldPath("class.textModulesData['myfield1']"));
              }
            })))
            .setMiddleItem((new TemplateItem()).setFirstValue((new FieldSelector()).setFields(new ArrayList<FieldReference>(){
              {
                add((new FieldReference()).setFieldPath("class.textModulesData['myfield2']"));
              }
            })))
            .setEndItem((new TemplateItem()).setFirstValue((new FieldSelector()).setFields(new ArrayList<FieldReference>(){
              {
                add((new FieldReference()).setFieldPath("class.textModulesData['myfield3']"));
              }
            })))
          ));
          add((new CardRowTemplateInfo()).setThreeItems((new CardRowThreeItems())
            .setStartItem((new TemplateItem()).setFirstValue((new FieldSelector()).setFields(new ArrayList<FieldReference>(){
              {
                add((new FieldReference()).setFieldPath("class.textModulesData['myfield4']"));
              }
            })))
            .setMiddleItem((new TemplateItem()).setFirstValue((new FieldSelector()).setFields(new ArrayList<FieldReference>(){
              {
                add((new FieldReference()).setFieldPath("class.textModulesData['myfield5']"));
              }
            })))
            .setEndItem((new TemplateItem()).setFirstValue((new FieldSelector()).setFields(new ArrayList<FieldReference>(){
              {
                add((new FieldReference()).setFieldPath("class.textModulesData['myfield6']"));
              }
            })))
          ));
          }
  })))
    

PHP

// Rest of class
    $textModulesData1 = new Google_Service_Walletobjects_TextModuleData();
    $textModulesData1->setBody("Some info 1");
    $textModulesData1->setHeader("Label 1");
    $textModulesData1->setId("myfield1");

    $textModulesData2 = new Google_Service_Walletobjects_TextModuleData();
    $textModulesData2->setBody("Some info 2");
    $textModulesData2->setHeader("Label 2");
    $textModulesData2->setId("myfield2");

    $textModulesData3 = new Google_Service_Walletobjects_TextModuleData();
    $textModulesData3->setBody("Some info 3");
    $textModulesData3->setHeader("Label 3");
    $textModulesData3->setId("myfield3");

    $textModulesData4 = new Google_Service_Walletobjects_TextModuleData();
    $textModulesData4->setBody("Some info 4");
    $textModulesData4->setHeader("Label 4");
    $textModulesData4->setId("myfield4");

    $textModulesData5 = new Google_Service_Walletobjects_TextModuleData();
    $textModulesData5->setBody("Some info 5");
    $textModulesData5->setHeader("Label 5");
    $textModulesData5->setId("myfield5");

    $textModulesData6 = new Google_Service_Walletobjects_TextModuleData();
    $textModulesData6->setBody("Some info 6");
    $textModulesData6->setHeader("Label 6");
    $textModulesData6->setId("myfield6");

    $textModulesDatas = array($textModulesData1, $textModulesData2, $textModulesData3,
                  $textModulesData4, $textModulesData5, $textModulesData6);

    $startItemField = new Google_Service_Walletobjects_FieldReference();
    $startItemField->setFieldPath("class.textModulesData['myfield1']");

    $startItemFirstValue = new Google_Service_Walletobjects_FieldSelector();
    $startItemFirstValue->setFields(array($startItemField));

    $startItem = new Google_Service_Walletobjects_TemplateItem();
    $startItem->setFirstValue($startItemFirstValue);

    $middleItemField = new Google_Service_Walletobjects_FieldReference();
    $middleItemField->setFieldPath("class.textModulesData['myfield2']");

    $middleItemFirstValue = new Google_Service_Walletobjects_FieldSelector();
    $middleItemFirstValue->setFields(array($middleItemField));

    $middleItem = new Google_Service_Walletobjects_TemplateItem();
    $middleItem->setFirstValue($middleItemFirstValue);

    $endItemField = new Google_Service_Walletobjects_FieldReference();
    $endItemField->setFieldPath("class.textModulesData['myfield3']");

    $endItemFirstValue = new Google_Service_Walletobjects_FieldSelector();
    $endItemFirstValue->setFields(array($endItemField));

    $endItem = new Google_Service_Walletobjects_TemplateItem();
    $endItem->setFirstValue($endItemFirstValue);

    $cardRowTemplate = new Google_Service_Walletobjects_CardRowThreeItems();
    $cardRowTemplate->setStartItem($startItem);
    $cardRowTemplate->setMiddleItem($middleItem);
    $cardRowTemplate->setEndItem($endItem);

    $cardRowTemplateInfo1 = new Google_Service_Walletobjects_CardRowTemplateInfo();
    $cardRowTemplateInfo1->setThreeItems($cardRowTemplate);

    $startItemField2 = new Google_Service_Walletobjects_FieldReference();
    $startItemField2->setFieldPath("class.textModulesData['myfield4']");

    $startItemFirstValue2 = new Google_Service_Walletobjects_FieldSelector();
    $startItemFirstValue2->setFields(array($startItemField2));

    $startItem2 = new Google_Service_Walletobjects_TemplateItem();
    $startItem2->setFirstValue($startItemFirstValue2);

    $middleItemField2 = new Google_Service_Walletobjects_FieldReference();
    $middleItemField2->setFieldPath("class.textModulesData['myfield5']");

    $middleItemFirstValue2 = new Google_Service_Walletobjects_FieldSelector();
    $middleItemFirstValue2->setFields(array($middleItemField2));

    $middleItem2 = new Google_Service_Walletobjects_TemplateItem();
    $middleItem2->setFirstValue($middleItemFirstValue2);

    $endItemField2 = new Google_Service_Walletobjects_FieldReference();
    $endItemField2->setFieldPath("class.textModulesData['myfield6']");

    $endItemFirstValue2 = new Google_Service_Walletobjects_FieldSelector();
    $endItemFirstValue2->setFields(array($endItemField2));

    $endItem2 = new Google_Service_Walletobjects_TemplateItem();
    $endItem2->setFirstValue($endItemFirstValue2);

    $cardRowTemplate2 = new Google_Service_Walletobjects_CardRowThreeItems();
    $cardRowTemplate2->setStartItem($startItem2);
    $cardRowTemplate2->setMiddleItem($middleItem2);
    $cardRowTemplate2->setEndItem($endItem2);

    $cardRowTemplateInfo2 = new Google_Service_Walletobjects_CardRowTemplateInfo();
    $cardRowTemplateInfo2->setThreeItems($cardRowTemplate2);

    $cardTemplateOverride = new Google_Service_Walletobjects_CardTemplateOverride();
    $cardTemplateOverride->setCardRowTemplateInfos(array($cardRowTemplateInfo1,
                  $cardRowTemplateInfo2));

    $classTemplateInfo = new Google_Service_Walletobjects_ClassTemplateInfo();
    $classTemplateInfo->setCardTemplateOverride($cardTemplateOverride);

    $payload->setTextModulesData($textModulesDatas);
    $payload->setClassTemplateInfo($classTemplateInfo);
    

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

Przykład zastąpienia etykiety.

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

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

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

Kod kreskowy karty

Android

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

Internet

Elementy kodu kreskowego karty
  1. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .firstTopDetail
  2. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .secondTopDetail
  3. object.barcode.type i object.barcode.value
    lub object.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 nad i pod kodem kreskowym. Żadne z pól w tej sekcji nie jest wymagane.

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

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

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

Python

#... rest of class
    "imageModulesData": [
        {
            "mainImage": {
                "sourceUri": {
                    "uri":  "http://farm4.staticflickr.com/3738/12440799783_3dc3c20606_b.jpg",
                    "description": "Coffee"
                }
            },
            "Id": "myimage"
        }
    ],
    "classTemplateInfo": {
        "cardBarcodeSectionDetails": {
            "firstTopDetail": {
                "fieldSelector": {
                    "fields": [
                        {
                        "fieldPath": "class.imageModulesData['myimage'].mainImage"
                        }
                    ]
                }
            }
        }
    }
}
    

Java

//... rest of class
  .setImageModulesData((new ArrayList<ImageModuleData>() {
    {
      add((new ImageModuleData())
        .setId("myimage")
        .setMainImage((new Image()).setSourceUri((new ImageUri()).setDescription("Coffee beans")
          .setUri("http://farm4.staticflickr.com/3738/12440799783_3dc3c20606_b.jpg"))));
        }
      }))
      .setClassTemplateInfo((new ClassTemplateInfo())
        .setCardBarcodeSectionDetails((new CardBarcodeSectionDetails())
          .setFirstTopDetail((new BarcodeSectionDetail())
            .setFieldSelector((new FieldSelector())
              .setFields((new ArrayList<FieldReference>(){
                {
                  add((new FieldReference()).setFieldPath("class.imageModulesData['myimage'].mainImage"));
                }
            })))))
      }
    

PHP

//... rest of class
    $imageUri = new Google_Service_Walletobjects_ImageUri();
    $imageUri->setUri("https://farm8.staticflickr.com/7340/11177041185_a61a7f2139_o.jpg");
    $imageUri->setDescription("Baconrista flights image");
    $image = new Google_Service_Walletobjects_Image();
    $image->setSourceUri($imageUri);
    $imageModulesData = new Google_Service_Walletobjects_ImageModuleData();
    $imageModulesData->setMainImage($image);
            $imageModulesData->setId("myimage");

    $cardBarcodeFieldReference = new Google_Service_Walletobjects_FieldReference();
    $cardBarcodeFieldReference->setFieldPath("class.imageModulesData['myimage'].mainImage");

    $cardBarcodeFieldSelector = new Google_Service_Walletobjects_FieldSelector();
    $cardBarcodeFieldSelector->setFields(array($cardBarcodeFieldReference));

    $cardBarcodeDetail = new Google_Service_Walletobjects_BarcodeSectionDetail();
    $cardBarcodeDetail->setFieldSelector($cardBarcodeFieldSelector);

    $cardBarcodeSectionDetails = new Google_Service_Walletobjects_CardBarcodeSectionDetails();
    $cardBarcodeSectionDetails->setFirstTopDetail($cardBarcodeDetail);

    $classTemplateInfo = new Google_Service_Walletobjects_ClassTemplateInfo();
    $classTemplateInfo->setCardBarcodeSectionDetails($cardBarcodeSectionDetails);

    $payload->setClassTemplateInfo($classTemplateInfo);
            $payload->setImageModuleData($imageModulesData);
    

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

Przykład zastąpienia kodu kreskowego karty.

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

Szablon szczegółów

Android

Sekcje szablonu szczegółów
  • Plan podróży wieloetapowy
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[0].item
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[1].item
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[2].item
  • ...

Internet

Sekcje szablonu szczegółów
  • Plan podróży wieloetapowy
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[0].item
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[1].item
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[2].item
  • ...

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

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

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

Python

//... rest of class
   "linksModuleData": {
        "uris": [
            {
                "uri": "http://maps.google.com/",
                "description": "Nearby Locations",
                "id":"mylink"
            }
        ]
    },
   "classTemplateInfo": {
        "detailsTemplateOverride": {
            "detailsItemInfos": [
                {
                    "item":{
                        "firstValue": {
                            "fields": [{
                                "fieldPath": "class.linksModuleData.uris['mylink']"
                            }]
                        }
                    }
                }
            ]
        }
     }
//... rest of class
    

Java

 //... rest of class
  .setLinksModuleData((new ArrayList<LinksModuleData>() {
    {
      add((new LinksModuleData()).setDescription("Nearby Locations")
        .setUri("http://maps.google.com/")
        .setId("mylink"));
      }))
      .setClassTemplateInfo((new ClassTemplateInfo())
        .setDetailsTemplateOverride((new DetailsTemplateOverride())
          .setDetailsItemInfos(new ArrayList<DetailsItemInfo>(){
            {
              add((new DetailsItemInfo())
                .setItem((new TemplateItem()).setFirstValue((new FieldSelector()).setFields(new ArrayList<FieldReference>(){
                  {
                    add((new FieldReference()).setFieldPath("class.linksModuleData.uris['mylink']"));
                  }
                }))));
              }
            }))
//... rest of class
    

PHP



    //... rest of class building
    $locationUri = new Google_Service_Walletobjects_Uri();
    $locationUri->setUri("http://maps.google.com/");
    $locationUri->setDescription("Nearby Locations");
    $locationUri->setId("mylink");

    $linksModuleData = new Google_Service_Walletobjects_LinksModuleData();
    $linksModuleData->setUris(array($locationUri));

    $detailItemFieldReference = new Google_Service_Walletobjects_FieldReference();
    $detailItemFieldReference->setFieldPath("class.linksModuleData.uris['mylink']");
    $detailItemFieldSelector = new Google_Service_Walletobjects_FieldSelector();
    $detailItemFieldSelector->setFields(array($detailItemFieldReference));

    $detailItem = new Google_Service_Walletobjects_TemplateItem();
    $detailItem->setFirstValue($detailItemFieldSelector);

    $detailsItemInfo = new Google_Service_Walletobjects_DetailsItemInfo();
    $detailsItemInfo->setItem($detailItem);

    $cardDetailsTemplateOverride = new Google_Service_Walletobjects_DetailsTemplateOverride();
    $cardDetailsTemplateOverride->setDetailsItemInfos(array($detailsItemInfo));

    $classTemplateInfo = new Google_Service_Walletobjects_ClassTemplateInfo();
    $classTemplateInfo->setDetailsTemplateOverride($cardDetailsTemplateOverride);

    $payload->setClassTemplateInfo($classTemplateInfo);
    $payload->setLinksModuleData($linksModuleData);
    //... rest of class
    

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

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

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

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

Jeśli przejazd ma wiele etapów, u góry sekcji wyświetla się prosty plan podróży, 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 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
    , object.ticketLegs[i].ticketSeat.seatAssignment
    , object.ticketLegs[i].ticketSeats[*].seat
    , object.ticketLegs[i].ticketSeats[*].seatAssignment
    lub BRAK KONKRETNYCH MIEJSCA
  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: PLATFORMĘ
    lub PRZENIEŚ NA: class.customPlatformLabel
    lub PRZENIEŚ (jeśli nie zdefiniowano żadnej platformy)
  13. object.ticketLegs[i+1].platform

Szablon listy

Lista elementów szablonu
  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. <# kart> (pogrupowanych)

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

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

Python


#... rest of class definition
   "classTemplateInfo": {
        "listTemplateOverride":{
            "firstRowOption": {
                "fieldOption":{
                    "fields": [{
                        "fieldPath": "object.validTimeInterval.end"
                    }]
                }
            }
        }
   }
}
    

Java

//... rest of class
  .setClassTemplateInfo((new ClassTemplateInfo())
    .setListTemplateOverride((new ListTemplateOverride())
      .setFirstRowOption((new FirstRowOption())
        .setFieldOption((new FieldSelector()).setFields(new ArrayList<FieldReference>(){
          {
            add((new FieldReference()).setFieldPath("object.validTimeInterval.end"));
          }
        }))))
//... rest of class
    

PHP

    //... rest of class
    $fieldReference = new Google_Service_Walletobjects_FieldReference();
    $fieldReference->setFieldPath("object.validTimeInterval.end");

    $fieldOption = new Google_Service_Walletobjects_FieldSelector();
    $fieldOption->setFields(array($fieldReference));

    $firstRowOption = new Google_Service_Walletobjects_FirstRowOption();
    $firstRowOption->setFieldOption($fieldOption);

    $listTemplateOverride = new Google_Service_Walletobjects_ListTemplateOverride();
    $listTemplateOverride->setFirstRowOption($firstRowOption);

    $classTemplateInfo = new Google_Service_Walletobjects_ClassTemplateInfo();
    $classTemplateInfo->setListTemplateOverride($listTemplateOverride);

    $payload->setClassTemplateInfo($classTemplateInfo);
    //... rest of class
    

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

Przykład zastąpienia listy.

Pierwszy wiersz może być określony za pomocą selektora pól 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 3 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 obsługiwane języki.

Odwołania do pól

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

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

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

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

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

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

  • object.imageModulesData[0].id = my-first-id
  • object.imageModulesData[1].id = my-second-id
  • class.detailsTemplateOverride.detailsItemInfos[0].item.firstValue.fields[0].fieldPath = object.imageModulesData[‘my-second-id’]
  • class.detailsTemplateOverride.detailsItemInfos[1].item.firstValue.fields[0].fieldPath = object.imageModulesData[0]

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

Domyślny szablon

Android

Domyślne elementy szablonu
  1. class.logo
  2. class.localizedIssuerName
    lub class.issuerName
  3. Zobacz tytuł karty
  4. WYJAZD lub WAŻNY OD
  5. object.ticketLeg.departureDateTime (data i godzina)
    lub object.validTimeInterval.start.date
  6. PRZYBYWA DO lub JEST WAŻNA 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.type i object.barcode.value
    lub object.ticketNumber
  17. object.barcode.alternateText
  18. object.hexBackgroundColor
    lub class.hexBackgroundColor
  19. Plan podróży wieloetapowy
  20. NUMER BILETU lub class.customTicketNumberLabel
  21. object.ticketNumber
  22. STAN BILETU
  23. object.ticketStatus lub object.customTicketStatus
  24. WYJAZD
  25. object.ticketLeg.departureDateTime
  26. PRZYLOT
  27. object.ticketLeg.arrivalDateTime
  28. NAZWA BEZPŁATNA lub class.customFareNameLabel
  29. object.ticketLeg.fareName
  30. PLATFORMA lub class.customPlatformLabel
  31. object.ticketLeg.platform
  32. STREFA lub class.customZoneLabel
  33. object.ticketLeg.zone
  34. KLASA FARE 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 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 POTWIERDZENIA
    lub class.customPurchaseReceiptNumberLabel
  47. object.purchaseDetails.purchaseReceiptNumber
  48. DATA ZAKUPU
  49. object.purchaseDetails.purchaseDateTime
  50. IDENTYFIKATOR KONTA
  51. object.purchaseDetails.accountId
  52. KOD POTWIERDZANIA
    lub class.customConfirmationCodeLabel
  53. object.purchaseDetails.confirmationCode
  54. FACEVALUE lub class.customPurchaseFaceValueLabel
  55. object.purchaseDetails.ticketCost.faceValue
  56. PRICE lub class.customPurchasePriceLabel
  57. object.purchaseDetails.ticketCost.purchasePrice
  58. WIADOMOŚĆ RABATU
    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

Internet

Domyślne elementy szablonu
  1. class.logo
  2. class.localizedIssuerName
    lub class.issuerName
  3. Zobacz tytuł karty
  4. WYJAZD lub WAŻNY OD
  5. object.ticketLeg.departureDateTime (data i godzina)
    lub object.validTimeInterval.start.date
  6. PRZYBYWA DO lub JEST WAŻNA 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.type i object.barcode.value
    lub object.ticketNumber
  17. object.barcode.alternateText
  18. object.hexBackgroundColor
    lub class.hexBackgroundColor
  19. Plan podróży wieloetapowy
  20. NUMER BILETU lub class.customTicketNumberLabel
  21. object.ticketNumber
  22. STAN BILETU
  23. object.ticketStatus lub object.customTicketStatus
  24. WYJAZD
  25. object.ticketLeg.departureDateTime
  26. PRZYLOT
  27. object.ticketLeg.arrivalDateTime
  28. NAZWA BEZPŁATNA lub class.customFareNameLabel
  29. object.ticketLeg.fareName
  30. PLATFORMA lub class.customPlatformLabel
  31. object.ticketLeg.platform
  32. STREFA lub class.customZoneLabel
  33. object.ticketLeg.zone
  34. KLASA FARE 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 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 POTWIERDZENIA
    lub class.customPurchaseReceiptNumberLabel
  47. object.purchaseDetails.purchaseReceiptNumber
  48. DATA ZAKUPU
  49. object.purchaseDetails.purchaseDateTime
  50. IDENTYFIKATOR KONTA
  51. object.purchaseDetails.accountId
  52. KOD POTWIERDZANIA
    lub class.customConfirmationCodeLabel
  53. object.purchaseDetails.confirmationCode
  54. FACEVALUE lub class.customPurchaseFaceValueLabel
  55. object.purchaseDetails.ticketCost.faceValue
  56. PRICE lub class.customPurchasePriceLabel
  57. object.purchaseDetails.ticketCost.purchasePrice
  58. WIADOMOŚĆ RABATU
    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 możemy zagwarantować kolejności wiadomości. Jeśli potrzebujesz więcej niż 20 wiadomości na dowolnym poziomie lub gwarancji dla dowolnych zamówień, zastąp domyślny szablon.

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

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

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

Domyślne elementy szablonu listy
  1. (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. <# kart> (pogrupowanych)