Modelo de cartão de transporte público

Os cartões de transporte são compatíveis com a renderização de modelos. Se nenhum modelo for definido, será usado o padrão.

Definição de modelo

Um modelo de cartão é definido no nível da classe e usado para exibir qualquer objeto associado a ela. O modelo define quais campos serão exibidos em diferentes seções do cartão.

Ele é dividido nas seguintes seções:

Android

Visão geral das seções e posições do layout do modelo de cartão

Web

Visão geral das seções e posições do layout do modelo de cartão

Título do cartão

Android

Elementos de layout e posições de campo do título do card Título padrão do card
  1. class.logo
  2. class.localizedIssuerName
    ou class.issuerName
  3. object.ticketLeg.originName
  4. object.ticketLeg.destinationName
  5. object.ticketLeg.originStationCode
  6. object.ticketLeg.destinationStationCode
  7. object.tripType
  8. object.hexBackgroundColor
    ou class.hexBackgroundColor

Título do card com logotipo amplo
  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
    ou class.hexBackgroundColor

Web

Elementos de layout e posições de campo do título do card Título padrão do card
  1. class.logo
  2. class.localizedIssuerName
    ou class.issuerName
  3. object.ticketLeg.originName
  4. object.ticketLeg.destinationName
  5. object.ticketLeg.originStationCode
  6. object.ticketLeg.destinationStationCode
  7. object.tripType
  8. object.hexBackgroundColor
    ou class.hexBackgroundColor

Título do card com logotipo amplo
  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
    ou class.hexBackgroundColor

A seção de título do cartão exibe o logotipo, o nome da empresa de transporte público e o resumo da viagem. Esses três elementos são obrigatórios e não é possível alterar as referências de campo usadas para preenchê-los nem a posição deles.

No entanto, a lógica de renderização permite alguma flexibilidade na linha superior. A linha superior do cartão, que representa um resumo da viagem, é controlada pelos seguintes campos no TransitObject para uma viagem de trecho único:

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

A maneira como o cartão é renderizado depende de quais campos estão preenchidos. Ele pode ser renderizado das seguintes maneiras:

  • Apenas nome da origem: o nome da origem é a única informação exibida. Isso é particularmente útil para cartões que cobrem uma área em vez de uma viagem específica.
  • Origem e destino: a origem está no lado esquerdo e o destino está no lado direito. O símbolo entre os dois depende do tipo da viagem. A origem e o destino são mostrados como um dos seguintes:
    • Nomes e códigos de estações: mostramos os códigos das estações junto aos nomes em fonte menor na parte de cima.
    • Apenas nomes: mostramos os nomes.
    • Somente códigos de estações: mostramos os códigos de estações.

Os objetos TransitObject de vários trechos funcionam de maneira muito parecida. Nesse caso, não use object.ticketLeg. Em vez disso, use a lista object.ticketLegs[]. É preciso definir as origens e os destinos. Os nomes ou os códigos de estação, ou ambos, precisam ser usados de forma consistente em cada trecho. A origem exibida está relacionada ao primeiro elemento na matriz, enquanto o destino exibido refere-se ao último elemento na matriz.

A cor de fundo do cartão não é um campo obrigatório e pode ser definida tanto no nível da classe quanto no do objeto. O campo de objeto tem maior prioridade e pode ser usado para modificar o campo de classe.

Quando o campo de logotipo amplo é definido, nos dispositivos Android, o cabeçalho do modelo padrão com o logotipo e o nome do emissor é substituído pelo logotipo amplo.

Siga as diretrizes de imagem do logotipo largo ao criar o logotipo do cabeçalho largo para exibir sua imagem de maneira ideal nos seus cartões.

Modelo de card

Android

Elementos de layout de linha do modelo de card e posições de campo

Web

Elementos de layout de linha do modelo de card e posições de campo

A seção de modelo do cartão é usada para mostrar linhas extras. Essas linhas podem conter campos de dados estruturados baseados em texto ou campos de módulo de texto.

