Modello carta d'imbarco

Le carte d'imbarco supportano il rendering dei modelli. Se non viene definito alcun modello, viene utilizzato quello predefinito.

Definizione del modello

Un modello di tessera viene definito a livello di classe e viene utilizzato per visualizzare qualsiasi oggetto associato alla classe. Il modello definisce quali campi visualizzare nelle diverse sezioni della tessera.

Il modello è diviso nelle seguenti sezioni:

Android

Panoramica dei modelli

Pagine web

Panoramica dei modelli

Titolo della scheda

Android

Elementi del titolo della scheda Titolo della scheda predefinito
  1. class.flightHeader.carrier.airlineLogo
  2. class.flightHeader.carrier.airlineName
    o class.localizedIssuerName
    o class.issuerName
  3. (class.flightHeader.carrier.carrierIataCode
    o class.flightHeader.carrier.carrierIcaoCode)
    e class.flightHeader.flightNumber
  4. città dell'aeroporto (derivata da class.origin.airportIataCode)
    o class.origin.airportNameOverride
  5. class.origin.airportIataCode
  6. città dell'aeroporto (derivata da class.destination.airportIataCode)
    o class.destination.airportNameOverride
  7. class.destination.airportIataCode
  8. object.hexBackgroundColor
    o class.hexBackgroundColor

Titolo scheda con logo largo
  1. class.flightHeader.wideAirlineLogo
  2. (class.flightHeader.carrier.carrierIataCode
    o class.flightHeader.carrier.carrierIcaoCode)
    e class.flightHeader.flightNumber
  3. città dell'aeroporto (derivata da class.origin.airportIataCode)
    o class.origin.airportNameOverride
  4. class.origin.airportIataCode
  5. città dell'aeroporto (derivata da class.destination.airportIataCode)
    o class.destination.airportNameOverride
  6. class.destination.airportIataCode
  7. object.hexBackgroundColor
    o class.hexBackgroundColor

Pagine web

Elementi del titolo della scheda Titolo della scheda predefinito
  1. class.flightHeader.carrier.airlineLogo
  2. class.flightHeader.carrier.airlineName
    o class.localizedIssuerName
    o class.issuerName
  3. (class.flightHeader.carrier.carrierIataCode
    o class.flightHeader.carrier.carrierIcaoCode)
    e class.flightHeader.flightNumber
  4. città dell'aeroporto (derivata da class.origin.airportIataCode)
    o class.origin.airportNameOverride
  5. class.origin.airportIataCode
  6. città dell'aeroporto (derivata da class.destination.airportIataCode)
    o class.destination.airportNameOverride
  7. class.destination.airportIataCode
  8. object.hexBackgroundColor
    o class.hexBackgroundColor

Titolo scheda con logo largo
  1. class.flightHeader.wideAirlineLogo
  2. (class.flightHeader.carrier.carrierIataCode
    o class.flightHeader.carrier.carrierIcaoCode)
    e class.flightHeader.flightNumber
  3. città dell'aeroporto (derivata da class.origin.airportIataCode)
    o class.origin.airportNameOverride
  4. class.origin.airportIataCode
  5. città dell'aeroporto (derivata da class.destination.airportIataCode)
    o class.destination.airportNameOverride
  6. class.destination.airportIataCode
  7. object.hexBackgroundColor
    o class.hexBackgroundColor

La sezione del titolo della scheda mostra il logo, il nome della compagnia aerea e il riepilogo del volo. Tutti questi tre elementi sono obbligatori e né i riferimenti ai campi utilizzati per compilarli né la loro posizione possono essere modificati.

Se class.origin.airportNameOverride o class.detination.airportNameOverride non sono impostati, il nome della città dell'aeroporto viene compilato automaticamente con la città associata al codice IATA rispettivamente in class.origin.airportIataCode e class.destination.airportIataCode.

Se è impostato il campo del logo largo, sui dispositivi Android l'intestazione del modello predefinita con il logo e il nome dell'emittente viene sostituita con il logo largo.

