Plantilla de tarjeta de embarque

Las tarjetas de embarque admiten la renderización de plantillas. Si no se define ninguna plantilla, se usa la predeterminada.

Definición de plantilla

Una plantilla de pase se define a nivel de la clase y se usa para mostrar cualquier objeto asociado con la clase. La plantilla define qué campos mostrar en diferentes secciones del pase.

La plantilla se divide en las siguientes secciones:

Android

Descripción general de la plantilla

Páginas web

Descripción general de la plantilla

Título de la tarjeta

Android

Elementos del título de la tarjeta Título predeterminado de la tarjeta
  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)
    y class.flightHeader.flightNumber
  4. ciudad del aeropuerto (derivada de class.origin.airportIataCode)
    o class.origin.airportNameOverride
  5. class.origin.airportIataCode
  6. ciudad del aeropuerto (derivada de class.destination.airportIataCode)
    o class.destination.airportNameOverride
  7. class.destination.airportIataCode
  8. object.hexBackgroundColor
    o class.hexBackgroundColor

Título de la tarjeta con logotipo amplio
  1. class.flightHeader.wideAirlineLogo
  2. (class.flightHeader.carrier.carrierIataCode
    o class.flightHeader.carrier.carrierIcaoCode)
    y class.flightHeader.flightNumber
  3. ciudad del aeropuerto (derivada de class.origin.airportIataCode)
    o class.origin.airportNameOverride
  4. class.origin.airportIataCode
  5. ciudad del aeropuerto (derivada de class.destination.airportIataCode)
    o class.destination.airportNameOverride
  6. class.destination.airportIataCode
  7. object.hexBackgroundColor
    o class.hexBackgroundColor

Páginas web

Elementos del título de la tarjeta Título predeterminado de la tarjeta
  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)
    y class.flightHeader.flightNumber
  4. ciudad del aeropuerto (derivada de class.origin.airportIataCode)
    o class.origin.airportNameOverride
  5. class.origin.airportIataCode
  6. ciudad del aeropuerto (derivada de class.destination.airportIataCode)
    o class.destination.airportNameOverride
  7. class.destination.airportIataCode
  8. object.hexBackgroundColor
    o class.hexBackgroundColor

Título de la tarjeta con logotipo amplio
  1. class.flightHeader.wideAirlineLogo
  2. (class.flightHeader.carrier.carrierIataCode
    o class.flightHeader.carrier.carrierIcaoCode)
    y class.flightHeader.flightNumber
  3. ciudad del aeropuerto (derivada de class.origin.airportIataCode)
    o class.origin.airportNameOverride
  4. class.origin.airportIataCode
  5. ciudad del aeropuerto (derivada de class.destination.airportIataCode)
    o class.destination.airportNameOverride
  6. class.destination.airportIataCode
  7. object.hexBackgroundColor
    o class.hexBackgroundColor

En la sección del título de la tarjeta, se muestra el logotipo, el nombre de la aerolínea y el resumen del vuelo. Estos tres elementos son obligatorios, y no se pueden cambiar las referencias de campo que se usaron para completarlos ni su posición.

Si no se configuran class.origin.airportNameOverride o class.detination.airportNameOverride, el nombre de la ciudad del aeropuerto se propaga automáticamente con la ciudad asociada con el código IATA en class.origin.airportIataCode y class.destination.airportIataCode, respectivamente.

Cuando se configura el campo de logotipo ancho, en los dispositivos Android, el encabezado de la plantilla predeterminado con el logotipo y el nombre de la entidad emisora se reemplaza por el logotipo ancho.

Cuando crees un logotipo de encabezado ancho, sigue los lineamientos de imagen de logotipo ancho para que se muestre de manera óptima en tus pases.

Plantilla de tarjeta

Android

Descripción general de la plantilla

Páginas web

Descripción general de la plantilla

La sección de plantilla de la tarjeta se usa para mostrar filas adicionales. Estas filas pueden contener campos de datos estructurados basados en texto o campos de módulos de texto.

