Шаблон транзитного пропуска

Транзитные пропуска поддерживают рендеринг шаблонов. Если шаблон не определен, используется шаблон по умолчанию.

Определение шаблона

Шаблон прохождения определяется на уровне класса и используется для отображения любого объекта, связанного с классом. Шаблон определяет, какие поля отображать в разных разделах прохода.

Шаблон разделен на следующие разделы:

Андроид

Обзор шаблона

Интернет

Обзор шаблона

Название карты

Андроид

Элементы заголовка карточки Название карты по умолчанию
  1. class.logo
  2. class.localizedIssuerName
    или class.issuerName
  3. object.ticketLeg.originName
  4. object.ticketLeg.destinationName
  5. object.ticketLeg.originStationCode
  6. object.ticketLeg.destinationStationCode
  7. object.tripType
  8. object.hexBackgroundColor
    или class.hexBackgroundColor

Название карты с широким логотипом
  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
    или class.hexBackgroundColor

Интернет

Элементы заголовка карточки Название карты по умолчанию
  1. class.logo
  2. class.localizedIssuerName
    или class.issuerName
  3. object.ticketLeg.originName
  4. object.ticketLeg.destinationName
  5. object.ticketLeg.originStationCode
  6. object.ticketLeg.destinationStationCode
  7. object.tripType
  8. object.hexBackgroundColor
    или class.hexBackgroundColor

Название карты с широким логотипом
  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
    или class.hexBackgroundColor

В разделе заголовка карты отображается логотип, название транзитного оператора и сводка поездки. Все эти три элемента являются обязательными, и ни ссылки на поля, используемые для их заполнения, ни их положение не могут быть изменены.

Однако логика рендеринга допускает некоторую гибкость для верхней строки. Верхняя строка пропуска, представляющая сводку поездки, управляется следующими полями в TransitObject для поездки с одним этапом:

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

Способ отображения прохода зависит от того, какие поля не пусты. Его можно отобразить следующими способами:

  • Только имя источника. Единственной отображаемой информацией является имя источника. Это особенно полезно для билетов, охватывающих определенную территорию, а не конкретную поездку.
  • Пункт отправления и назначения: пункт отправления находится слева, пункт назначения — справа. Символ между ними зависит от типа поездки. Отправление и место назначения отображаются как одно из следующих:
    • Названия и коды станций. Мы показываем коды станций с названиями мелким шрифтом сверху.
    • Только имена: мы показываем имена.
    • Только коды станций: мы показываем коды станций.

Многоветвевые объекты TransitObject работают очень похоже. В этом случае не используйте object.ticketLeg . Вместо этого вам нужно использовать список object.ticketLegs[] . Должны быть определены как пункты происхождения, так и пункты назначения. Названия или коды станций (или и то, и другое) должны использоваться последовательно на каждом участке. Отображаемое начало координат — это начало первого элемента массива, а отображаемое место назначения — это место назначения последнего элемента массива.

Цвет фона прохода не является обязательным полем и может быть определен как на уровне класса, так и на уровне объекта. Поле объекта имеет более высокий приоритет и может использоваться для переопределения поля класса.

Если установлено широкое поле логотипа, на устройствах Android заголовок шаблона по умолчанию с логотипом и названием эмитента заменяется широким логотипом.

Пожалуйста, следуйте рекомендациям по изображению широкого логотипа при создании логотипа с широким заголовком, чтобы оптимально отобразить изображение на ваших пропусках.

Шаблон карты

Андроид

Обзор шаблона

Интернет

Обзор шаблона

Раздел шаблона карточки используется для отображения дополнительных строк. Эти строки могут содержать текстовые поля структурированных данных или поля текстовых модулей.

Вы можете указать количество строк, определяющих количество объектов в списке class.classTemplateInfo.cardTemplateOverride.cardRowTemplateInfos[] . Для списка требуется хотя бы один элемент, и мы рекомендуем использовать не более двух элементов. Каждый элемент должен относиться к одному из следующих типов:

  • oneItem , который принимает один элемент:
    • item
  • twoItems , который принимает два элемента:
    • startItem
    • endItem
  • threeItems , который принимает три элемента:
    • startItem
    • middleItem
    • endItem