Segui le linee guida per l'immagine del logo largo quando crei il logo dell'intestazione larga per visualizzare in modo ottimale l'immagine sulle tue tessere.

Modello di scheda

Android

Panoramica dei modelli

Pagine web

Panoramica dei modelli

La sezione del modello di scheda viene utilizzata per visualizzare le righe aggiuntive. Queste righe possono contenere campi di dati strutturati basati su testo o campi di moduli di testo.

Puoi specificare il numero di righe che definiscono il numero di oggetti nell'elenco class.classTemplateInfo.cardTemplateOverride.cardRowTemplateInfos[]. L'elenco richiede almeno un elemento e ti consigliamo di utilizzarne al massimo due. Ogni elemento deve essere di uno dei seguenti tipi:

  • oneItem, che accetta un solo elemento:
    • item
  • twoItems, che accetta due elementi:
    • startItem
    • endItem
  • threeItems, che accetta tre elementi:
    • startItem
    • middleItem
    • endItem

Ogni elemento può essere definito come un singolo selettore di campo (.firstValue), due selettori di campi (.firstValue e .secondValue) o un elemento predefinito (.predefinedItem). Vengono visualizzati entrambi i valori del campo selezionato e le relative etichette. Quando definisci due selettori di campi, i valori dei campi selezionati vengono visualizzati con un separatore "/". Lo stesso vale per le etichette dei campi selezionati. Gli elementi predefiniti vengono utilizzati per definire un rendering più complesso.

Il seguente esempio di codice mostra come eseguire l'override delle sezioni delle righe delle schede del modello di scheda per specificare due righe. Ogni riga include tre elementi che fanno riferimento a sei campi personalizzati textModuleData a livello di classe e le relative intestazioni sotto forma di etichette:

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

Il codice crea una tessera con il seguente formato di sezione di modello di codice:

Esempio di sostituzione di un&#39;etichetta.

Se un elemento è vuoto, non viene visualizzato. Per maggiori dettagli, consulta Riferimenti dei campi. Se tutti gli elementi in una riga sono vuoti, la riga non viene visualizzata. Se alcuni elementi in una riga sono vuoti, ma non tutti, quelli non vuoti vengono riorganizzati e visualizzati come una riga con meno elementi.

Se non esegui l'override del modello di scheda, vengono utilizzati il numero predefinito di righe, il numero predefinito di elementi e i riferimenti di campo predefiniti. Per maggiori dettagli, vedi Modello predefinito.

Dopo aver definito un'immagine hero, questa può apparire dopo la prima riga, se sono presenti più righe nell'elenco cardRowTemplateInfos o sopra la riga, se ne esiste solo una.

Codice a barre della carta

Android

Elementi codice a barre della carta
  1. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .firstTopDetail
  2. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .secondTopDetail
  3. object.barcode.type e object.barcode.value
    o object.reservationInfo.confirmationCode
  4. object.barcode.alternateText
  5. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .firstBottomDetail

Pagine web

Elementi codice a barre della carta
  1. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .firstTopDetail
  2. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .secondTopDetail
  3. object.barcode.type e object.barcode.value
    o object.reservationInfo.confirmationCode
  4. object.barcode.alternateText
  5. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .firstBottomDetail

La sezione del codice a barre della carta viene utilizzata per visualizzare testo o immagini extra sopra e sotto il codice a barre. Nessuno dei campi di questa sezione è obbligatorio.

Sono disponibili tre selettori di campo che possono essere utilizzati per definire due campi affiancati sopra e uno sotto il codice a barre. Questi vengono visualizzati senza etichette e possono essere campi di dati strutturati basati su testo, campi modulo di testo o campi modulo immagine. Se utilizzi immagini, queste devono rispettare le linee guida per il brand.

Il codice a barre è definito da un tipo e un valore. Per un elenco dei tipi di codici a barre supportati, consulta la sezione Riferimento. Inoltre, un testo può essere mostrato proprio sotto il codice a barre. Questo testo può semplificare, tra le altre cose, la scansione dei codici a barre.

Il seguente esempio di codice mostra come eseguire l'override della sezione del codice a barre di una tessera per visualizzare un'immagine sopra il codice a barre:

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