É possível especificar o número de linhas que definem o número de objetos na lista class.classTemplateInfo.cardTemplateOverride.cardRowTemplateInfos[]. A lista requer pelo menos um elemento, e recomendamos usar no máximo dois elementos. Cada elemento precisa ser de um dos seguintes tipos:

  • oneItem, que aceita um item:
    • item
  • twoItems, que aceita dois itens:
    • startItem
    • endItem
  • threeItems, que aceita três itens:
    • startItem
    • middleItem
    • endItem

Cada item pode ser definido como um seletor de campo (.firstValue), dois seletores de campo (.firstValue e .secondValue) ou um item predefinido (.predefinedItem). Os valores do campo selecionado e os respectivos rótulos são exibidos. Quando você define dois seletores de campo, os valores dos campos selecionados são exibidos com um separador "/". O mesmo vale para os rótulos. Itens predefinidos são usados para definir uma renderização mais complexa.

O exemplo de código a seguir mostra como modificar as seções de linha do cartão de modelo de cartão para especificar duas linhas. Cada linha inclui três itens que fazem referência a seis campos personalizados de níveis de classe textModuleData e seus cabeçalhos como rótulos:

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

O código cria um cartão com o seguinte formato de seção de modelo de código:

Exemplo de uma modificação de rótulo.

Se um item estiver vazio, ele não será exibido. Para mais detalhes, consulte a seção Referências de campo. Se todos os itens em uma linha estiverem vazios, ela não será exibida. Se alguns, mas não todos, os itens em uma linha estiverem em branco, os itens preenchidos serão reorganizados e exibidos como uma linha com menos itens.

Se você não modificar o modelo de cartão, o número padrão de linhas e de itens e as referências de campo padrão serão usados. Para mais detalhes, consulte Modelo padrão.

Depois de definir uma imagem principal, ela pode aparecer após a primeira linha, se houver várias linhas na lista cardRowTemplateInfos, ou acima da linha, se houver apenas uma.

Código de barras do cartão

Android

Elementos e posições do layout do código de barras do cartão
  1. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .firstTopDetail
  2. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .secondTopDetail
  3. object.barcode.type e object.barcode.value
    ou object.ticketNumber
  4. object.barcode.alternateText
  5. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .firstBottomDetail

Web

Elementos e posições do layout do código de barras do cartão
  1. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .firstTopDetail
  2. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .secondTopDetail
  3. object.barcode.type e object.barcode.value
    ou object.ticketNumber
  4. object.barcode.alternateText
  5. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .firstBottomDetail

A seção de código de barras do cartão é usada para mostrar mais texto ou imagens antes e depois do código de barras. Nenhum dos campos desta seção é obrigatório.

Há três seletores que podem ser usados para definir dois campos lado a lado, um antes e um depois do código de barras. Eles são exibidos sem rótulo e podem ser campos de dados estruturados com base em texto, campos de módulo de texto ou campos de módulo de imagem. Ao usar imagens, siga as diretrizes da marca.

O código de barras é definido por um tipo e um valor. Para ver uma lista de tipos de código de barras compatíveis, consulte a seção Referência. Além disso, é possível exibir um texto abaixo do código de barras. Esse texto pode facilitar a leitura de códigos de barras, entre outros usos.

O exemplo de código a seguir mostra como modificar a seção de código de barras de um cartão para exibir uma imagem acima do 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);
    

O código cria um cartão com o seguinte formato de seção de código de barras:

Exemplo de modificação de código de barras do cartão.

Se você não modificar a seção do código de barras, serão usados os campos padrão de código de barras. Para mais informações, consulte Modelo padrão.

Seção inferior

Android

Seções e itens da parte de baixo do modelo de detalhes
  • Itinerário de vários trechos
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[0].item
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[1].item
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[2].item

Web

Seções e itens da parte de baixo do modelo de detalhes
  • Itinerário de vários trechos
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[0].item
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[1].item
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[2].item

