الگوی عبور حمل و نقل

Transit passها از رندرینگ قالب پشتیبانی می‌کنند. اگر هیچ قالبی تعریف نشود، از قالب پیش‌فرض استفاده می‌شود.

تعریف الگو

یک الگوی گذر (pass template) در سطح کلاس تعریف می‌شود و برای نمایش هر شیء مرتبط با کلاس استفاده می‌شود. این الگو تعریف می‌کند که کدام فیلدها در بخش‌های مختلف گذر نمایش داده شوند.

قالب به بخش‌های زیر تقسیم می‌شود:

اندروید

مروری بر بخش‌ها و موقعیت‌های طرح‌بندی الگوی عبور

وب

مروری بر بخش‌ها و موقعیت‌های طرح‌بندی الگوی عبور

عنوان کارت

اندروید

عناصر طرح‌بندی عنوان کارت و موقعیت فیلدها عنوان پیش‌فرض کارت
  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[] استفاده کنید. هم مبدا و هم مقصد باید تعریف شوند. نام‌ها یا کدهای ایستگاه، یا هر دو، باید به طور مداوم در هر مرحله استفاده شوند. مبدا نمایش داده شده، مبدا اولین عنصر در آرایه است، در حالی که مقصد نمایش داده شده، مقصد آخرین عنصر در آرایه است.

رنگ پس‌زمینه‌ی گذرگاه یک فیلد الزامی نیست و می‌تواند هم در سطح کلاس و هم در سطح شیء تعریف شود. فیلد شیء اولویت بالاتری دارد و می‌توان از آن برای لغو فیلد کلاس استفاده کرد.

وقتی فیلد لوگوی عریض تنظیم می‌شود، در دستگاه‌های اندروید، سربرگ پیش‌فرض قالب که شامل لوگو و نام صادرکننده است، با لوگوی عریض جایگزین می‌شود.

هنگام ایجاد لوگوی هدر عریض خود ، دستورالعمل‌های تصویر لوگوی عریض را دنبال کنید تا تصویر شما به طور بهینه در صفحات شما نمایش داده شود.

الگوی کارت

اندروید

عناصر طرح‌بندی ردیف قالب کارت و موقعیت‌های فیلد

وب

عناصر طرح‌بندی ردیف قالب کارت و موقعیت‌های فیلد

بخش قالب کارت برای نمایش ردیف‌های اضافی استفاده می‌شود. این ردیف‌ها می‌توانند شامل فیلدهای داده ساختاریافته مبتنی بر متن یا فیلدهای ماژول متنی باشند.

شما می‌توانید تعداد ردیف‌هایی را که تعداد اشیاء موجود در لیست 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']"));
              }
            })))
          ));
          }
  })))
    

پی اچ پی

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

پی اچ پی

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

پی اچ پی

    //... 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. <# عبور> (گروه‌بندی شده)

بخش الگوی فهرست برای انتخاب فیلدی که در نمای «گذرنامه‌ها»ی برنامه‌ی کیف پول گوگل نمایش داده شود، استفاده می‌شود. گذرنامه در فهرست با لوگو، رنگ پس‌زمینه و سه ردیف نمایش داده می‌شود.

نمونه کد زیر نحوه‌ی بازنویسی الگوی فهرست یک گذر را برای نمایش فیلد تاریخ انقضای شیء یک گذر در ردیف اول الگوی فهرست نشان می‌دهد:

پایتون

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

پی اچ پی

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

ردیف‌های دوم و سوم فقط با انتخابگر فیلد قابل تعریف هستند. فیلدها بدون برچسب نمایش داده می‌شوند. برای بلیط‌های گروهی، ردیف دوم همیشه تاریخ حرکت و ردیف سوم همیشه تعداد بلیط‌های گروه‌بندی شده را نشان می‌دهد.

برچسب‌ها

تمام فیلدهای داده‌های ساختاریافته دارای برچسبی هستند که توسط گوگل ارائه می‌شود. گوگل مسئول ارائه ترجمه برای هر یک از این برچسب‌ها در تمام زبان‌های پشتیبانی‌شده است.

شما می‌توانید برخی از این برچسب‌ها را با استفاده از یکی از فیلدهای class.custom<name_of_the_field>Label سفارشی کنید. وقتی یک برچسب را سفارشی می‌کنید، مسئول ارائه ترجمه برای آن برچسب خاص به تمام زبان‌هایی هستید که می‌خواهید پشتیبانی شوند.