Puedes especificar la cantidad de filas que definen la cantidad de objetos en la lista class.classTemplateInfo.cardTemplateOverride.cardRowTemplateInfos[]. La lista requiere al menos un elemento, y te recomendamos que uses dos como máximo. Cada elemento debe ser de uno de los siguientes tipos:

  • oneItem, que acepta un elemento:
    • item
  • twoItems, que acepta dos elementos:
    • startItem
    • endItem
  • threeItems, que acepta tres elementos:
    • startItem
    • middleItem
    • endItem

Cada elemento se puede definir como un selector de campo único (.firstValue), dos selectores de campo (.firstValue y .secondValue) o un elemento predefinido (.predefinedItem). Se muestran los valores del campo seleccionado y sus respectivas etiquetas. Cuando defines dos selectores de campo, los valores de los campos seleccionados se muestran con un separador “/”. Lo mismo ocurre con las etiquetas de los campos seleccionados. Los elementos predefinidos se usan para definir un procesamiento más complejo.

En la siguiente muestra de código, se indica cómo anular las secciones de filas de tarjetas de la plantilla de tarjetas para especificar dos filas. Cada fila incluye tres elementos que hacen referencia a seis campos personalizados textModuleData de nivel de clase y sus encabezados como etiquetas:

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

El código crea un pase con el siguiente formato de sección de plantilla de código:

Ejemplo de anulación de etiqueta.

Si un elemento está vacío, no se muestra. Para obtener más detalles, consulta Referencias de campo. Si todos los elementos de una fila están vacíos, esta no se muestra. Si algunos elementos de una fila, pero no todos, están vacíos, los elementos no vacíos se reorganizan y se muestran como una fila con menos elementos.

Si no anulas la plantilla de tarjeta, se usan la cantidad predeterminada de filas, la cantidad predeterminada de elementos y las referencias de campo predeterminadas. Para obtener más detalles, consulta Plantilla predeterminada.

Una vez que defines una imagen hero, esta puede aparecer después de la primera fila, si hay varias filas en la lista cardRowTemplateInfos, o bien arriba de la fila, si solo hay una.

Código de barras de la tarjeta

Android

Elementos del código de barras de la tarjeta
  1. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .firstTopDetail
  2. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .secondTopDetail
  3. object.barcode.type y object.barcode.value
    o object.reservationInfo.confirmationCode
  4. object.barcode.alternateText
  5. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .firstBottomDetail

Páginas web

Elementos del código de barras de la tarjeta
  1. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .firstTopDetail
  2. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .secondTopDetail
  3. object.barcode.type y object.barcode.value
    o object.reservationInfo.confirmationCode
  4. object.barcode.alternateText
  5. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .firstBottomDetail

La sección de códigos de barras de la tarjeta se usa para mostrar texto o imágenes adicionales encima y debajo del código de barras. Ninguno de los campos de esta sección es obligatorio.

Hay tres selectores de campos que se pueden usar para definir dos campos en paralelo encima y uno debajo del código de barras. Se muestran sin etiquetas y pueden ser campos de datos estructurados basados en texto, campos de módulo de texto o campos de módulo de imagen. Si usas imágenes, estas deben seguir los lineamientos de desarrollo de la marca.

El código de barras se define mediante un tipo y un valor. Para obtener una lista de los tipos de códigos de barras admitidos, consulta Referencia. Además, el texto se puede mostrar justo debajo del código de barras. Este texto facilita el escaneo de códigos de barras, entre otros usos.

En la siguiente muestra de código, se indica cómo anular la sección de código de barras de un pase para mostrar una imagen sobre el código de barras:

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

El código crea un pase con el siguiente formato de sección de código de barras:

Ejemplo de anulación del código de barras de una tarjeta.

Si no anulas la sección de códigos de barras, se usarán los campos predeterminados de códigos de barras. Para obtener más información, consulta Plantilla predeterminada.

Plantilla de detalles

Android

Secciones de la plantilla de detalles
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[0].item
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[1].item
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[2].item
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[3].item
  • ...

Páginas web

Secciones de la plantilla de detalles
  • 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 sección de la plantilla de detalles es una lista de elementos class.classTemplateInfo.detailsTemplateOverride.detailsItemInfos[]. Los elementos pueden contener cualquier tipo de campos de datos estructurados, campos de módulos de texto, campos de módulos de vínculos, campos de módulos de imágenes o mensajes.