A seção de baixo é uma lista de itens class.classTemplateInfo.detailsTemplateOverride.detailsItemInfos[]. que podem conter qualquer tipo de campo de dados estruturados, de mensagem ou de módulos de texto, link ou imagem.

Cada item pode ser definido como um seletor de campo (.firstValue), dois seletores de campo (.firstValue e .secondValue) ou um item predefinido (.predefinedItem). Os valores do campo selecionado e os respectivos rótulos são exibidos. Quando você define dois seletores de campo, os valores dos campos selecionados são exibidos com um separador "/". O mesmo vale para os rótulos. Itens predefinidos são usados para definir uma renderização mais complexa. Os campos do módulo de imagem são renderizados na largura total sem um rótulo.

O exemplo de código a seguir mostra como modificar a seção inferior do cartão para mostrar um único campo linksModuleData com o rótulo:

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
    

O código cria um cartão com o seguinte formato de seção inferior:

Exemplo de uma modificação de
                                                                             seção inferior.

Se um item estiver vazio, ele não será exibido. Para mais detalhes, consulte a seção Referências de campo.

Se você não modificar a seção inferior, a lista padrão de campos de referência será exibida na ordem padrão. Para mais informações, consulte Modelo padrão.

Se a viagem incluir vários trechos, um itinerário simples será exibido na parte de cima da seção e não poderá ser movido. Caso a viagem inclua apenas um trecho, um itinerário simples poderá ser exibido ao definir class.enableSingleLegItinerary.

Itinerário de vários trechos
  1. class.tranistType
  2. object.ticketLegs[i].originName
    ou object.ticketLegs[i].originStationCode
  3. object.ticketLegs[i].departureDateTime (apenas horário)
  4. object.ticketLegs[i].transitOperatorName
  5. ECONÔMICA ou class.customCoachLabel
  6. object.ticketLegs[i].ticketSeat.coach
    ou object.ticketLegs[i].ticketSeats[*].coach
  7. ASSENTO ou class.customSeatLabel
  8. object.ticketLegs[i].ticketSeat.seat
    ou object.ticketLegs[i].ticketSeat.seatAssignment
    ou object.ticketLegs[i].ticketSeats[*].seat
    ou object.ticketLegs[i].ticketSeats[*].seatAssignment
    ou SEM UM ASSENTO ESPECÍFICO
  9. object.hexBackgroundColor
    ou class.hexBackgroundColor
  10. object.ticketLegs[i].destinationName
    ou object.ticketLegs[i].destinationStationCode
  11. object.ticketLegs[i].arrivalDateTime (apenas horário)
  12. TRANSFERIR PARA: PLATAFORMA
    ou TRANSFERIR PARA: class.customPlatformLabel
    ou TRANSFERIR (se nenhuma plataforma for definida)
  13. object.ticketLegs[i+1].platform

Modelo de lista

Elementos do modelo de lista
  1. class.classTemplateInfo.listTemplateOverride
      .firstRowOption.fieldOption.fields[]
  2. object.ticketLeg.departureDateTime (agrupado)
    ou class.classTemplateInfo.listTemplateOverride
      .secondRowOption.fields[]
  3. class.logo
  4. object.hexBackgroundColor
    ou class.hexBackgroundColor
  5. <# passes> (agrupados)

A seção do modelo de lista é usada para selecionar o campo a ser exibido na visualização "Cartões" do app Carteira do Google. O cartão é representado na lista com o logotipo, cor de fundo e três linhas.

O exemplo de código a seguir mostra como modificar o modelo de lista de um cartão para mostrar um único campo de data de validade do objeto de cartões na primeira linha do modelo 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
    

O código cria um cartão com a seguinte execução de modelo de lista:

Exemplo de uma modificação de
                                                                           lista.