Каждый элемент может быть определен как один селектор полей ( .firstValue ), два селектора полей ( .firstValue и .secondValue ) или предопределенный элемент ( .predefinedItem ). Отображаются как значения выбранного поля, так и соответствующие им метки. Если вы определяете два селектора полей, значения выбранных полей отображаются с разделителем «/». То же самое касается меток выбранных полей. Предопределенные элементы используются для определения более сложной визуализации.

В следующем примере кода показано, как переопределить разделы строк карты шаблона карты, чтобы указать две строки. Каждая строка включает три элемента, каждый из которых ссылается на шесть настраиваемых полей textModuleData уровня класса и их заголовки в качестве меток:

Питон

 {
   ... //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']"
                            }]
                        }
                    },
                }
            }]
        }
    }
}
    

Ява

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

Код создает проход со следующим форматом раздела шаблона кода:

Пример переопределения метки.

Если элемент пуст, он не отображается. Дополнительные сведения см. в разделе Ссылки на поля . Если все элементы в строке пусты, строка не отображается. Если некоторые, но не все элементы в строке пусты, непустые элементы переупорядочиваются и отображаются как строка с меньшим количеством элементов.

Если вы не переопределите шаблон карточки, будут использоваться количество строк по умолчанию, количество элементов по умолчанию и ссылки на поля по умолчанию. Дополнительные сведения см. в разделе Шаблон по умолчанию .

После определения главного изображения оно может появиться после первой строки, если в списке cardRowTemplateInfos имеется несколько строк, или над строкой, если она только одна.

Штрих-код карты

Андроид

Элементы штрих-кода карты
  1. class.classTemplateInfo
    .cardBarcodeSectionDetails
    .firstTopDetail
  2. class.classTemplateInfo
    .cardBarcodeSectionDetails
    .secondTopDetail
  3. object.barcode.type и object.barcode.value
    или object.ticketNumber
  4. object.barcode.alternateText
  5. class.classTemplateInfo
    .cardBarcodeSectionDetails
    .firstBottomDetail

Интернет

Элементы штрих-кода карты
  1. class.classTemplateInfo
    .cardBarcodeSectionDetails
    .firstTopDetail
  2. class.classTemplateInfo
    .cardBarcodeSectionDetails
    .secondTopDetail
  3. object.barcode.type и object.barcode.value
    или object.ticketNumber
  4. object.barcode.alternateText
  5. class.classTemplateInfo
    .cardBarcodeSectionDetails
    .firstBottomDetail

Раздел штрих-кода карты используется для отображения дополнительного текста или изображений над и под штрих-кодом. Ни одно из полей в этом разделе не является обязательным.

Существует три переключателя полей, которые можно использовать для определения двух расположенных рядом полей над и одного под штрих-кодом. Они отображаются без меток и могут представлять собой текстовые поля структурированных данных, поля текстового модуля или поля модуля изображения. Если вы используете изображения, они должны соответствовать рекомендациям бренда.

Штрих-код определяется типом и значением. Список поддерживаемых типов штрих-кодов см. в разделе «Справочник» . Кроме того, текст может отображаться прямо под штрих-кодом. Этот текст, помимо прочего, может облегчить сканирование штрих-кодов.

В следующем примере кода показано, как переопределить раздел штрих-кода прохода для отображения изображения над штрих-кодом:

Питон

#... 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"
                        }
                    ]
                }
            }
        }
    }
}
    

Ява

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

Код создает пропуск со следующим форматом раздела штрих-кода:

Пример переопределения штрих-кода карты.

Если вы не переопределите раздел штрих-кода, будут использоваться поля штрих-кода по умолчанию. Дополнительные сведения см. в разделе Шаблон по умолчанию .

Подробный шаблон

Андроид

Подробные разделы шаблона
  • Многоэтапный маршрут
  • class.classTemplateInfo.detailsTemplateOverride
    .detailsItemInfos[0].item
  • class.classTemplateInfo.detailsTemplateOverride
    .detailsItemInfos[1].item
  • class.classTemplateInfo.detailsTemplateOverride
    .detailsItemInfos[2].item
  • ...

Интернет