ارجاعات میدانی

ارجاعات فیلد در بخش‌های مختلف قالب با فرم class.classTemplateInfo.*.fields[] استفاده می‌شوند. یک ارجاع فیلد شامل فهرستی از مسیرها به فیلدهای داده ساختاریافته، فیلدهای ماژول متن، فیلدهای ماژول لینک، فیلدهای ماژول تصویر یا پیام‌ها است.

همه انواع مسیرها در هر ارجاع فیلد مجاز نیستند. برای مثال، برخی از ارجاعات فیلد فقط مسیرهایی را برای فیلدهای داده ساختاریافته مبتنی بر متن یا فیلدهای ماژول متنی مجاز می‌دانند. فیلدهای ساختاریافته مبتنی بر متن، فیلدهای داده ساختاریافته از نوع رشته، رشته محلی، تاریخ یا پول هستند.

این لیست می‌تواند برای پیاده‌سازی یک منطق بازگشتی استفاده شود. این بدان معناست که اگر اولین مسیر در لیست به یک فیلد خالی ختم شود، مسیر بعدی ارزیابی می‌شود. منطق بازگشتی عمدتاً فیلدهای داده ساختاریافته مبتنی بر متن یا فیلدهای ماژول متنی را هدف قرار می‌دهد. انواع مختلف فیلدها را در یک لیست با هم مخلوط نکنید. از منطق بازگشتی با احتیاط و فقط در موقعیت‌های خاص استفاده کنید، زمانی که انتظار دارید الگوی ثابتی از فیلدها وجود داشته باشد که در برخی اشیاء وجود دارند اما در برخی دیگر وجود ندارند. اغلب اوقات، ایجاد کلاس‌های جداگانه برای موارد استفاده جداگانه آسان‌تر است.

اگر همه مسیرهای موجود در فهرست ارجاعات فیلد به فیلدهای خالی تبدیل شوند، آیتمی که از ارجاع فیلد استفاده می‌کند نمایش داده نمی‌شود. اگر می‌خواهید آیتمی که از ارجاع فیلد استفاده می‌کند همیشه وجود داشته باشد، مطمئن شوید که حداقل یک مسیر خالی نباشد. توصیه می‌کنیم برای نمایش مقدار null در فیلد، از کاراکتر خاصی مانند '-' استفاده کنید، حتی اگر برخی از فیلدها رشته‌هایی با فقط یک فاصله را مجاز بدانند.

برای ارجاع به یک فیلد موجود در یک لیست، می‌توانید از اندیس فیلد در لیست یا در بیشتر موارد، از یک شناسه مرجع استفاده کنید. مواردی از یک لیست که می‌توانند توسط شناسه ارجاع داده شوند، دارای یک فیلد .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. PLATFORM یا class.customPlatformLabel
  31. object.ticketLeg.platform
  32. ZONE یا 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. PLATFORM یا class.customPlatformLabel
  31. object.ticketLeg.platform
  32. ZONE یا 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

برای فیلدهای ماژول تصویر، ما یک و فقط یک فیلد ماژول تصویر از کلاس و یک و فقط یک فیلد ماژول تصویر از شیء را نشان می‌دهیم. اگر در هر سطح به بیش از یک فیلد ماژول تصویر نیاز دارید، الگوی پیش‌فرض را لغو کنید.

برای فیلدهای ماژول متنی، ما فقط حداکثر ۲۰ فیلد ماژول متنی از کلاس و ۲۰ فیلد ماژول متنی از شیء را نشان می‌دهیم. فیلدها به همان ترتیبی که در آرایه تعریف شده‌اند نمایش داده می‌شوند. اگر به بیش از ۲۰ فیلد ماژول متنی در هر سطح نیاز دارید، الگوی پیش‌فرض را لغو کنید.

برای پیام‌ها، ما فقط حداکثر ۲۰ پیام از کلاس و ۲۰ پیام از شیء را نشان می‌دهیم. ما ترتیب پیام‌ها را تضمین نمی‌کنیم. اگر به بیش از ۲۰ پیام در هر سطح یا تضمینی برای هر سفارشی نیاز دارید، الگوی پیش‌فرض را لغو کنید.

برای فیلد ماژول لینک‌ها، هیچ محدودیتی در تعداد 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. <# عبور> (گروه‌بندی شده)