A primeira linha pode ser definida com um seletor de campo ou mostrar o resumo da viagem. O formato do resumo pode ser um dos seguintes:

  • originAndDestinationCodes
  • originAndDestinationNames
  • originName

A segunda e a terceira linhas só podem ser definidas com um seletor de campo. Os campos são exibidos sem rótulo. Para cartões agrupados, a segunda linha mostra sempre a data de partida, enquanto a terceira linha sempre mostra o número de cartões agrupados.

Rótulos

Todos os campos de dados estruturados têm um rótulo fornecido pelo Google. O Google é responsável por fornecer uma tradução para cada um desses rótulos em todos os idiomas aceitos.

É possível personalizar alguns desses rótulos usando um dos campos class.custom<name_of_the_field>Label. Ao personalizar uma etiqueta, você se torna responsável por traduzi-la para todos os idiomas que quiser usar.

Referências de campo

As referências de campo são usadas em diferentes partes do modelo com o formato class.classTemplateInfo.*.fields[]. Uma referência de campo contém uma lista de caminhos para campos de dados estruturados, campos de módulo de texto, de link ou de imagem ou mensagens.

Nem todos os tipos de caminhos são permitidos em todas as referências de campo. Por exemplo, algumas delas apenas permitem caminhos para campos de dados estruturados baseados em texto ou campos de módulo de texto. Campos estruturados baseados em texto são campos de dados estruturados do tipo string, string localizada, data ou dinheiro.

A lista pode ser usada para implementar uma lógica de fallback. Isso significa que, se o primeiro caminho da lista for um campo vazio, o próximo caminho será avaliado. A lógica de fallback é voltada principalmente para campos de dados estruturados baseados em texto ou campos de módulo de texto. Não misture tipos diferentes de campos na mesma lista. Use a lógica de fallback com cuidado e somente em situações específicas nas quais é esperado um padrão consistente de campos em alguns objetos, mas não em outros. Na maioria das vezes, é mais fácil criar classes separadas para casos de uso separados.

Se todos os caminhos em uma lista de referência de campo tiverem campos vazios, o item que usa a referência não será exibido. Se você quiser que o item que usa a referência esteja sempre presente, preencha pelo menos um caminho. Recomendamos que você defina um campo como um caractere especial, por exemplo, "-", para representar um valor nulo, mesmo que alguns campos permitam strings com apenas um espaço.

Para referenciar um campo contido em uma lista, é possível usar o índice do campo na lista ou, na maioria dos casos, usar um ID de referência. Os itens de uma lista que podem ser referenciados por ID têm um campo .id. Recomendamos usar um ID de referência em vez do índice do campo na lista, quando disponível.

Confira um exemplo de como referenciar campos contidos em uma 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]

Nesse caso, o primeiro item na seção de detalhes do cartão é a segunda imagem declarada no objeto. Já o segundo item na seção de detalhes do cartão é a primeira imagem declarada no objeto.

Modelo padrão

Android

