Examples of "PageBuilder APIs" -- Roll your own API!
We haven't yet developed Open APIs for all of the information you might want to get out of your Convio system. Noah Cooper developed a technique for bridging the gaps where an S tag can do something that APIs can't! A few weeks ago, he described this system in a Community document. I thought we could also have a thread where we share the simple APIs we've developed based on this technique.
The basic idea is the same for all of them: you need information that only an S-tag (or other Convio template tag) can provide, exposed via a RESTful API. Here's one that I just developed for retrieving Donation campaign information:
]x::::](]]
]x::x]x::
]x::
]x::
{
"errorResponse":
}
::
]:title]]x::
{
"errorResponse":]'."
}
]
}
::
{"getDonationCampaignInfoResponse":{"name":]:title]]]],"goal":]:goal]]]],"amountRaised":]:amountRaised]]]]}}
]]]]
::
{
"errorResponse":
}
]]
::
{
"errorResponse":]'."
}
]
}
]]
]x:::]]
If you drop that into a PageBuilder page, call it "pbAPI", and publish it, you've got yourself a simple PageBuilder API.
If you call the method using the following GET syntax:
You'll get a response:
{"getDonationCampaignInfoResponse":{"name":"General Campaign","goal":"1000000","amountRaised":"573000"}}
The goal and amount raised are in cents, not dollars.
If you use the "callback" feature to return JSONP, then you can use that API like this, on any page--on Convio or off!:
<h2>Campaign Name</h2>
<p id="campaignname"></p>
<h2>Campaign Goal:</h2>
<p id="campaigngoal"></p>
<h2>Amount Raised:</h2>
<p id="campaignamountraised"></p>
<h2><span id="percentraised"></span> raised!</h2><script type="text/javascript" charset="utf-8">
function parseResponse(json) {
var parsedJSON = eval(json); // normally an awful idea but the JSON in question here is quite small
document.getElementById('campaignname').innerHTML = parsedJSON.getDonationCampaignInfoResponse.name;
document.getElementById('campaigngoal').innerHTML = '$' + (parseInt(parsedJSON.getDonationCampaignInfoResponse.goal)/100);
document.getElementById('campaignamountraised').innerHTML = '$' + (parseInt(parsedJSON.getDonationCampaignInfoResponse.amountRaised)/100);
document.getElementById('percentraised').innerHTML = Math.round(parseInt(parsedJSON.getDonationCampaignInfoResponse.amountRaised)/parseInt(parsedJSON.getDonationCampaignInfoResponse.goal)) + '%';
}
</script>
<script type="text/javascript" charset="utf-8" src="http://www.example.com/site/PageServer?pagename=pbAPI&pgwrap=n&api_key=yourAPIKey&v=1.0&method=getDonationCampaignInfo&campaign_id=1301&callback=parseResponse"></script>
If you understand what's going on above, then you can turn S tags into APIs pretty easy. Does anyone else have any examples or suggestions?
Comments
-
Doesn't that sort of fly in the face of Convio's conventional thinking on JSONP?
For example, see this thread from a couple years ago:
0 -
Michael :
Doesn't that sort of fly in the face of Convio's conventional thinking on JSONP?
For example, see this thread from a couple years ago:
Michael,
I think the difference here is that you wouldn't use this to expose sensitive constituent data, only non-sensitive data like the name and amount raised for a donation form.
0 -
Michael :
Doesn't that sort of fly in the face of Convio's conventional thinking on JSONP?
For example, see this thread from a couple years ago:
That's why I chose the S15 tag, since it doesn't reveal sensitive information about either constituents or finances. The JSONP policy explained by Dave Hart pertains to those systems that our Engineers had exposed as APIs at that point. Currently, this JSONP hack is for S tags that aren't exposed as APIs yet. As we develop more (and more innocuous) API methods, we could use JSONP for those, too, but you've gotta use your best judgment about what information to expose.
0 -
Here's an example that I just worked on for the Humane Society Legislative Fund:
http://action.humanesociety.org/site/TR?fr_id=1080&pg=entry
The organization is using TeamRaiser to allow constituents to host parties on its behalf. As part of the TeamRaiser signup process, team captains (party hosts) are asked three questions:
1) The location of their party
2) Whether or not they want to show the team roster (the party's guest list) on their team page
3) Whether or not they want their team to show up in search results
The attached code is used in a PageBuilder page to render the team captain's response to each of these questions as jsonp. jQuery is used on the team page to display the location from question #1 under the team name and to hide the team roster if the captain answered "No" on question #2:
<script type="text/javascript">
$(function(){
$.each($('td.tr_captain'),function(){
if($(this).html().indexOf('px=')!=-1){
var teamCaptainConsID=$(this).html().split('px=').split('&');
$.getJSON('PageServer?pagename=teamCaptainPartyResponse&fr_id=]&teamCaptainConsID='+teamCaptainConsID+'&pgwrap=n&callback=?',function(data){
$.each(data.captains,function(){
if(this.location&&this.location!=''){
//Location is not null
$('p.cstmTitle').html($('p.cstmTitle').html()+'<br />'+
'<span class="teamCaptainLocation">'+this.location.replace(new RegExp('\\\\n','g'),'<br />')+'</span>');
}
else if(this.participationTypeId=='1121'){
//Virtual Host
$('p.cstmTitle').html($('p.cstmTitle').html()+'<br />'+
'<span class="teamCaptainLocation">Virtual Host</span>');
}
if(this.showTeamRoster&&this.showTeamRoster=='No'){
//Hide team roster
$('table.tr_roster').css('display','none');
$('table.tr_legend').css('display','none');
}
});
});
}
});
});
</script>On the search page, each of the teams returned on the results page are checked, and if the captain answered "No" to #3, the team is hidden:
<script type="text/javascript">
$(function(){
$('table.lc_Table').css('display','none');
var pbUrl='PageServer?pagename=teamCaptainPartyResponse&fr_id='+$('#fr_id').val()+'&pgwrap=n&callback=?';
var i=1;
$.each($('div.lc_Text p a'),function(){
var teamCaptainConsID=$(this).attr('href').split('px=').split('&');
$(this).attr('id','teamCaptain-'+teamCaptainConsID);
if(i==1)
pbUrl+='&teamCaptainConsID='+teamCaptainConsID;
else
pbUrl+='&teamCaptainConsID'+i+'='+teamCaptainConsID;
i=i+1;
});
$.getJSON(pbUrl,function(data){
$.each(data.captains,function(){
if(this.showTeamInSearchResults&&this.showTeamInSearchResults=='No'){
//Hide team row in search results
$('a#teamCaptain-'+this.teamCaptainConsID).parent().parent().parent().parent().css('display','none');
}
});
$('table.lc_Table').css('display','');
});
});
</script>0 -
Noah Cooper:
Here's an example that I just worked on for the Humane Society Legislative Fund:
http://action.humanesociety.org/site/TR?fr_id=1080&pg=entry
The organization is using TeamRaiser to allow constituents to host parties on its behalf. As part of the TeamRaiser signup process, team captains (party hosts) are asked three questions:
1) The location of their party
2) Whether or not they want to show the team roster (the party's guest list) on their team page
3) Whether or not they want their team to show up in search results
The attached code is used in a PageBuilder page to render the team captain's response to each of these questions as jsonp. jQuery is used on the team page to display the location from question #1 under the team name and to hide the team roster if the captain answered "No" on question #2:
<script type="text/javascript">
$(function(){
$.each($('td.tr_captain'),function(){
if($(this).html().indexOf('px=')!=-1){
var teamCaptainConsID=$(this).html().split('px=').split('&');
$.getJSON('PageServer?pagename=teamCaptainPartyResponse&fr_id=]&teamCaptainConsID='+teamCaptainConsID+'&pgwrap=n&callback=?',function(data){
$.each(data.captains,function(){
if(this.location&&this.location!=''){
//Location is not null
$('p.cstmTitle').html($('p.cstmTitle').html()+'<br />'+
'<span class="teamCaptainLocation">'+this.location.replace(new RegExp('\\\\n','g'),'<br />')+'</span>');
}
else if(this.participationTypeId=='1121'){
//Virtual Host
$('p.cstmTitle').html($('p.cstmTitle').html()+'<br />'+
'<span class="teamCaptainLocation">Virtual Host</span>');
}
if(this.showTeamRoster&&this.showTeamRoster=='No'){
//Hide team roster
$('table.tr_roster').css('display','none');
$('table.tr_legend').css('display','none');
}
});
});
}
});
});
</script>On the search page, each of the teams returned on the results page are checked, and if the captain answered "No" to #3, the team is hidden:
<script type="text/javascript">
$(function(){
$('table.lc_Table').css('display','none');
var pbUrl='PageServer?pagename=teamCaptainPartyResponse&fr_id='+$('#fr_id').val()+'&pgwrap=n&callback=?';
var i=1;
$.each($('div.lc_Text p a'),function(){
var teamCaptainConsID=$(this).attr('href').split('px=').split('&');
$(this).attr('id','teamCaptain-'+teamCaptainConsID);
if(i==1)
pbUrl+='&teamCaptainConsID='+teamCaptainConsID;
else
pbUrl+='&teamCaptainConsID'+i+'='+teamCaptainConsID;
i=i+1;
});
$.getJSON(pbUrl,function(data){
$.each(data.captains,function(){
if(this.showTeamInSearchResults&&this.showTeamInSearchResults=='No'){
//Hide team row in search results
$('a#teamCaptain-'+this.teamCaptainConsID).parent().parent().parent().parent().css('display','none');
}
});
$('table.lc_Table').css('display','');
});
});
</script>This is a neat little hack, thanks for sharing.
Is the pgwrap=n parameter new? I think there were various times where I was hoping to find a way to do that... deliver a page without its wrapper.
0
Categories
- All Categories
- Shannon parent
- shannon 2
- shannon 1
- 21 Advocacy DC Users Group
- 14 BBCRM PAG Discussions
- 89 High Education Program Advisory Group (HE PAG)
- 28 Luminate CRM DC Users Group
- 8 DC Luminate CRM Users Group
- Luminate PAG
- 5.9K Blackbaud Altru®
- 58 Blackbaud Award Management™ and Blackbaud Stewardship Management™
- 409 bbcon®
- 2.1K Blackbaud CRM™ and Blackbaud Internet Solutions™
- donorCentrics®
- 1.1K Blackbaud eTapestry®
- 2.8K Blackbaud Financial Edge NXT®
- 1.1K Blackbaud Grantmaking™
- 527 Education Management Solutions for Higher Education
- 1 JustGiving® from Blackbaud®
- 4.6K Education Management Solutions for K-12 Schools
- Blackbaud Luminate Online & Blackbaud TeamRaiser
- 16.4K Blackbaud Raiser's Edge NXT®
- 4.1K SKY Developer
- 547 ResearchPoint™
- 151 Blackbaud Tuition Management™
- 61 everydayhero
- 3 Campaign Ideas
- 58 General Discussion
- 115 Blackbaud ID
- 87 K-12 Blackbaud ID
- 6 Admin Console
- 949 Organizational Best Practices
- 353 The Tap (Just for Fun)
- 235 Blackbaud Community Feedback Forum
- 55 Admissions Event Management EAP
- 18 MobilePay Terminal + BBID Canada EAP
- 36 EAP for New Email Campaigns Experience in Blackbaud Luminate Online®
- 109 EAP for 360 Student Profile in Blackbaud Student Information System
- 41 EAP for Assessment Builder in Blackbaud Learning Management System™
- 9 Technical Preview for SKY API for Blackbaud CRM™ and Blackbaud Altru®
- 55 Community Advisory Group
- 46 Blackbaud Community Ideas
- 26 Blackbaud Community Challenges
- 7 Security Testing Forum
- 3 Blackbaud Staff Discussions
- 1 Blackbaud Partners Discussions
- 1 Blackbaud Giving Search™
- 35 EAP Student Assignment Details and Assignment Center
- 39 EAP Core - Roles and Tasks
- 59 Blackbaud Community All-Stars Discussions
- 20 Blackbaud Raiser's Edge NXT® Online Giving EAP
- Diocesan Blackbaud Raiser’s Edge NXT® User’s Group
- 2 Blackbaud Consultant’s Community
- 43 End of Term Grade Entry EAP
- 92 EAP for Query in Blackbaud Raiser's Edge NXT®
- 38 Standard Reports for Blackbaud Raiser's Edge NXT® EAP
- 12 Payments Assistant for Blackbaud Financial Edge NXT® EAP
- 6 Ask an All Star (Austen Brown)
- 8 Ask an All-Star Alex Wong (Blackbaud Raiser's Edge NXT®)
- 1 Ask an All-Star Alex Wong (Blackbaud Financial Edge NXT®)
- 6 Ask an All-Star (Christine Robertson)
- 21 Ask an Expert (Anthony Gallo)
- Blackbaud Francophone Group
- 22 Ask an Expert (David Springer)
- 4 Raiser's Edge NXT PowerUp Challenge #1 (Query)
- 6 Ask an All-Star Sunshine Reinken Watson and Carlene Johnson
- 4 Raiser's Edge NXT PowerUp Challenge: Events
- 14 Ask an All-Star (Elizabeth Johnson)
- 7 Ask an Expert (Stephen Churchill)
- 2025 ARCHIVED FORUM POSTS
- 322 ARCHIVED | Financial Edge® Tips and Tricks
- 164 ARCHIVED | Raiser's Edge® Blog
- 300 ARCHIVED | Raiser's Edge® Blog
- 441 ARCHIVED | Blackbaud Altru® Tips and Tricks
- 66 ARCHIVED | Blackbaud NetCommunity™ Blog
- 211 ARCHIVED | Blackbaud Target Analytics® Tips and Tricks
- 47 Blackbaud CRM Higher Ed Product Advisory Group (HE PAG)
- Luminate CRM DC Users Group
- 225 ARCHIVED | Blackbaud eTapestry® Tips and Tricks
- 1 Blackbaud eTapestry® Know How Blog
- 19 Blackbaud CRM Product Advisory Group (BBCRM PAG)
- 1 Blackbaud K-12 Education Solutions™ Blog
- 280 ARCHIVED | Mixed Community Announcements
- 3 ARCHIVED | Blackbaud Corporations™ & Blackbaud Foundations™ Hosting Status
- 1 npEngage
- 24 ARCHIVED | K-12 Announcements
- 15 ARCHIVED | FIMS Host*Net Hosting Status
- 23 ARCHIVED | Blackbaud Outcomes & Online Applications (IGAM) Hosting Status
- 22 ARCHIVED | Blackbaud DonorCentral Hosting Status
- 14 ARCHIVED | Blackbaud Grantmaking™ UK Hosting Status
- 117 ARCHIVED | Blackbaud CRM™ and Blackbaud Internet Solutions™ Announcements
- 50 Blackbaud NetCommunity™ Blog
- 169 ARCHIVED | Blackbaud Grantmaking™ Tips and Tricks
- Advocacy DC Users Group
- 718 Community News
- Blackbaud Altru® Hosting Status
- 104 ARCHIVED | Member Spotlight
- 145 ARCHIVED | Hosting Blog
- 149 JustGiving® from Blackbaud® Blog
- 97 ARCHIVED | bbcon® Blogs
- 19 ARCHIVED | Blackbaud Luminate CRM™ Announcements
- 161 Luminate Advocacy News
- 187 Organizational Best Practices Blog
- 67 everydayhero Blog
- 52 Blackbaud SKY® Reporting Announcements
- 17 ARCHIVED | Blackbaud SKY® Reporting for K-12 Announcements
- 3 Luminate Online Product Advisory Group (LO PAG)
- 81 ARCHIVED | JustGiving® from Blackbaud® Tips and Tricks
- 1 ARCHIVED | K-12 Conference Blog
- Blackbaud Church Management™ Announcements
- ARCHIVED | Blackbaud Award Management™ and Blackbaud Stewardship Management™ Announcements
- 1 Blackbaud Peer-to-Peer Fundraising™, Powered by JustGiving® Blogs
- 39 Tips, Tricks, and Timesavers!
- 56 Blackbaud Church Management™ Resources
- 154 Blackbaud Church Management™ Announcements
- 1 ARCHIVED | Blackbaud Church Management™ Tips and Tricks
- 11 ARCHIVED | Blackbaud Higher Education Solutions™ Announcements
- 7 ARCHIVED | Blackbaud Guided Fundraising™ Blog
- 2 Blackbaud Fundraiser Performance Management™ Blog
- 9 Foundations Events and Content
- 14 ARCHIVED | Blog Posts
- 2 ARCHIVED | Blackbaud FIMS™ Announcement and Tips
- 59 Blackbaud Partner Announcements
- 10 ARCHIVED | Blackbaud Impact Edge™ EAP Blogs
- 1 Community Help Blogs
- Diocesan Blackbaud Raiser’s Edge NXT® Users' Group
- Blackbaud Consultant’s Community
- Blackbaud Francophone Group
- 1 BLOG ARCHIVE CATEGORY
- Blackbaud Community™ Discussions
- 8.3K Blackbaud Luminate Online® & Blackbaud TeamRaiser® Discussions
- 5.7K Jobs Board