Il codice crea una tessera con il seguente formato di sezione di codici a barre:

Esempio di sostituzione del codice a barre della carta.

Se non sostituisci la sezione del codice a barre, vengono utilizzati i campi predefiniti per i codici a barre. Per maggiori informazioni, vedi Modello predefinito.

Modello di dettagli

Android

Sezioni dei dettagli del modello
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[0].item
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[1].item
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[2].item
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[3].item
  • ...

Pagine web

Sezioni dei dettagli del modello
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[0].item
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[1].item
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[2].item
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[3].item
  • ...

La sezione del modello di dettagli è un elenco di elementi class.classTemplateInfo.detailsTemplateOverride.detailsItemInfos[]. Gli elementi possono contenere qualsiasi tipo di campi di dati strutturati, di modulo di testo, di modulo di link, di modulo di immagine o messaggi.

Ogni elemento può essere definito come un singolo selettore di campo (.firstValue), due selettori di campi (.firstValue e .secondValue) o come elemento predefinito (.predefinedItem). Vengono visualizzati entrambi i valori del campo selezionato e le relative etichette. Quando definisci due selettori di campi, i valori dei campi selezionati vengono visualizzati con un separatore "/". Lo stesso vale per le etichette dei campi selezionati. Gli elementi predefiniti servono per definire un rendering più complesso. I campi del modulo Immagine vengono visualizzati a larghezza intera senza etichetta.

Il seguente esempio di codice mostra come eseguire l'override della sezione dei dettagli della tessera per mostrare un singolo campo linksModuleData con la relativa etichetta:

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
    

Il codice crea una tessera con il seguente formato di sezione dei dettagli:

Esempio di sostituzione dei dettagli.

Se un elemento è vuoto, non viene visualizzato. Per maggiori dettagli, consulta Riferimenti dei campi.

Se non esegui l'override del modello di dettagli, viene visualizzato l'elenco predefinito dei campi di riferimento nell'ordine predefinito. Per maggiori informazioni, vedi Modello predefinito.

Modello elenco

Elenca gli elementi del modello
  1. class.classTemplateInfo.listTemplateOverride
      .firstRowOption.fieldOption.fields[]
  2. class.localScheduledDepartureDateTime
    (solo data) (raggruppato)
    o class.classTemplateInfo.listTemplateOverride
      .secondRowOption.fields[]
  3. class.flightHeader.carrier.airlineLogo
  4. object.hexBackgroundColor
    o class.hexBackgroundColor
  5. <# tessere> (raggruppate)

La sezione del modello di elenco viene utilizzata per selezionare il campo da mostrare nella visualizzazione "Tessere" dell'app Google Wallet. La tessera è rappresentata nell'elenco con il logo, il colore di sfondo e tre righe.

Il seguente esempio di codice mostra come eseguire l'override del modello di elenco di una tessera per mostrare il campo della data di scadenza dell'oggetto di un singolo pass nella prima riga del modello di elenco:

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
    

Il codice crea una tessera con la seguente rappresentazione del modello di elenco:

Esempio di sostituzione di un elenco.

Le tre righe possono essere definite con un selettore di campi. I campi vengono visualizzati senza etichetta. Per i pass raggruppati, la seconda riga mostra sempre la data di partenza locale programmata e la terza riga mostra sempre il numero di tessere raggruppate.

Riferimenti dei campi

I riferimenti ai campi vengono utilizzati in diverse parti del modello nel modulo class.classTemplateInfo.*.fields[]. Un riferimento di campo contiene un elenco di percorsi di campi di dati strutturati, di modulo di testo, di modulo di link e di moduli di immagine o di messaggi.

Non tutti i tipi di percorsi sono consentiti in ogni riferimento di campo. Ad esempio, alcuni riferimenti a campi consentono solo i percorsi ai campi di dati strutturati basati su testo o ai campi dei moduli di testo. I campi strutturati basati su testo sono campi di dati strutturati di tipo stringa, stringa localizzata, data o denaro.