Cada elemento se puede definir como un selector de campo único (.firstValue), dos selectores de campo (.firstValue y .secondValue) o un elemento predefinido (.predefinedItem). Se muestran los valores del campo seleccionado y sus respectivas etiquetas. Cuando defines dos selectores de campo, los valores de los campos seleccionados se muestran con un separador “/”. Lo mismo ocurre con las etiquetas de los campos seleccionados. Los elementos predefinidos se usan para definir renderizaciones más complejas. Los campos del módulo de imagen se renderizan en ancho completo sin etiqueta.

En la siguiente muestra de código, se indica cómo anular la sección de detalles del pase para mostrar un solo campo linksModuleData con su etiqueta:

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
    

El código crea un pase con el siguiente formato de sección de detalles:

Ejemplo de anulación de detalles

Si un elemento está vacío, no se muestra. Para obtener más detalles, consulta Referencias de campo.

Si no anulas la plantilla de detalles, se mostrará la lista predeterminada de campos de referencia en el orden predeterminado. Para obtener más información, consulta Plantilla predeterminada.

Plantilla de lista

Enumerar elementos de la plantilla
  1. class.classTemplateInfo.listTemplateOverride
      .firstRowOption.fieldOption.fields[]
  2. class.localScheduledDepartureDateTime
    (solo fecha) (agrupado)
    o class.classTemplateInfo.listTemplateOverride
      .secondRowOption.fields[]
  3. class.flightHeader.carrier.airlineLogo
  4. object.hexBackgroundColor
    o class.hexBackgroundColor
  5. <# pases> (agrupados)

La sección de la plantilla de lista se usa para seleccionar qué campo mostrar en la vista "Pases" de la app de la Billetera de Google. El pase se representa en la lista con el logotipo, el color de fondo y tres filas.

En la siguiente muestra de código, se indica cómo anular la plantilla de lista de un pase para mostrar el campo de fecha de vencimiento del objeto de un solo pase en la primera fila de la plantilla de lista:

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
    

El código crea un pase con la siguiente representación de la plantilla de lista:

Ejemplo de anulación de lista

Las tres filas se pueden definir con un selector de campo. Los campos se muestran sin etiquetas. En el caso de los pases agrupados, la segunda fila siempre muestra la fecha de salida local programada, y la tercera fila siempre muestra la cantidad de pases agrupados.

Referencias de campo

Las referencias de campo se usan en diferentes partes de la plantilla con el formato class.classTemplateInfo.*.fields[]. Una referencia de campo contiene una lista de rutas a campos de datos estructurados, campos de módulos de texto, campos de módulos de vínculos, campos de módulos de imágenes o mensajes.

No se permiten todos los tipos de rutas de acceso en todas las referencias de campo. Por ejemplo, algunas referencias de campo solo permiten rutas a campos de datos estructurados basados en texto o campos de módulos de texto. Los campos estructurados basados en texto son campos de datos estructurados de tipo string, string localizada, fecha o dinero.

La lista se puede usar para implementar una lógica de resguardo. Esto significa que, si la primera ruta de acceso de la lista se resuelve en un campo vacío, se evalúa la siguiente ruta. La lógica de resguardo se orienta principalmente a campos de datos estructurados o campos de módulos de texto basados en texto. No mezcles diferentes tipos de campos en la misma lista. Usa la lógica de resguardo con precaución y solo en situaciones específicas en las que esperes un patrón coherente de campos que existan en algunos objetos, pero no en otros. La mayoría de las veces, es más fácil crear clases separadas para casos de uso diferentes.

Si todas las rutas de acceso en una lista de referencia de campos se resuelven en campos vacíos, no se muestra el elemento que usa la referencia de campo. Si deseas que el elemento que usa la referencia de campo esté siempre presente, asegúrate de que al menos una ruta de acceso no esté vacía. Te recomendamos que establezcas un campo con un carácter especial, como “-”, para representar un valor nulo, incluso si algunos campos permiten cadenas con solo un espacio.

Para hacer referencia a un campo contenido en una lista, puedes usar el índice del campo en la lista o, en la mayoría de los casos, puedes usar un ID de referencia. Los elementos de una lista a los que se puede hacer referencia por ID tienen un campo .id. Te recomendamos que uses un ID de referencia sobre el índice del campo en la lista cuando esté disponible.