Подробные разделы шаблона
  • Многоэтапный маршрут
  • class.classTemplateInfo.detailsTemplateOverride
    .detailsItemInfos[0].item
  • class.classTemplateInfo.detailsTemplateOverride
    .detailsItemInfos[1].item
  • class.classTemplateInfo.detailsTemplateOverride
    .detailsItemInfos[2].item
  • ...

Раздел шаблона сведений представляет собой список элементов class.classTemplateInfo.detailsTemplateOverride.detailsItemInfos[] . Элементы могут содержать любые поля структурированных данных, поля текстового модуля, поля модуля ссылок, поля модуля изображения или сообщения.

Каждый элемент может быть определен как один селектор полей ( .firstValue ), два селектора полей ( .firstValue и .secondValue ) или предопределенный элемент ( .predefinedItem ). Отображаются как значения выбранного поля, так и соответствующие им метки. Если вы определяете два селектора полей, значения выбранных полей отображаются с разделителем «/». То же самое касается меток выбранных полей. Предопределенные элементы используются для определения более сложной визуализации. Поля модуля изображения отображаются во всю ширину без метки.

В следующем примере кода показано, как переопределить раздел подробностей прохода, чтобы отобразить одно поле linksModuleData с его меткой:

Питон

//... 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
    

Ява

 //... 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
    

Код создает проход со следующим форматом раздела сведений:

Пример переопределения детализации.

Если элемент пуст, он не отображается. Дополнительные сведения см. в разделе Ссылки на поля .

Если вы не переопределяете шаблон сведений, отображается список ссылочных полей по умолчанию в порядке по умолчанию. Дополнительные сведения см. в разделе Шаблон по умолчанию .

Если путешествие включает в себя несколько этапов, в верхней части раздела отображается простой маршрут, который нельзя переместить. Если путешествие включает только один этап, можно отобразить простой маршрут, установив class.enableSingleLegItinerary .

Многоэтапный маршрут
  1. class.tranistType
  2. object.ticketLegs[i].originName
    или object.ticketLegs[i].originStationCode
  3. object.ticketLegs[i].departureDateTime (только время)
  4. object.ticketLegs[i].transitOperatorName
  5. COACH или class.customCoachLabel
  6. object.ticketLegs[i].ticketSeat.coach
    или object.ticketLegs[i].ticketSeats[*].coach
  7. SEAT или class.customSeatLabel
  8. object.ticketLegs[i].ticketSeat.seat
    или object.ticketLegs[i].ticketSeat.seatAssignment
    или object.ticketLegs[i].ticketSeats[*].seat
    или object.ticketLegs[i].ticketSeats[*].seatAssignment
    или НЕТ ОПРЕДЕЛЕННОГО МЕСТА
  9. object.hexBackgroundColor
    или class.hexBackgroundColor
  10. object.ticketLegs[i].destinationName
    или object.ticketLegs[i].destinationStationCode
  11. object.ticketLegs[i].arrivalDateTime (только время)
  12. ПЕРЕДАЧА НА: ПЛАТФОРМА
    или ПЕРЕДАЧА В: class.customPlatformLabel
    или ПЕРЕДАЧА (если платформа не определена)
  13. object.ticketLegs[i+1].platform

Шаблон списка

Список элементов шаблона
  1. class.classTemplateInfo.listTemplateOverride
    .firstRowOption.fieldOption.fields[]
  2. object.ticketLeg.departureDateTime (сгруппировано)
    или class.classTemplateInfo.listTemplateOverride
    .secondRowOption.fields[]
  3. class.logo
  4. object.hexBackgroundColor
    или class.hexBackgroundColor
  5. <# проходов> (сгруппировано)

Раздел шаблона списка используется для выбора поля для отображения в представлении «Пропуски» приложения Google Wallet. Пропуск представлен в списке с логотипом, цветом фона и тремя строками.

В следующем примере кода показано, как переопределить шаблон списка прохода, чтобы в первой строке шаблона списка отображалось поле даты истечения срока действия объекта одного прохода:

Питон

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

Ява

//... 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
    

Код создает проход со следующим представлением шаблона списка:

Пример переопределения списка.