L'elenco può essere utilizzato per implementare una logica di fallback. Ciò significa che se il primo percorso nell'elenco si risolve in un campo vuoto, viene valutato il percorso successivo. La logica di fallback è rivolta principalmente ai campi di dati strutturati basati su testo o ai campi dei moduli di testo. Non combinare tipi di campi diversi nello stesso elenco. Utilizza la logica di fallback con cautela e solo in situazioni specifiche quando prevedi un pattern coerente di campi che esistono in alcuni oggetti e non in altri. Il più delle volte è più facile creare classi separate per casi d'uso distinti.

Se tutti i percorsi in un elenco di riferimenti di campi si risolvono in campi vuoti, l'elemento che utilizza il riferimento del campo non viene visualizzato. Se vuoi che l'elemento che utilizza il riferimento del campo sia sempre presente, assicurati che almeno un percorso non sia vuoto. Ti consigliamo di impostare un campo su un carattere speciale, ad esempio "-", per rappresentare un valore nullo, anche se alcuni campi consentono stringhe con solo uno spazio.

Per fare riferimento a un campo contenuto in un elenco, puoi utilizzare l'indice del campo nell'elenco o, nella maggior parte dei casi, puoi utilizzare un ID di riferimento. Gli elementi di un elenco a cui si può fare riferimento tramite ID hanno un campo .id. Ti consigliamo di utilizzare un ID di riferimento anziché l'indice del campo nell'elenco, se disponibile.

Ecco un esempio di come fare riferimento ai campi contenuti in un elenco.

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

In questo caso, il primo elemento nella sezione dei dettagli della tessera è la seconda immagine dichiarata nell'oggetto. Il secondo elemento nella sezione dei dettagli della tessera è la prima immagine dichiarata nell'oggetto.

Modello predefinito

Android

Elementi del modello predefiniti
  1. class.flightHeader.carrier.airlineLogo
  2. class.flightHeader.carrier.airlineName
    o class.localizedIssuerName
    o class.issuerName
  3. (class.flightHeader.carrier.carrierIataCode
    o class.flightHeader.carrier.carrierIcaoCode)
    e class.flightHeader.flightNumber
  4. città dell'aeroporto (derivata da class.origin.airportIataCode)
    o class.origin.airportNameOverride
  5. class.origin.airportIataCode
  6. città dell'aeroporto (derivata da class.destination.airportIataCode)
    o class.destination.airportNameOverride
  7. class.destination.airportIataCode
  8. TERMINALE
  9. class.origin.terminal
  10. GATE
  11. class.origin.gate
  12. CABIN (predefinita) o CLASS o TIER (a seconda di
    class.boardingAndSeatingPolicy.SeatClassPolicy)
  13. object.boardingAndSeatingInfo.SeatClass
  14. INIZIO
    o CHIUSURA DEL CANCELLO
    o PARTENZA
  15. class.localBoardingDateTime
    o class.localGateClosingDateTime
    o class.localEstimatedOrActualDepartureDateTime
    o class.localScheduledDepartureDateTime
  16. PASSEGGERO
  17. object.passengerName
  18. ZONE (predefinita) o GROUP (dipende da
    class.boardingAndSeatingPolicy.boardingPolicy)
  19. object.boardingAndSeatingInfo.boardingGroup
  20. SEAT
  21. object.boardingAndSeatingInfo.seatNumber
    o object.boardingAndSeatingInfo.seatAssignment
  22. object.securityProgramLogo
  23. object.boardingAndSeatingInfo.boardingPrivilegeImage
  24. object.barcode.type e object.barcode.value
    o object.reservationInfo.confirmationCode
  25. object.barcode.alternateText
  26. class.flightHeader.carrier.airlineAllianceLogo
  27. object.hexBackgroundColor
    o class.hexBackgroundColor
  28. POSIZIONE
  29. object.boardingAndSeatingInfo.boardingPosition
  30. SEQUENCE
  31. object.boardingAndSeatingInfo.sequenceNumber
  32. PORTA DI PONDO
  33. object.boardingAndSeatingInfo.boardingDoor
  34. VOCE NUMERO
  35. (class.flightHeader.operatingCarrier.carrierIataCode
    o class.flightHeader.operatingCarrier.carrierIcaoCode)
    e class.flightHeader.operatingFlightNumber
    e class.flightHeader.operatingCarrier.airlineName
  36. NUMERO DI CONFERMA
  37. object.reservationInfo.confirmationCode
  38. NUMERO BIGLIETTO
  39. object.reservationInfo.eticketNumber
  40. NUMERO FREQUENTI DEL VOLANTE
  41. object.reservationInfo
      .frequentFlyerInfo.frequentFlyerNumber
    e object.reservationInfo
      .frequentFlyerInfo.frequentFlyerProgramName
  42. CHIUSURA CANCELLO
  43. class.localGateClosingDateTime
  44. TEMPO DI PARTENZA PROGRAMMATO
  45. class.localScheduledDepartureDateTime
  46. TEMPO DI PARTENZA STIMATO
  47. class.localEstimatedOrActualDepartureDateTime
  48. ORA DI ARRIVO PROGRAMMATA
  49. class.localScheduledArrivalDateTime
  50. TEMPO DI ARRIVO STIMATO
  51. class.localEstimatedOrActualArrivalDateTime
  52. TERMINALE DI ARRIVO
  53. class.destination.terminal
  54. CANCELLO DI ARRIVO
  55. class.destination.gate
  56. class.imageModulesData[0].mainImage
  57. object.imageModulesData[0].mainImage
  58. class.messages[].header
  59. class.messages[].body
  60. object.messages[].header
  61. object.messages[].body
  62. class.textModulesData[0..9].header
  63. class.textModulesData[0..9].body
  64. object.textModulesData[0..9].header
  65. object.textModulesData[0..9].body
  66. class.linksModuleData.uris[].description
  67. object.linksModuleData.uris[].description

