תבנית של כרטיס לתחבורה ציבורית

כרטיסים לתחבורה ציבורית תומכים בעיבוד תבניות. אם לא הוגדרה תבנית, המערכת תשתמש בתבנית ברירת המחדל.

הגדרת התבנית

תבנית העברה מוגדרת ברמת הכיתה, ומשמשת להצגת כל אובייקט שמשויך למחלקה. התבנית מגדירה אילו שדות יוצגו בקטעים שונים של הכרטיס.

התבנית מחולקת לקטעים הבאים:

Android

סקירה כללית של התבניות

אתרים

סקירה כללית של התבניות

שם הכרטיס

Android

רכיבי כותרת הכרטיס כותרת ברירת המחדל של הכרטיס
  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

בקטע של שם הכרטיס מוצגים הלוגו, השם של חברת התחבורה הציבורית וסיכום הנסיעה. כל שלושת הרכיבים האלה הם שדות חובה, ולא ניתן לשנות את ההפניות לשדה המשמשות לאכלוס הנתונים או לשנות את המיקום שלהם.

עם זאת, לוגיקת הרינדור מאפשרת גמישות מסוימת בשורה העליונה. השורה העליונה של המעבר, שמייצגת את סיכום התהליך, נשלטת באמצעות השדות הבאים ב-TransitObject לנסיעה עם רגל אחת:

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

אופן עיבוד הכרטיס תלוי בשדות שאינם ריקים. אפשר לעבד אותו בדרכים הבאות:

  • שם נקודת המוצא בלבד: שם המקור הוא המידע היחיד שמוצג. האפשרות הזו שימושית במיוחד לכרטיסים שמכסים אזור מסוים ולא נסיעה ספציפית.
  • מוצא ויעד: המקור נמצא בצד שמאל והיעד נמצא בצד ימין. הסמל שמופיע בין שניהם תלוי בסוג הנסיעה. המוצא והיעד מוצגים בהתאם לאחד מהבאים:
    • שמות וקודים של תחנות: אנחנו מציגים את קודי התחנות עם השמות כטקסט קטן יותר בחלק העליון.
    • שמות בלבד: השמות יוצגו לנו.
    • קודי תחנות בלבד: אנחנו מציגים את קודי התחנה.

אובייקטים מסוג TransitObject עם כמה רגליים פועלים באופן דומה מאוד. במקרה כזה, אין להשתמש ב-object.ticketLeg. במקום זאת, צריך להשתמש ברשימה של object.ticketLegs[]. יש להגדיר גם מקורות וגם יעדים. חובה להשתמש בשמות או בקודים של התחנות, או את שניהם, באופן עקבי בכל רגל. המקור המוצג הוא המקור של הרכיב הראשון במערך, בעוד שהיעד המוצג הוא היעד של הרכיב האחרון במערך.

צבע הרקע של הכרטיס אינו שדה חובה וניתן להגדיר אותו גם ברמת המחלקה וגם ברמת האובייקט. לשדה האובייקט יש עדיפות גבוהה יותר וניתן להשתמש בו כדי לשנות את השדה מחלקה.

אם מוגדר שדה לוגו רחב, במכשירי Android, כותרת ברירת המחדל של התבנית עם הלוגו ושם המנפיק מוחלפת בלוגו הרחב.

כדי להציג את התמונה בכרטיסים שלך, צריך לפעול לפי ההנחיות לגבי תמונות לוגו רחבות כשיוצרים לוגו עם הכותרת הרחבה.

תבנית של כרטיס

Android

סקירה כללית של התבניות

אתרים

סקירה כללית של התבניות

הקטע של תבנית הכרטיס משמש להצגת שורות נוספות. השורות האלה יכולות להכיל שדות של נתונים מובְנים שמבוססים על טקסט או שדות של מודולי טקסט.

אפשר לציין את מספר השורות שמגדירות את מספר האובייקטים ברשימה class.classTemplateInfo.cardTemplateOverride.cardRowTemplateInfos[]. ברשימה צריך להיות לפחות רכיב אחד, ומומלץ להשתמש בשני רכיבים לכל היותר. כל רכיב חייב להיות מאחד מהסוגים הבאים:

  • oneItem, שמקבלת פריט אחד:
    • item
  • twoItems, שמקבלים שני פריטים:
    • startItem
    • endItem
  • threeItems, מקבלים שלושה פריטים:
    • startItem
    • middleItem
    • endItem

ניתן להגדיר כל פריט כבורר שדה יחיד (.firstValue), כשני בוררי שדות (.firstValue ו-.secondValue) או כפריט מוגדר מראש (.predefinedItem). הערכים של השדה שנבחר והתוויות התואמות שלהם מוצגות. כשמגדירים שני בוררי שדות, הערכים בשדות שנבחרו מוצגים עם מפריד '/'. אותו עיקרון חל על התוויות של השדות שנבחרו. פריטים מוגדרים מראש משמשים להגדרת רינדור מורכב יותר.

דוגמת הקוד הבאה ממחישה איך לשנות את קטעי השורה של כרטיסי התבנית של הכרטיסים כדי לציין שתי שורות. כל שורה כוללת שלושה פריטים שכל אחד מהם מפנה לשישה שדות מותאמים אישית של textModuleData ברמת הכיתה, ואת הכותרות שלהם כתוויות:

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

הקוד יוצר כרטיס בפורמט הבא של קטע תבנית הקוד:

דוגמה לשינוי תווית.