Первую строку можно определить с помощью переключателя полей или она отображает сводную информацию о поездке. Формат резюме может быть одним из следующих:

  • originAndDestinationCodes
  • originAndDestinationNames
  • originName

Вторую и третью строки можно определить только с помощью селектора полей. Поля отображаются без меток. Для сгруппированных пропусков во второй строке всегда отображается дата отъезда, а в третьей строке всегда отображается количество сгруппированных пропусков.

Этикетки

Все поля структурированных данных имеют метки, предоставленные Google. Google несет ответственность за перевод каждого из этих ярлыков на все поддерживаемые языки.

Вы можете настроить некоторые из этих меток, используя одно из полей class.custom<name_of_the_field>Label . Когда вы настраиваете метку, вы несете ответственность за предоставление переводов этой конкретной метки на все языки, которые вы хотите поддерживать.

Ссылки на поля

Ссылки на поля используются в разных частях шаблона в форме class.classTemplateInfo.*.fields[] . Ссылка на поле содержит список путей к полям структурированных данных, полям текстового модуля, полям модуля ссылок, полям модуля изображения или сообщениям.

Не все типы путей разрешены в каждой ссылке на поле. Например, некоторые ссылки на поля допускают пути только к полям текстовых структурированных данных или полям текстовых модулей. Текстовые структурированные поля — это структурированные поля данных типа строка, локализованная строка, дата или деньги.

Список можно использовать для реализации резервной логики. Это означает, что если первый путь в списке разрешается в пустое поле, оценивается следующий путь. Логика возврата в основном предназначена для текстовых полей структурированных данных или полей текстовых модулей. Не смешивайте разные типы полей в одном списке. Используйте резервную логику с осторожностью и только в определенных ситуациях, когда вы ожидаете согласованного шаблона полей, который существует в некоторых объектах, но не существует в других. В большинстве случаев проще создать отдельные классы для отдельных случаев использования.

Если все пути в списке ссылок на поля разрешаются в пустые поля, элемент, использующий ссылку на поле, не отображается. Если вы хотите, чтобы элемент, использующий ссылку на поле, всегда присутствовал, убедитесь, что хотя бы один путь не пуст. Мы рекомендуем задать для поля специальный символ, например «-», чтобы представить нулевое значение, даже если некоторые поля допускают строки, содержащие только пробел.

Чтобы сослаться на поле, содержащееся в списке, вы можете использовать индекс поля в списке или, в большинстве случаев, вы можете использовать идентификатор ссылки. Элементы списка, на которые можно ссылаться по идентификатору, имеют поле .id . Мы рекомендуем использовать идентификатор ссылки вместо индекса поля в списке, если он доступен.

Вот пример того, как ссылаться на поля, содержащиеся в списке.

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

В этом случае первый элемент в разделе сведений о проходе — это второе изображение, объявленное в объекте. В то время как второй элемент в разделе сведений о проходе — это первое изображение, объявленное в объекте.

Шаблон по умолчанию

Андроид

