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

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

הגדרת התבנית

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

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

Android

סקירה כללית של הפריסה של תבניות כרטיסים ומיקומים

פיתוח אתרים

סקירה כללית של הפריסה של תבניות כרטיסים ומיקומים

כותרת הכרטיס

Android

פריסת רכיבים של כותרת הכרטיס ומיקומי השדות Default card title
  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

Wide-logo card title
  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

פיתוח אתרים

פריסת רכיבים של כותרת הכרטיס ומיקומי השדות Default card title
  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

Wide-logo card title
  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 הכותרת של תבנית ברירת המחדל עם הלוגו ושם הגורם המנפיק מוחלפת בלוגו הרחב.

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

תבנית כרטיס

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

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

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. סיאט או class.customSeatLabel
  8. object.ticketLegs[i].ticketSeat.seat
    או object.ticketLegs[i].ticketSeat.seatAssignment
    או object.ticketLegs[i].ticketSeats[*].seat
    או object.ticketLegs[i].ticketSeats[*].seatAssignment
    או NO SPECIFIC SEAT
  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 (grouped)
    או class.classTemplateInfo.listTemplateOverride
      .secondRowOption.fields[]
  3. class.logo
  4. object.hexBackgroundColor
    או class.hexBackgroundColor
  5. <# passes> (grouped)

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

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

תוויות

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

אפשר להתאים אישית חלק מהתוויות האלה באמצעות אחד משדות 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]

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

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

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. PASSENGER
  9. object.passengerNames
  10. CARRIAGE או class.customCarriageLabel
  11. object.ticketLeg.carriage
  12. ‫COACH או class.customCoachLabel
  13. object.ticketLeg.ticketSeat.coach
  14. סיאט או 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. DEPARTURE
  25. object.ticketLeg.departureDateTime
  26. ARRIVAL
  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. ROUTE RESTRICTIONS
    or 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. PASSENGER
  9. object.passengerNames
  10. CARRIAGE או class.customCarriageLabel
  11. object.ticketLeg.carriage
  12. ‫COACH או class.customCoachLabel
  13. object.ticketLeg.ticketSeat.coach
  14. סיאט או 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. DEPARTURE
  25. object.ticketLeg.departureDateTime
  26. ARRIVAL
  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. ROUTE RESTRICTIONS
    or 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 שאפשר להגדיר. כתובות ה-URI מוצגות בקבוצות לפי הסדר הבא לכל רמה (כיתה או אובייקט):

  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. <# passes> (grouped)