Este es un ejemplo de cómo hacer referencia a los campos contenidos en una lista.

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

En este caso, el primer elemento de la sección de detalles del pase es la segunda imagen declarada en el objeto. Por otro lado, el segundo elemento de la sección de detalles del pase es la primera imagen declarada en el objeto.

Plantilla predeterminada

Android

Elementos de la plantilla predeterminada
  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)
    y class.flightHeader.flightNumber
  4. ciudad del aeropuerto (derivada de class.origin.airportIataCode)
    o class.origin.airportNameOverride
  5. class.origin.airportIataCode
  6. ciudad del aeropuerto (derivada de class.destination.airportIataCode)
    o class.destination.airportNameOverride
  7. class.destination.airportIataCode
  8. TERMINAL
  9. class.origin.terminal
  10. GATE
  11. class.origin.gate
  12. CABIN (predeterminado) o CLASS o TIER (depende de
    class.boardingAndSeatingPolicy.SeatClassPolicy)
  13. object.boardingAndSeatingInfo.SeatClass
  14. EMBARQUE
    , CERRAR DE GUÍA
    o SALIR
  15. class.localBoardingDateTime
    o class.localGateClosingDateTime
    o class.localEstimatedOrActualDepartureDateTime
    o class.localScheduledDepartureDateTime
  16. PASAJERO
  17. object.passengerName
  18. ZONE (predeterminado) o GROUP (depende de
    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 y object.barcode.value
    o object.reservationInfo.confirmationCode
  25. object.barcode.alternateText
  26. class.flightHeader.carrier.airlineAllianceLogo
  27. object.hexBackgroundColor
    o class.hexBackgroundColor
  28. POSICIÓN
  29. object.boardingAndSeatingInfo.boardingPosition
  30. SEQUENCE
  31. object.boardingAndSeatingInfo.sequenceNumber
  32. PUERTA DE EMBARQUE
  33. object.boardingAndSeatingInfo.boardingDoor
  34. VUELO NÚMERO
  35. (class.flightHeader.operatingCarrier.carrierIataCode
    o class.flightHeader.operatingCarrier.carrierIcaoCode)
    y class.flightHeader.operatingFlightNumber
    y class.flightHeader.operatingCarrier.airlineName
  36. NÚMERO DE CONFIRMACIÓN
  37. object.reservationInfo.confirmationCode
  38. NÚMERO DE TICKET
  39. object.reservationInfo.eticketNumber
  40. NÚMERO DE FLOTANTE FRECUENTES
  41. object.reservationInfo
      .frequentFlyerInfo.frequentFlyerNumber
    y object.reservationInfo
      .frequentFlyerInfo.frequentFlyerProgramName
  42. SE CIERRE LA puerta de enlace
  43. class.localGateClosingDateTime
  44. HORARIO DE SALIDA PROGRAMADO
  45. class.localScheduledDepartureDateTime
  46. HORARIO DE SALIDA ESTIMADO
  47. class.localEstimatedOrActualDepartureDateTime
  48. HORARIO DE LLEGADA PROGRAMADO
  49. class.localScheduledArrivalDateTime
  50. HORARIO DE LLEGADA ESTIMADO
  51. class.localEstimatedOrActualArrivalDateTime
  52. TERMINAL DE LLEGADA
  53. class.destination.terminal
  54. GATE DE LLEGADA
  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

Páginas web

Elementos de la plantilla predeterminada
  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)
    y class.flightHeader.flightNumber
  4. ciudad del aeropuerto (derivada de class.origin.airportIataCode)
    o class.origin.airportNameOverride
  5. class.origin.airportIataCode
  6. ciudad del aeropuerto (derivada de class.destination.airportIataCode)
    o class.destination.airportNameOverride
  7. class.destination.airportIataCode
  8. TERMINAL
  9. class.origin.terminal
  10. GATE
  11. class.origin.gate
  12. CABIN (predeterminado) o CLASS o TIER (depende de
    class.boardingAndSeatingPolicy.SeatClassPolicy)
  13. object.boardingAndSeatingInfo.SeatClass
  14. EMBARQUE
    , CERRAR DE GUÍA
    o SALIR
  15. class.localBoardingDateTime
    o class.localGateClosingDateTime
    o class.localEstimatedOrActualDepartureDateTime
    o class.localScheduledDepartureDateTime
  16. PASAJERO
  17. object.passengerName
  18. ZONE (predeterminado) o GROUP (depende de
    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 y object.barcode.value
    o object.reservationInfo.confirmationCode
  25. object.barcode.alternateText
  26. class.flightHeader.carrier.airlineAllianceLogo
  27. object.hexBackgroundColor
    o class.hexBackgroundColor
  28. POSICIÓN
  29. object.boardingAndSeatingInfo.boardingPosition
  30. SEQUENCE
  31. object.boardingAndSeatingInfo.sequenceNumber
  32. PUERTA DE EMBARQUE
  33. object.boardingAndSeatingInfo.boardingDoor
  34. VUELO NÚMERO
  35. (class.flightHeader.operatingCarrier.carrierIataCode
    o class.flightHeader.operatingCarrier.carrierIcaoCode)
    y class.flightHeader.operatingFlightNumber
    y class.flightHeader.operatingCarrier.airlineName
  36. NÚMERO DE CONFIRMACIÓN
  37. object.reservationInfo.confirmationCode
  38. NÚMERO DE TICKET
  39. object.reservationInfo.eticketNumber
  40. NÚMERO DE FLOTANTE FRECUENTES
  41. object.reservationInfo
      .frequentFlyerInfo.frequentFlyerNumber
    y object.reservationInfo
      .frequentFlyerInfo.frequentFlyerProgramName
  42. SE CIERRE LA puerta de enlace
  43. class.localGateClosingDateTime
  44. HORARIO DE SALIDA PROGRAMADO
  45. class.localScheduledDepartureDateTime
  46. HORARIO DE SALIDA ESTIMADO
  47. class.localEstimatedOrActualDepartureDateTime
  48. HORARIO DE LLEGADA PROGRAMADO
  49. class.localScheduledArrivalDateTime
  50. HORARIO DE LLEGADA ESTIMADO
  51. class.localEstimatedOrActualArrivalDateTime
  52. TERMINAL DE LLEGADA
  53. class.destination.terminal
  54. GATE DE LLEGADA
  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

De forma predeterminada, la sección de detalles también muestra object.boardingAndSeatingInfo.boardingGroup, object.boardingAndSeatingInfo.seatClass y object.boardingAndSeatingInfo.seatNumber si la sección de la tarjeta está anulada y estos campos ya no están presentes en la sección de la tarjeta.

Para los campos de módulos de imagen, mostramos un solo campo de módulo de imagen de la clase y un campo de módulo de imagen del objeto. Si necesitas más de un campo de módulo de imagen en cualquier nivel, anula la plantilla predeterminada.

En el caso de los campos de módulos de texto, solo mostramos un máximo de 20 campos de módulos de texto de la clase y 20 del objeto. Los campos se muestran en el mismo orden en el que se definieron en el array. Si necesitas más de 20 campos de módulo de texto en cualquier nivel, anula la plantilla predeterminada.

En el caso de los mensajes, solo mostramos un máximo de 20 mensajes de la clase y 20 mensajes del objeto. No garantizamos el orden de los mensajes. Si necesitas más de 20 mensajes en cualquier nivel o una garantía para algún pedido, anula la plantilla predeterminada.

En el caso del campo del módulo de vínculos, no hay límite para la cantidad de URI que puedes definir. Los URI se muestran agrupados en el siguiente orden para cada nivel (objeto o clase):

  1. Coordenadas del mapa
  2. Números de teléfono
  3. Direcciones de correo electrónico
  4. Páginas web

Para cada grupo, los URI se muestran en el mismo orden en el que se definieron en el array. Si necesitas un orden diferente, anula la plantilla predeterminada.

Elementos de la plantilla de lista predeterminada
  1. class.origin.airportIataCode
    y class.destination.airportIataCode
  2. class.localScheduledDepartureDateTime
    (solo fecha)
  3. class.flightHeader.carrier.airlineLogo
  4. object.hexBackgroundColor
    o class.hexBackgroundColor
  5. <# pases> (agrupados)