Элементы шаблона по умолчанию
  1. class.logo
  2. class.localizedIssuerName
    или class.issuerName
  3. См. название карты
  4. ВЫЛЕТ или ДЕЙСТВИТЕЛЬНОСТЬ С
  5. object.ticketLeg.departureDateTime (дата и время)
    или object.validTimeInterval.start.date
  6. ПРИБЫТИЕ или ДЕЙСТВИТЕЛЬНО ДО
  7. object.ticketLeg.arrivalDateTime (только время)
    или object.validTimeInterval.end.date
  8. ПАССАЖИРСКИЙ
  9. object.passengerNames
  10. CARRIAGE или class.customCarriageLabel
  11. object.ticketLeg.carriage
  12. COACH или class.customCoachLabel
  13. object.ticketLeg.ticketSeat.coach
  14. SEAT или class.customSeatLabel
  15. object.ticketLeg.ticketSeat.seat
    или object.ticketLeg.ticketSeat.seatAssignment
  16. object.barcode.type и object.barcode.value
    или object.ticketNumber
  17. object.barcode.alternateText
  18. object.hexBackgroundColor
    или class.hexBackgroundColor
  19. Многоэтапный маршрут
  20. НОМЕР БИЛЕТА или class.customTicketNumberLabel
  21. object.ticketNumber
  22. СТАТУС БИЛЕТА
  23. object.ticketStatus или object.customTicketStatus
  24. ОТПРАВЛЕНИЕ
  25. object.ticketLeg.departureDateTime
  26. ПРИБЫТИЕ
  27. object.ticketLeg.arrivalDateTime
  28. ИМЯ ТАРИФА или class.customFareNameLabel
  29. object.ticketLeg.fareName
  30. ПЛАТФОРМА или class.customPlatformLabel
  31. object.ticketLeg.platform
  32. ЗОНА или class.customZoneLabel
  33. object.ticketLeg.zone
  34. КЛАСС ТАРИФА или class.customFareClassLabel
  35. object.ticketLeg.ticketSeat.fareClass
    или object.ticketLeg.ticketSeat.customFareClass
  36. КАТЕГОРИЯ КОНЦЕССИИ
    или class.customConcessionCategoryLabel
  37. object.concessionCategory
    или object.customConcessionCategory
  38. ОГРАНИЧЕНИЯ МАРШРУТА
    или class.customRouteRestrictionsLabel
  39. object.ticketRestrictions.routeRestrictions
  40. ДЕТАЛИ ОГРАНИЧЕНИЙ МАРШРУТА
    или class.customRouteRestrictionsDetailsLabel
  41. object.ticketRestrictions.routeRestrictionsDetails
  42. ОГРАНИЧЕНИЯ ПО ВРЕМЕНИ
    или class.customTimeRestrictionsLabel
  43. object.ticketRestrictions.timeRestrictions
  44. ДРУГИЕ ОГРАНИЧЕНИЯ
    или class.customOtherRestrictionsLabel
  45. object.ticketRestrictions.otherRestrictions
  46. НОМЕР Квитанции
    или class.customPurchaseReceiptNumberLabel
  47. object.purchaseDetails.purchaseReceiptNumber
  48. ДАТА ПОКУПКИ
  49. object.purchaseDetails.purchaseDateTime
  50. ИДЕНТИФИКАТОР АККАУНТА
  51. object.purchaseDetails.accountId
  52. КОД ПОДТВЕРЖДЕНИЯ
    или class.customConfirmationCodeLabel
  53. object.purchaseDetails.confirmationCode
  54. НОРМАЛЬНОЕ ЗНАЧЕНИЕ или class.customPurchaseFaceValueLabel
  55. object.purchaseDetails.ticketCost.faceValue
  56. ЦЕНА или class.customPurchasePriceLabel
  57. object.purchaseDetails.ticketCost.purchasePrice
  58. СООБЩЕНИЕ О СКИДКЕ
    или 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

Интернет