Pagine web

Elementi del modello predefiniti
  1. class.flightHeader.carrier.airlineLogo
  2. class.flightHeader.carrier.airlineName
    o class.localizedIssuerName
    o class.issuerName
  3. (class.flightHeader.carrier.carrierIataCode
    o class.flightHeader.carrier.carrierIcaoCode)
    e class.flightHeader.flightNumber
  4. città dell'aeroporto (derivata da class.origin.airportIataCode)
    o class.origin.airportNameOverride
  5. class.origin.airportIataCode
  6. città dell'aeroporto (derivata da class.destination.airportIataCode)
    o class.destination.airportNameOverride
  7. class.destination.airportIataCode
  8. TERMINALE
  9. class.origin.terminal
  10. GATE
  11. class.origin.gate
  12. CABIN (predefinita) o CLASS o TIER (a seconda di
    class.boardingAndSeatingPolicy.SeatClassPolicy)
  13. object.boardingAndSeatingInfo.SeatClass
  14. INIZIO
    o CHIUSURA DEL CANCELLO
    o PARTENZA
  15. class.localBoardingDateTime
    o class.localGateClosingDateTime
    o class.localEstimatedOrActualDepartureDateTime
    o class.localScheduledDepartureDateTime
  16. PASSEGGERO
  17. object.passengerName
  18. ZONE (predefinita) o GROUP (dipende da
    class.boardingAndSeatingPolicy.boardingPolicy)
  19. object.boardingAndSeatingInfo.boardingGroup
  20. SEAT
  21. object.boardingAndSeatingInfo.seatNumber
    o object.boardingAndSeatingInfo.seatAssignment
  22. object.securityProgramLogo
  23. object.boardingAndSeatingInfo.boardingPrivilegeImage
  24. object.barcode.type e object.barcode.value
    o object.reservationInfo.confirmationCode
  25. object.barcode.alternateText
  26. class.flightHeader.carrier.airlineAllianceLogo
  27. object.hexBackgroundColor
    o class.hexBackgroundColor
  28. POSIZIONE
  29. object.boardingAndSeatingInfo.boardingPosition
  30. SEQUENCE
  31. object.boardingAndSeatingInfo.sequenceNumber
  32. PORTA DI PONDO
  33. object.boardingAndSeatingInfo.boardingDoor
  34. VOCE NUMERO
  35. (class.flightHeader.operatingCarrier.carrierIataCode
    o class.flightHeader.operatingCarrier.carrierIcaoCode)
    e class.flightHeader.operatingFlightNumber
    e class.flightHeader.operatingCarrier.airlineName
  36. NUMERO DI CONFERMA
  37. object.reservationInfo.confirmationCode
  38. NUMERO BIGLIETTO
  39. object.reservationInfo.eticketNumber
  40. NUMERO FREQUENTI DEL VOLANTE
  41. object.reservationInfo
      .frequentFlyerInfo.frequentFlyerNumber
    e object.reservationInfo
      .frequentFlyerInfo.frequentFlyerProgramName
  42. CHIUSURA CANCELLO
  43. class.localGateClosingDateTime
  44. TEMPO DI PARTENZA PROGRAMMATO
  45. class.localScheduledDepartureDateTime
  46. TEMPO DI PARTENZA STIMATO
  47. class.localEstimatedOrActualDepartureDateTime
  48. ORA DI ARRIVO PROGRAMMATA
  49. class.localScheduledArrivalDateTime
  50. TEMPO DI ARRIVO STIMATO
  51. class.localEstimatedOrActualArrivalDateTime
  52. TERMINALE DI ARRIVO
  53. class.destination.terminal
  54. CANCELLO DI ARRIVO
  55. class.destination.gate
  56. class.imageModulesData[0].mainImage
  57. object.imageModulesData[0].mainImage
  58. class.messages[].header
  59. class.messages[].body
  60. object.messages[].header
  61. object.messages[].body
  62. class.textModulesData[0..9].header
  63. class.textModulesData[0..9].body
  64. object.textModulesData[0..9].header
  65. object.textModulesData[0..9].body
  66. class.linksModuleData.uris[].description
  67. object.linksModuleData.uris[].description

