Tiện ích bài đăng Blog1 có thể coi là bộ xương sống của template, nó chứa toàn bộ dữ liệu về bài đăng, ngày giờ, tiêu đề, nhận xét,...Vậy bạn đã biết được bao nhiêu % về nó, hãy cùng tôi tìm hiểu trong bài viết này
Tại thời điểm viết bài, blogger đã cho ra mắt 3 layout version template và 2 version widget. Theo đó Layout v1 và v2 sẽ sử dụng widget Blog1 v1, và Layout v3 sẽ sử dụng widget Blog1 v2. Đây là cách phân biệt widget v1 và v2
2 version sẽ có cấu trúc khác nhau và các thẻ gọi dữ liệu cũng khác nhau
Cấu trúc json của chúng như sau
Blog widget v1
"data": { "widget": { "type": "Blog", "version": 1 }, "title": string, "description": string, "numPosts": number, "languageCode": string, "mobile": boolean, "postLabelsLabel": string, "timestampLabel": string, "authorLabel": string, "commentLabel": string, "commentLabelPlural": string, "postLocationLabel": string, "reactionsLabel": string, "showTimestamp": boolean, "showLocation": boolean, "showAuthor": boolean, "showPostLabels": boolean, "showReactions": boolean, "showDummy": boolean, "showPlusOne": boolean, "showMobileShare": boolean, "showEmailButton": boolean, "showBlogThisButton": boolean, "showTwitterButton": boolean, "showFacebookButton": boolean, "showPinterestButton": boolean, "olderPageUrl": URL, "olderPageTitle": string, "newerPageUrl": URL, "newerPageTitle": string, "mobileLinkUrl": string, "mobileLinkMsg": string, "desktopLinkUrl": string, "desktopLinkMsg": string, "homeMsg": string, "navMessage": string, "postCommentMsg": string, "blogCommentMessage": string, "blogTeamBlogMessage": string, "feedLinksMsg": string, "commentPostedByMsg": string, "shareMsg": string, "shareToTwitterMsg": string, "shareToFacebookMsg": string, "shareToPinterestMsg": string, "blogThisMsg": string, "emailThisMsg": string, "emailPostMsg": string, "editPostMsg": string, "deleteCommentMsg": string, "adCode": string, "cmtIframeInitialHeight": string, "showCmtPopup": boolean, "feedLinks": [{ "url": string, "name": string, "feedType": string, "mimeType": string }], "posts": [{ "id": string, "title": string, "body": string, "snippet": string, "longSnippet": string, "url": URL, "link": string, "thumbnailUrl": string, "firstImageUrl": string, "date": string, "dateHeader": string, "timestamp": string, "timestampISO8601": string, "lastUpdatedISO8601": string, "author": string, "authorUrl": string, "authorProfileUrl": string, "authorAboutMe": string, "authorPhoto": { "url": string, "width": number, "height": number }, "hasJumpLink": boolean, "jumpText": string, "isFirstPost": boolean, "isDateStart": boolean, "adminClass": string, "editUrl": string, "allowComments": boolean, "allowNewComments": boolean, "noNewCommentsText": string, "numComments": number, "commentLabelFull": string, "addCommentUrl": URL, "addCommentOnclick": string, "commentPagingRequired": boolean, "hasOlderLinks": boolean, "oldLinkClass": string, "oldestLinkUrl": URL, "oldestLinkText": string, "olderLinkUrl": URL, "olderLinkText": string, "hasNewerLinks": boolean, "newLinkClass": string, "newerLinkUrl": URL, "newerLinkText": string, "newestLinkUrl": URL, "newestLinkText": string, "commentRangeText": string, "commentFormIframeSrc": string, "embedCommentForm": boolean, "showThreadedComments": boolean, "commentSrc": string, "commentFeed": URL, "commentJso": string, "commentHtml": string, "commentMsgs": string, "commentConfig": string, "avatarIndentClass": string, "includeAd": boolean, "allowIframeComments": boolean, "iframeCommentSrc": string, "viewType": string, "commentSource": number, "dummyTag": string, "googlePlusShareTag": string, "emailPostUrl": string, "sharePostUrl": string, "reactionsUrl": string, "cmtfpIframe": string, "appRpcRelayPath": string, "location": { "mapsUrl": string, "name": string }, "labels": [{ "name": string, "url": URL, "isLast": boolean }], "feedLinks": [{ "url": string, "name": string, "feedType": string "mimeType": string }], "comments": [{ "id": string, "inReplyTo": string, "cmtBodyIdPostfix": string, "url": string, "body": string, "timestamp": string, "timestampValue": number, "timestampAbs": number, "author": string, "authorUrl": string, "authorPhoto": { "url": string, "width": number, "height": number }, "favicon": string, "authorAvatarSrc": string, "authorAvatarImage": string, "anchorName": string, "deleteUrl": string, "isDeleted": boolean, "adminClass": string, "authorClass": string }], "enclosures": [{ "url": string, "mimeType": string }] }] }
Blog widget v2
"data": { "widget": { "type": "Blog", "version": 2 }, "title": string, "description": string, "languageCode": string, "olderPageUrl": URL, "newerPageUrl": URL, "navMessage": string, "adCode": string, "adClientId": string, "cmtIframeInitialHeight": string, "showCmtPopup": boolean, "messages": { "blogComment": string }, "feedLinks": [{ "url": string, "name": string, "feedType": string, "mimeType": string }], "posts": [{ "id": string, "title": string, "body": string, "snippets": { "long": string, "short": string }, "url": URL, "link": string, "thumbnailUrl": string, "featuredImage": image, "date": date, "lastUpdated": date, "author": { "name": string, "profileUrl": string, "aboutMe": string, "authorPhoto": { "image": image, "width": number, "height": number }, }, "hasJumpLink": boolean, "adminClass": string, "postAuthorClass": string, "allowComments": boolean, "allowNewComments": boolean, "noNewCommentsText": string, "numberOfComments": number, "commentsUrl": URL, "commentsUrlOnclick": string, "commentPagingRequired": boolean, "hasOlderLinks": boolean, "oldLinkClass": string, "oldestLinkUrl": URL, "olderLinkUrl": URL, "hasNewerLinks": boolean, "newLinkClass": string, "newerLinkUrl": URL, "newestLinkUrl": URL, "commentRangeText": string, "commentFormIframeSrc": string, "embedCommentForm": boolean, "showThreadedComments": boolean, "commentSrc": string, "commentFeed": string, "commentJso": string, "commentHtml": string, "commentMsgs": string, "commentConfig": string, "avatarIndentClass": string, "includeAd": boolean, "adNumber": number, "allowIframeComments": boolean, "iframeCommentSrc": string, "viewType": string, "commentSource": number, "emailPostUrl": string, "shareUrl": string, "reactionsUrl": URL, "cmtfpIframe": string, "appRpcRelayPath": string, "location": { "mapsUrl": string, "name": string }, "labels": [{ "name": string, "url": URL, }], "feedLinks": [{ "url": string, "name": string, "feedType": string, "mimeType": string }], "comments": [{ "id": string, "inReplyTo": string, "cmtBodyIdPostfix": string, "url": string, "body": string, "timestamp": string, "timestampValue": number, "timestampAbs": number, "author": string, "authorUrl": string, "authorUserType": string, "authorPhoto": { "url": string, "width": number, "height": number }, "authorAvatarSrc": string, "authorAvatarImage": string, "anchorName": string, "deleteUrl": string, "isDeleted": boolean, "adminClass": string, }], "enclosures": [{ "url": string, "mimeType": string }] }] }
Blog widget v1
<b:widget id='Blog1' title='' type='Blog' version='1'> <b:includable id='main'> <data:title/> <data:description/> <data:numPosts/> <data:languageCode/> <data:mobile/> <data:postLabelsLabel/> <data:timestampLabel/> <data:authorLabel/> <data:commentLabel/> <data:commentLabelPlural/> <data:postLocationLabel/> <data:reactionsLabel/> <data:showTimestamp/> <data:showLocation/> <data:showAuthor/> <data:showPostLabels/> <data:showReactions/> <data:showDummy/> <data:showPlusOne/> <data:showMobileShare/> <data:showEmailButton/> <data:showBlogThisButton/> <data:showTwitterButton/> <data:showFacebookButton/> <data:showPinterestButton/> <data:olderPageUrl/> <data:olderPageTitle/> <data:newerPageUrl/> <data:newerPageTitle/> <data:mobileLinkUrl/> <data:mobileLinkMsg/> <data:desktopLinkUrl/> <data:desktopLinkMsg/> <data:homeMsg/> <data:navMessage/> <data:postCommentMsg/> <data:blogCommentMessage/> <data:blogTeamBlogMessage/> <data:feedLinksMsg/> <data:commentPostedByMsg/> <data:shareMsg/> <data:shareToTwitterMsg/> <data:shareToFacebookMsg/> <data:shareToPinterestMsg/> <data:blogThisMsg/> <data:emailThisMsg/> <data:emailPostMsg/> <data:editPostMsg/> <data:deleteCommentMsg/> <data:adCode/> <data:cmtIframeInitialHeight/> <data:showCmtPopup/> <b:loop values='data:feedLinks' var='feedLink'> <data:feedLink.url/> <data:feedLink.name/> <data:feedLink.feedType/> <data:feedLink.mimeType/> </b:loop> <b:loop values='data:posts' var='post'> <data:post.id/> <data:post.title/> <data:post.body/> <data:post.snippet/> <data:post.longSnippet/> <data:post.url/> <data:post.link/> <data:post.thumbnailUrl/> <data:post.firstImageUrl/> <data:post.date/> <data:post.dateHeader/> <data:post.timestamp/> <data:post.timestampISO8601/> <data:post.lastUpdatedISO8601/> <data:post.author/> <data:post.authorUrl/> <data:post.authorProfileUrl/> <data:post.authorAboutMe/> <data:post.authorPhoto.url/> <data:post.authorPhoto.width/> <data:post.authorPhoto.height/> <data:post.hasJumpLink/> <data:post.jumpText/> <data:post.isFirstPost/> <data:post.isDateStart/> <data:post.adminClass/> <data:post.editUrl/> <data:post.allowComments/> <data:post.allowNewComments/> <data:post.noNewCommentsText/> <data:post.numComments/> <data:post.commentLabelFull/> <data:post.addCommentUrl/> <data:post.addCommentOnclick/> <data:post.commentPagingRequired/> <data:post.hasOlderLinks/> <data:post.oldLinkClass/> <data:post.oldestLinkUrl/> <data:post.oldestLinkText/> <data:post.olderLinkUrl/> <data:post.olderLinkText/> <data:post.hasNewerLinks/> <data:post.newLinkClass/> <data:post.newerLinkUrl/> <data:post.newerLinkText/> <data:post.newestLinkUrl/> <data:post.newestLinkText/> <data:post.commentRangeText/> <data:post.commentFormIframeSrc/> <data:post.embedCommentForm/> <data:post.showThreadedComments/> <data:post.commentSrc/> <data:post.commentFeed/> <data:post.commentJso/> <data:post.commentHtml/> <data:post.commentMsgs/> <data:post.commentConfig/> <data:post.avatarIndentClass/> <data:post.includeAd/> <data:post.allowIframeComments/> <data:post.iframeCommentSrc/> <data:post.viewType/> <data:post.commentSource/> <data:post.dummyTag/> <data:post.googlePlusShareTag/> <data:post.emailPostUrl/> <data:post.sharePostUrl/> <data:post.reactionsUrl/> <data:post.cmtfpIframe/> <data:post.appRpcRelayPath/> <data:post.location.mapsUrl/> <data:post.location.name/> <b:loop values='data:labels' var='label'> <data:label.name/> <data:label.url/> <data:label.isLast/> </b:loop> <b:loop values='data:feedLinks' var='feedLink'> <data:feedLink.url/> <data:feedLink.name/> <data:feedLink.feedType/> <data:feedLink.mimeType/> </b:loop> <b:loop values='data:comments' var='comment'> <data:comment.id/> <data:comment.inReplyTo/> <data:comment.cmtBodyIdPostfix/> <data:comment.url/> <data:comment.body/> <data:comment.timestamp/> <data:comment.timestampValue/> <data:comment.timestampAbs/> <data:comment.author/> <data:comment.authorUrl/> <data:comment.authorPhoto.url/> <data:comment.authorPhoto.width/> <data:comment.authorPhoto.height/> <data:comment.favicon/> <data:comment.authorAvatarSrc/> <data:comment.authorAvatarImage/> <data:comment.anchorName/> <data:comment.deleteUrl/> <data:comment.isDeleted/> <data:comment.adminClass/> <data:comment.authorClass/> </b:loop> <b:loop values='data:enclosures' var='enclosure'> <data:enclosure.url/> <data:enclosure.mimeType/> </b:loop> </b:loop> </b:includable> </b:widget>
Blog widget v2
<b:widget id='Blog1' title='' type='Blog' version='2'> <b:includable id='main'> <data:title/> <data:description/> <data:languageCode/> <data:olderPageUrl/> <data:newerPageUrl/> <data:navMessage/> <data:adCode/> <data:adClientId/> <data:cmtIframeInitialHeight/> <data:showCmtPopup/> <data:messages.blogComment/> <b:loop values='data:feedLinks' var='feedLink'> <data:feedLink.url/> <data:feedLink.name/> <data:feedLink.feedType/> <data:feedLink.mimeType/> </b:loop> <b:loop values='data:posts' var='post'> <data:post.id/> <data:post.title/> <data:post.body/> <data:post.snippets.short/> <data:post.snippets.long/> <data:post.url/> <data:post.link/> <data:post.thumbnailUrl/> <data:post.featuredImage/> <data:post.date/> <data:post.lastUpdated/> <data:post.author.name/> <data:post.author.profileUrl/> <data:post.author.aboutMe/> <data:post.author.authorPhoto.image/> <data:post.author.authorPhoto.width/> <data:post.author.authorPhoto.height/> <data:post.hasJumpLink/> <data:post.adminClass/> <data:post.postAuthorClass/> <data:post.allowComments/> <data:post.allowNewComments/> <data:post.noNewCommentsText/> <data:post.numberOfComments/> <data:post.commentsUrl/> <data:post.commentsUrlOnclick/> <data:post.commentPagingRequired/> <data:post.hasOlderLinks/> <data:post.oldLinkClass/> <data:post.oldestLinkUrl/> <data:post.olderLinkUrl/> <data:post.hasNewerLinks/> <data:post.newLinkClass/> <data:post.newerLinkUrl/> <data:post.newestLinkUrl/> <data:post.commentRangeText/> <data:post.commentFormIframeSrc/> <data:post.embedCommentForm/> <data:post.showThreadedComments/> <data:post.commentSrc/> <data:post.commentFeed/> <data:post.commentJso/> <data:post.commentHtml/> <data:post.commentMsgs/> <data:post.commentConfig/> <data:post.avatarIndentClass/> <data:post.includeAd/> <data:post.adNumber/> <data:post.allowIframeComments/> <data:post.iframeCommentSrc/> <data:post.viewType/> <data:post.commentSource/> <data:post.emailPostUrl/> <data:post.shareUrl/> <data:post.reactionsUrl/> <data:post.cmtfpIframe/> <data:post.appRpcRelayPath/> <data:post.location.mapsUrl/> <data:post.location.name/> <b:loop values='data:labels' var='label'> <data:label.name/> <data:label.url/> </b:loop> <b:loop values='data:feedLinks' var='feedLink'> <data:feedLink.url/> <data:feedLink.name/> <data:feedLink.feedType/> <data:feedLink.mimeType/> </b:loop> <b:loop values='data:comments' var='comment'> <data:comment.id/> <data:comment.inReplyTo/> <data:comment.cmtBodyIdPostfix/> <data:comment.url/> <data:comment.body/> <data:comment.timestamp/> <data:comment.timestampValue/> <data:comment.timestampAbs/> <data:comment.author/> <data:comment.authorUrl/> <data:comment.authorUserType/> <data:comment.authorPhoto.url/> <data:comment.authorPhoto.width/> <data:comment.authorPhoto.height/> <data:comment.authorAvatarSrc/> <data:comment.authorAvatarImage/> <data:comment.anchorName/> <data:comment.deleteUrl/> <data:comment.isDeleted/> <data:comment.adminClass/> </b:loop> <b:loop values='data:enclosures' var='enclosure'> <data:enclosure.url/> <data:enclosure.mimeType/> </b:loop> </b:loop> </b:includable> </b:widget>
Ví dụ lấy dữ liệu: tôi muốn lấy tên và avatar của tác giả thì sẽ gọi code như sau
+ Với v1
<b:includable id='post' var='post'> ... <!-- Lấy avatar --> <img expr:src='data:post.authorPhoto.url'/> <!-- Lấy tên tác giả --> <data:post.author/> ... </b:includable>
+ Với v2
<b:includable id='post' var='post'> ... <!-- Lấy avatar --> <img expr:src='data:post.author.authorPhoto.image'/> <!-- Lấy tên tác giả --> <data:post.author.name/> ... </b:includable>
Cả 2 đều cho ta cùng 1 kết quả nhưng có thể thấy thẻ gọi dữ liệu khác rất nhiều, vì thế cậu nào mà muốn nâng v1 lên v2 mà lơ mơ phần này thì không kham nổi đâu :))
Như vậy tôi qua bài viết này tôi đã cung cấp cho các bạn tất cả các thẻ gọi dữ liệu trong tiện ích Blog1 với cả 2 version, nắm chắc được chúng bạn có thể làm được rất nhiều thứ hay ho đó
Good Luck !
1. Không vi phạm luật pháp nước CHXHCN Việt Nam
2. Không vi phạm thuần phong mỹ tục Việt Nam
3. Không bàn luận vấn đề liên quan đến tôn giáo, chính trị
4. Không đả kích, chửi bới hay đưa ra những lời nói không phù hợp với mục tiêu của website
5. Không bình luận với mục đích quảng cáo, trao đổi, mua bán
6. Khuyến khích sử dụng Tiếng Việt có dấu, hạn chế sử dụng tiếng lóng, viết tắt
7. Khi cần sự trợ giúp, vui lòng miêu tả chi tiết lỗi và để lại link đính kèm, tránh nói chung chung gây mất thời gian cho đôi bên