Элементы шаблона по умолчанию
  1. class.logo
  2. class.localizedIssuerName
    или class.issuerName
  3. См. название карты
  4. ВЫЛЕТ или ДЕЙСТВИТЕЛЬНОСТЬ С
  5. object.ticketLeg.departureDateTime (дата и время)
    или object.validTimeInterval.start.date
  6. ПРИБЫТИЕ или ДЕЙСТВИТЕЛЬНО ДО
  7. object.ticketLeg.arrivalDateTime (только время)
    или object.validTimeInterval.end.date
  8. ПАССАЖИРСКИЙ
  9. object.passengerNames
  10. CARRIAGE или class.customCarriageLabel
  11. object.ticketLeg.carriage
  12. COACH или class.customCoachLabel
  13. object.ticketLeg.ticketSeat.coach
  14. SEAT или class.customSeatLabel
  15. object.ticketLeg.ticketSeat.seat
    или object.ticketLeg.ticketSeat.seatAssignment
  16. object.barcode.type и object.barcode.value
    или object.ticketNumber
  17. object.barcode.alternateText
  18. object.hexBackgroundColor
    или class.hexBackgroundColor
  19. Многоэтапный маршрут
  20. НОМЕР БИЛЕТА или class.customTicketNumberLabel
  21. object.ticketNumber
  22. СТАТУС БИЛЕТА
  23. object.ticketStatus или object.customTicketStatus
  24. ОТПРАВЛЕНИЕ
  25. object.ticketLeg.departureDateTime
  26. ПРИБЫТИЕ
  27. object.ticketLeg.arrivalDateTime
  28. ИМЯ ТАРИФА или class.customFareNameLabel
  29. object.ticketLeg.fareName
  30. ПЛАТФОРМА или class.customPlatformLabel
  31. object.ticketLeg.platform
  32. ЗОНА или class.customZoneLabel
  33. object.ticketLeg.zone
  34. КЛАСС ТАРИФА или class.customFareClassLabel
  35. object.ticketLeg.ticketSeat.fareClass
    или object.ticketLeg.ticketSeat.customFareClass
  36. КАТЕГОРИЯ КОНЦЕССИИ
    или class.customConcessionCategoryLabel
  37. object.concessionCategory
    или object.customConcessionCategory
  38. ОГРАНИЧЕНИЯ МАРШРУТА
    или class.customRouteRestrictionsLabel
  39. object.ticketRestrictions.routeRestrictions
  40. ДЕТАЛИ ОГРАНИЧЕНИЙ МАРШРУТА
    или class.customRouteRestrictionsDetailsLabel
  41. object.ticketRestrictions.routeRestrictionsDetails
  42. ОГРАНИЧЕНИЯ ПО ВРЕМЕНИ
    или class.customTimeRestrictionsLabel
  43. object.ticketRestrictions.timeRestrictions
  44. ДРУГИЕ ОГРАНИЧЕНИЯ
    или class.customOtherRestrictionsLabel
  45. object.ticketRestrictions.otherRestrictions
  46. НОМЕР Квитанции
    или class.customPurchaseReceiptNumberLabel
  47. object.purchaseDetails.purchaseReceiptNumber
  48. ДАТА ПОКУПКИ
  49. object.purchaseDetails.purchaseDateTime
  50. ИДЕНТИФИКАТОР АККАУНТА
  51. object.purchaseDetails.accountId
  52. КОД ПОДТВЕРЖДЕНИЯ
    или class.customConfirmationCodeLabel
  53. object.purchaseDetails.confirmationCode
  54. НОРМАЛЬНОЕ ЗНАЧЕНИЕ или class.customPurchaseFaceValueLabel
  55. object.purchaseDetails.ticketCost.faceValue
  56. ЦЕНА или class.customPurchasePriceLabel
  57. object.purchaseDetails.ticketCost.purchasePrice
  58. СООБЩЕНИЕ О СКИДКЕ
    или 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

Для полей модуля изображения мы показываем одно и только одно поле модуля изображения из класса и одно и только одно поле модуля изображения из объекта. Если вам нужно более одного поля модуля изображения на любом уровне, переопределите шаблон по умолчанию.

Для полей текстового модуля мы показываем не более 20 полей текстового модуля из класса и 20 полей текстового модуля из объекта. Поля отображаются в том же порядке, в котором они определены в массиве. Если вам нужно более 20 полей текстового модуля на любом уровне, переопределите шаблон по умолчанию.

Что касается сообщений, мы показываем максимум 20 сообщений от класса и 20 сообщений от объекта. Мы не гарантируем порядок сообщений. Если вам нужно более 20 сообщений на любом уровне или гарантия на какие-либо заказы, переопределите шаблон по умолчанию.

Для поля модуля ссылок ограничения на количество URI, которые вы можете определить, отсутствуют. Uris отображаются сгруппированными в следующем порядке для каждого уровня (класса или объекта):

  1. Координаты карты
  2. Телефонные номера
  3. Адреса электронной почты
  4. Веб-страницы

Для каждой группы URI отображаются в том же порядке, в котором они определены в массиве. Если вам нужен другой порядок, переопределите шаблон по умолчанию.

Элементы шаблона списка по умолчанию
  1. ( object.ticketLeg.originName
    и object.ticketLeg.destinationName )
    или ( object.ticketLeg.originStationCode
    и object.ticketLeg.destinationStationCode )
    или object.ticketLeg.originName
  2. object.ticketLeg.departureDateTime
    или object.validTimeInterval.end.date
  3. class.logo
  4. object.hexBackgroundColor
    или class.hexBackgroundColor
  5. <# проходов> (сгруппировано)