Per impostazione predefinita, la sezione dei dettagli mostra anche object.boardingAndSeatingInfo.boardingGroup, object.boardingAndSeatingInfo.seatClass e object.boardingAndSeatingInfo.seatNumber se la sezione delle schede viene ignorata e questi campi non sono più presenti nella sezione delle schede.

Per i campi del modulo immagine, vengono mostrati un solo campo modulo immagine della classe e un solo campo modulo immagine dell'oggetto. Se hai bisogno di più di un campo del modulo dell'immagine in entrambi i livelli, sostituisci il modello predefinito.

Per i campi modulo di testo, vengono mostrati solo un massimo di 20 campi modulo di testo della classe e 20 campi modulo di testo dell'oggetto. I campi vengono visualizzati nello stesso ordine in cui sono definiti nell'array. Se hai bisogno di più di 20 campi di moduli di testo in entrambi i livelli, sostituisci il modello predefinito.

Per i messaggi, mostriamo solo un massimo di 20 messaggi della classe e 20 messaggi dell'oggetto. Non garantiamo l'ordine dei messaggi. Se hai bisogno di più di 20 messaggi in entrambi i livelli o di una garanzia per eventuali ordini, sostituisci il modello predefinito.

Per il campo del modulo Link, non esiste un limite al numero di URI che puoi definire. Gli URI vengono visualizzati raggruppati nel seguente ordine per ogni livello (classe o oggetto):

  1. Coordinate mappa
  2. Numeri di telefono
  3. Indirizzi email.
  4. Pagine web

Per ciascun gruppo, gli URI vengono visualizzati nello stesso ordine in cui sono definiti nell'array. Se hai bisogno di un ordine diverso, sostituisci il modello predefinito.

Elementi del modello di elenco predefinito
  1. class.origin.airportIataCode
    e class.destination.airportIataCode
  2. class.localScheduledDepartureDateTime
    (solo data)
  3. class.flightHeader.carrier.airlineLogo
  4. object.hexBackgroundColor
    o class.hexBackgroundColor
  5. <# tessere> (raggruppate)