Elementos e posições padrão do layout do modelo de cartão
  1. class.logo
  2. class.localizedIssuerName
    ou class.issuerName
  3. Confira o título do card
  4. PARTIDA ou VÁLIDO DE
  5. object.ticketLeg.departureDateTime (data e hora)
    ou object.validTimeInterval.start.date
  6. CHEGANDO EM ou VÁLIDO ATÉ
  7. object.ticketLeg.arrivalDateTime (apenas horário)
    ou object.validTimeInterval.end.date
  8. PASSAGEIRO
  9. object.passengerNames
  10. CARRO ou class.customCarriageLabel
  11. object.ticketLeg.carriage
  12. ECONÔMICA ou class.customCoachLabel
  13. object.ticketLeg.ticketSeat.coach
  14. ASSENTO ou class.customSeatLabel
  15. object.ticketLeg.ticketSeat.seat
    ou object.ticketLeg.ticketSeat.seatAssignment
  16. object.barcode.type e object.barcode.value
    ou object.ticketNumber
  17. object.barcode.alternateText
  18. object.hexBackgroundColor
    ou class.hexBackgroundColor
  19. Itinerário de vários trechos
  20. NÚMERO DO BILHETE ou class.customTicketNumberLabel
  21. object.ticketNumber
  22. STATUS DO TÍQUETE
  23. object.ticketStatus ou object.customTicketStatus
  24. DEPARTURE
  25. object.ticketLeg.departureDateTime
  26. CHEGADA
  27. object.ticketLeg.arrivalDateTime
  28. NOME DA TARIFA ou class.customFareNameLabel
  29. object.ticketLeg.fareName
  30. PLATAFORMA ou class.customPlatformLabel
  31. object.ticketLeg.platform
  32. ZONA ou class.customZoneLabel
  33. object.ticketLeg.zone
  34. CLASSE DA TARIFA ou class.customFareClassLabel
  35. object.ticketLeg.ticketSeat.fareClass
    ou object.ticketLeg.ticketSeat.customFareClass
  36. CATEGORIA DE CONCESSÃO
    ou class.customConcessionCategoryLabel
  37. object.concessionCategory
    ou object.customConcessionCategory
  38. RESTRIÇÕES DE ROTA
    ou class.customRouteRestrictionsLabel
  39. object.ticketRestrictions.routeRestrictions
  40. DETALHES DE RESTRIÇÕES DE ROTA
    ou class.customRouteRestrictionsDetailsLabel
  41. object.ticketRestrictions.routeRestrictionsDetails
  42. RESTRIÇÕES DE TEMPO
    ou class.customTimeRestrictionsLabel
  43. object.ticketRestrictions.timeRestrictions
  44. OUTRAS RESTRIÇÕES
    ou class.customOtherRestrictionsLabel
  45. object.ticketRestrictions.otherRestrictions
  46. NÚMERO DO RECIBO
    ou class.customPurchaseReceiptNumberLabel
  47. object.purchaseDetails.purchaseReceiptNumber
  48. DATA DA COMPRA
  49. object.purchaseDetails.purchaseDateTime
  50. ID DA CONTA
  51. object.purchaseDetails.accountId
  52. CÓDIGO DE CONFIRMAÇÃO
    ou class.customConfirmationCodeLabel
  53. object.purchaseDetails.confirmationCode
  54. VALOR NOMINAL ou class.customPurchaseFaceValueLabel
  55. object.purchaseDetails.ticketCost.faceValue
  56. PREÇO ou class.customPurchasePriceLabel
  57. object.purchaseDetails.ticketCost.purchasePrice
  58. MENSAGEM DE DESCONTO
    ou 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

Web