אם פריט ריק, הוא לא יוצג. פרטים נוספים זמינים במאמר הפניות של שדות. אם כל הפריטים בשורה ריקים, השורה לא תוצג. אם חלק מהפריטים בשורה ריקים, אך לא כולם, הפריטים שאינם ריקים יאורגנו מחדש ויוצגו כשורה עם פחות פריטים.

אם לא משנים את תבנית הכרטיס, המערכת משתמשת במספר ברירת המחדל של השורות, במספר הפריטים שמוגדר כברירת מחדל ובהפניות לשדות שמוגדרים כברירת מחדל. לפרטים נוספים ראו את המאמר תבנית ברירת מחדל.

אחרי שמגדירים תמונה ראשית (Hero), היא יכולה להופיע אחרי השורה הראשונה אם יש כמה שורות ברשימה cardRowTemplateInfos, או מעל השורה אם יש רק אחת.

ברקוד של הכרטיס

Android

רכיבי ברקוד של כרטיס
  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

קטע הברקוד של הכרטיס משמש להצגת טקסט או תמונות נוספים מעל הברקוד ומתחתיו. אף אחד מהשדות בקטע הזה אינו חובה.

יש שלושה בוררי שדות שבהם אפשר להשתמש כדי להגדיר שני שדות זה לצד זה מעל לברקוד ואחד מתחת לברקוד. השדות האלה מוצגים ללא תווית ויכולים להיות שדות של נתונים מובְנים מבוססי-טקסט, שדות של מודול טקסט או שדות של מודול תמונה. אם נעשה שימוש בתמונות, הן צריכות לעמוד בהנחיות המותג.

הברקוד מוגדר לפי סוג וערך. כאן אפשר למצוא רשימה של סוגי הברקודים הנתמכים. בנוסף, ניתן להציג טקסט ממש מתחת לברקוד. הטקסט הזה מאפשר לסרוק ברקודים בקלות, בין היתר.

דוגמת הקוד הבאה מראה איך לעקוף את קטע הברקוד של כרטיס כדי להציג תמונה מעל הברקוד:

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

הקוד יוצר כרטיס בפורמט הבא של קטע הברקוד:

דוגמה לשינוי ברקוד של כרטיס.

אם לא משנים את קטע הברקוד, המערכת תשתמש בשדות הברקוד שמוגדרים כברירת מחדל. מידע נוסף זמין במאמר תבנית ברירת המחדל.

תבנית פרטים

Android

קטעי תבנית &#39;פרטים&#39;
  • מסלול נסיעה רב-רגלי
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[0].item
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[1].item
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[2].item
  • ...

אתרים

קטעי תבנית &#39;פרטים&#39;
  • מסלול נסיעה רב-רגלי
  • 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 אחד עם התווית שלו:

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
    

הקוד יוצר כרטיס בפורמט הבא של קטע הפרטים:

דוגמה לשינוי של פרטים.

אם פריט ריק, הוא לא יוצג. פרטים נוספים זמינים במאמר הפניות של שדות.

אם לא משנים את תבנית הפרטים, מוצגת רשימת ברירת המחדל של שדות העזר לפי סדר ברירת המחדל. מידע נוסף זמין במאמר תבנית ברירת המחדל.

אם המסלול כולל כמה שלבים, מסלול נסיעה פשוט מוצג בחלק העליון של הקטע ולא ניתן להזיז אותו. אם המסלול כולל רק רגל אחת, אפשר להציג מסלול נסיעה פשוט על ידי הגדרת 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. הכרטיס מיוצג ברשימה עם הלוגו, צבע הרקע ושלוש שורות.

דוגמת הקוד הבאה מראה איך לשנות את תבנית הרשימה של כרטיס כדי להציג את שדה תאריך התפוגה של אובייקט בכרטיסים יחידים בשורה הראשונה של תבנית הרשימה:

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
    

הקוד יוצר כרטיס עם עיבוד התבנית הבא של הרשימה:

דוגמה לשינוי רשימה.

אפשר להגדיר את השורה הראשונה באמצעות בורר שדות או להציג את סיכום התהליך. פורמט הסיכום יכול להיות אחד מהבאים:

  • originAndDestinationCodes
  • originAndDestinationNames
  • originName

ניתן להגדיר את השורה השנייה והשלישית רק באמצעות בורר שדות. השדות מוצגים ללא תווית. בכרטיסים מקובצים, בשורה השנייה תמיד יוצג תאריך היציאה, ובשורה השלישית יוצג תמיד מספר האישורים המקובצים.

Labels (תוויות)

לכל השדות של הנתונים המובְנים יש תווית ש-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]

במקרה הזה, הפריט הראשון בקטע הפרטים של הכרטיס הוא התמונה השנייה שמוצהרת באובייקט. הפריט השני בקטע הפרטים של הכרטיס הוא התמונה הראשונה שמוצהרת באובייקט.

תבנית ברירת מחדל

Android

רכיבי תבנית שמוגדרים כברירת מחדל
  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. קארפול או 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. FARE Class או 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. PRICE או class.customPurchasePriceLabel
  57. object.purchaseDetails.ticketCost.purchasePrice
  58. הודעת DISCOUNT
    או 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. קארפול או 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. FARE Class או 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. PRICE או class.customPurchasePriceLabel
  57. object.purchaseDetails.ticketCost.purchasePrice
  58. הודעת DISCOUNT
    או 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. <# כרטיסים> (מקובץ)