תבנית הצעה

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

הגדרת התבנית

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

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

Android

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

פיתוח אתרים

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

כותרת הכרטיס

Android

פריסת רכיבים של כותרת הכרטיס ומיקומי השדות Default card title
  1. class.titleImage
  2. class.localizedIssuerName
    או class.issuerName
  3. class.localizedTitle
    או class.title
  4. class.hexBackgroundColor

Wide-logo card title
  1. class.wideTitleImage
  2. class.localizedTitle
    או class.title
  3. class.hexBackgroundColor

פיתוח אתרים

פריסת רכיבים של כותרת הכרטיס ומיקומי השדות Default card title
  1. class.titleImage
  2. class.localizedIssuerName
    או class.issuerName
  3. class.localizedTitle
    או class.title
  4. class.hexBackgroundColor

Wide-logo card title
  1. class.wideTitleImage
  2. class.localizedTitle
    או class.title
  3. class.hexBackgroundColor

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

כשמגדירים את שדה הלוגו הרחב, במכשירי 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
  4. object.barcode.alternateText
    או object.barcode.value
  5. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .firstBottomDetail
  6. object.heroImage
    או class.heroImage

פיתוח אתרים

פריסת ברקודים בכרטיס – רכיבים ומיקומים
  1. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .firstTopDetail
  2. class.classTemplateInfo
      .cardBarcodeSectionDetails
      .secondTopDetail
  3. object.barcode.type וגם
    object.barcode.value
  4. object.barcode.alternateText
    או object.barcode.value
  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[3].item
  • ...

פיתוח אתרים

הקטעים והפריטים התחתונים בתבנית הפרטים
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[0].item
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[1].item
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[2].item
  • class.classTemplateInfo.detailsTemplateOverride
      .detailsItemInfos[3].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
    

הקוד יוצר כרטיס עם הפורמט הבא בקטע התחתון:

דוגמה לשינוי של קטע בתחתית הדף.

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

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

תבנית רשימה

הצגת רשימה של רכיבי תבנית
  1. class.classTemplateInfo.listTemplateOverride
      .firstRowOption.fieldOption.fields[]
  2. class.classTemplateInfo.listTemplateOverride
      .secondRowOption.fields[]
  3. class.titleImage
  4. class.hexBackgroundColor

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

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

דוגמה לשינוי ברירת המחדל של רשימה.

אפשר להגדיר את שלוש השורות באמצעות בורר שדות. השדות מוצגים ללא תווית.

תוויות

לכל השדות של הנתונים המובנים יש תווית שסופקה על ידי 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.titleImage
  2. class.localizedIssuerName
    או class.issuerName
  3. class.localizedTitle
    או class.title
  4. object.barcode.type and
    object.barcode.value
  5. object.barcode.alternateText
    או object.barcode.value
  6. תפוגה
  7. object.validTimeInterval.end
  8. class.hexBackgroundColor
  9. object.heroImage
    או class.heroImage
  10. FROM
  11. class.localizedProvider
    או class.provider
  12. פרטים
  13. class.localizedDetails
    או class.details
  14. כתב ויתור
  15. class.localizedFinePrint
    או class.finePrint
  16. class.messages[].header
  17. class.messages[].body
  18. object.messages[].header
  19. object.messages[].body
  20. class.textModulesData[0..9].header
  21. class.textModulesData[0..9].body
  22. object.textModulesData[0..9].header
  23. object.textModulesData[0..9].body
  24. class.linksModuleData.uris[].description
  25. object.linksModuleData.uris[].description
  26. class.homepageUri
  27. class.helpUri

פיתוח אתרים

פריסת ברירת המחדל של רכיבי התבנית של הכרטיס
  1. class.titleImage
  2. class.localizedIssuerName
    או class.issuerName
  3. class.localizedTitle
    או class.title
  4. object.barcode.type and
    object.barcode.value
  5. object.barcode.alternateText
    או object.barcode.value
  6. תפוגה
  7. object.validTimeInterval.end
  8. class.hexBackgroundColor
  9. object.heroImage
    או class.heroImage
  10. FROM
  11. class.localizedProvider
    או class.provider
  12. פרטים
  13. class.localizedDetails
    או class.details
  14. כתב ויתור
  15. class.localizedFinePrint
    או class.finePrint
  16. class.messages[].header
  17. class.messages[].body
  18. object.messages[].header
  19. object.messages[].body
  20. class.textModulesData[0..9].header
  21. class.textModulesData[0..9].body
  22. object.textModulesData[0..9].header
  23. object.textModulesData[0..9].body
  24. class.linksModuleData.uris[].description
  25. object.linksModuleData.uris[].description
  26. class.homepageUri
  27. class.helpUri

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

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

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

בשדה של מודול הקישורים, אין הגבלה על מספר כתובות ה-URI שאפשר להגדיר. כתובות ה-URI מוצגות בקבוצות לפי הסדר הבא לכל רמה (כיתה או אובייקט):

  1. קואורדינטות במפה
  2. מספרי טלפון
  3. כתובות אימייל
  4. דפי אינטרנט

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

פריסת ברירת המחדל של רכיבי התבנית של הרשימה ומיקומם
  1. class.localizedIssuerName
    או class.issuerName
  2. class.localizedShortTitle
    או class.shortTitle
    או class.localizedTitle
    או class.title
  3. class.titleImage
  4. class.hexBackgroundColor