Elementos e posições padrão do layout do modelo de cartão
  1. class.logo
  2. class.localizedIssuerName
    ou class.issuerName
  3. Confira o título do card
  4. PARTIDA ou VÁLIDO DE
  5. object.ticketLeg.departureDateTime (data e hora)
    ou object.validTimeInterval.start.date
  6. CHEGANDO EM ou VÁLIDO ATÉ
  7. object.ticketLeg.arrivalDateTime (apenas horário)
    ou object.validTimeInterval.end.date
  8. PASSAGEIRO
  9. object.passengerNames
  10. CARRO ou class.customCarriageLabel
  11. object.ticketLeg.carriage
  12. ECONÔMICA ou class.customCoachLabel
  13. object.ticketLeg.ticketSeat.coach
  14. ASSENTO ou class.customSeatLabel
  15. object.ticketLeg.ticketSeat.seat
    ou object.ticketLeg.ticketSeat.seatAssignment
  16. object.barcode.type e object.barcode.value
    ou object.ticketNumber
  17. object.barcode.alternateText
  18. object.hexBackgroundColor
    ou class.hexBackgroundColor
  19. Itinerário de vários trechos
  20. NÚMERO DO BILHETE ou class.customTicketNumberLabel
  21. object.ticketNumber
  22. STATUS DO TÍQUETE
  23. object.ticketStatus ou object.customTicketStatus
  24. DEPARTURE
  25. object.ticketLeg.departureDateTime
  26. CHEGADA
  27. object.ticketLeg.arrivalDateTime
  28. NOME DA TARIFA ou class.customFareNameLabel
  29. object.ticketLeg.fareName
  30. PLATAFORMA ou class.customPlatformLabel
  31. object.ticketLeg.platform
  32. ZONA ou class.customZoneLabel
  33. object.ticketLeg.zone
  34. CLASSE DA TARIFA ou class.customFareClassLabel
  35. object.ticketLeg.ticketSeat.fareClass
    ou object.ticketLeg.ticketSeat.customFareClass
  36. CATEGORIA DE CONCESSÃO
    ou class.customConcessionCategoryLabel
  37. object.concessionCategory
    ou object.customConcessionCategory
  38. RESTRIÇÕES DE ROTA
    ou class.customRouteRestrictionsLabel
  39. object.ticketRestrictions.routeRestrictions
  40. DETALHES DE RESTRIÇÕES DE ROTA
    ou class.customRouteRestrictionsDetailsLabel
  41. object.ticketRestrictions.routeRestrictionsDetails
  42. RESTRIÇÕES DE TEMPO
    ou class.customTimeRestrictionsLabel
  43. object.ticketRestrictions.timeRestrictions
  44. OUTRAS RESTRIÇÕES
    ou class.customOtherRestrictionsLabel
  45. object.ticketRestrictions.otherRestrictions
  46. NÚMERO DO RECIBO
    ou class.customPurchaseReceiptNumberLabel
  47. object.purchaseDetails.purchaseReceiptNumber
  48. DATA DA COMPRA
  49. object.purchaseDetails.purchaseDateTime
  50. ID DA CONTA
  51. object.purchaseDetails.accountId
  52. CÓDIGO DE CONFIRMAÇÃO
    ou class.customConfirmationCodeLabel
  53. object.purchaseDetails.confirmationCode
  54. VALOR NOMINAL ou class.customPurchaseFaceValueLabel
  55. object.purchaseDetails.ticketCost.faceValue
  56. PREÇO ou class.customPurchasePriceLabel
  57. object.purchaseDetails.ticketCost.purchasePrice
  58. MENSAGEM DE DESCONTO
    ou 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

Exibimos apenas um campo do módulo de imagem da classe e um do objeto. Se você precisar de mais de um campo de módulo de imagem em qualquer um dos níveis, modifique o modelo padrão.

Exibimos no máximo 20 campos de módulo de texto da classe e 20 do objeto. Eles são mostrados na mesma ordem em que foram definidos na matriz. Se você precisar de mais de 20 campos de módulo de texto em um dos níveis, modifique o modelo padrão.

Exibimos no máximo 20 mensagens da classe e 20 do objeto Não garantimos a ordem das mensagens. Se você precisar de mais de 20 mensagens em qualquer nível ou uma garantia para qualquer pedido, substitua o modelo padrão.

É possível definir um número ilimitado de URIs com o campo de módulo de links. Os URIs são exibidos em grupos na seguinte ordem para todos os níveis classe e objeto:

  1. Coordenadas no mapa
  2. Números de telefone
  3. Endereços de e-mail
  4. Páginas da Web

Os URIs são exibidos em cada grupo na mesma ordem em que são definidos na matriz. Se você precisar de uma ordem diferente, modifique o modelo padrão.

Elementos e posições de layout do modelo de lista padrão
  1. (object.ticketLeg.originName
      e object.ticketLeg.destinationName)
    ou (object.ticketLeg.originStationCode
      e object.ticketLeg.destinationStationCode)
    ou object.ticketLeg.originName
  2. object.ticketLeg.departureDateTime
    ou object.validTimeInterval.end.date
  3. class.logo
  4. object.hexBackgroundColor
    ou class.hexBackgroundColor
  5. <# passes> (agrupados)