• Like
  • Save
Think Out of the Box: Think No Customization with The Raiser's Edge and Blackbaud NetCommunity
Upcoming SlideShare
Loading in...5
×
 

Think Out of the Box: Think No Customization with The Raiser's Edge and Blackbaud NetCommunity

on

  • 1,289 views

bbcon 2013

bbcon 2013

Statistics

Views

Total Views
1,289
Views on SlideShare
1,289
Embed Views
0

Actions

Likes
0
Downloads
30
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Think Out of the Box: Think No Customization with The Raiser's Edge and Blackbaud NetCommunity Think Out of the Box: Think No Customization with The Raiser's Edge and Blackbaud NetCommunity Presentation Transcript

    • 10/7/2013 #bbcon 1 PRESENTED BY: JUNIOR ACHIEVEMENT OF CANADA Maurice Kowanetz, BMath (Computer Science) - National Director, Information Technology Chris Weber - National Manager, Sponsorships and Fund Development Systems Think Outside of The Box Think “No Customization” with The Raiser's Edge and Blackbaud NetCommunity @JA_CANADA @MRCHRISWEBER #THINKOUTSIDEOFTHEBOX @BBCON Tweet about this session!
    • 10/7/2013 #bbcon 2 • Customizing software usually involves engaging a third party to change the software itself - Costly (both up front and in the future as the base software changes) - Time consuming - Never get exactly what you’re looking for • Configuring software usually involves an expert user who is extremely familiar with advanced features, and/or a motivated volunteer who is an expert in their field - Inexpensive - Quick - Will meet 80% to 90% of what you’re looking for • Why pay thousands or tens of thousands of dollars to get 10% more of what you’re looking for? - Find the right people to get involved with your organization (or train your staff!) to achieve what you need with little to no additional investment CUSTOMIZE VS CONFIGURE, WHO CARES?
    • 10/7/2013 #bbcon 3 • Social Media Login • Use JavaScript to "tweak" the way Blackbaud NetCommunity works - Introductory step-by-step guide that you can use yourself or pass along to others • Custom Templates • Queries/Plug-ins for Auditing & Clean-up • Crystal Reports • To Host or Not To Host with Blackbaud AGENDA
    • 10/7/2013 #bbcon 4 SOCIAL MEDIA LOGIN
    • 10/7/2013 #bbcon 5 • Why force your users to create yet another username/password to register with your site? Enable social media login so that your users can login to NetCommunity using a username/password they already know - When a user registers using social media, NetCommunity creates a “behind the scenes” user called SocialWebXXXX, where XXXX is a unique number - Setup Social Media for the first time in NetCommunity to integrate with the social media login provider Janrain, then setup an application within each social media site • Search for “configure social media” in Blackbaud’s on-line knowledgebase and click on “Create social media application and configure Janrain settings” for full instructions - Note there are some idiosyncrasies when it comes to password resets, since social media accounts don’t need it, but NetCommunity’s password reset routine still allows the user to reset the password for their SocialWebXXXX username SOCIAL MEDIA LOGIN
    • 10/7/2013 #bbcon 6 • To setup NetCommunity to use your Javascript code: - Login to NetCommunity as an Administrator - Edit your site’s main Template (that all of your Pages are based on) - Click on lowest Empty Content Pane on the Template, then click New Part - Choose the Part type as “Unformatted Text”, give a name, then click next - In the text area of the Part, copy/paste the following Javascript base code <script type="text/javascript" language="javascript"> function fncAfterAsyncPostBack() { fncProcessJavascript(); } function fncApplicationInitHandler() { var objPageRequestManager = Sys.WebForms.PageRequestManager.getInstance(); objPageRequestManager.add_endRequest(fncEndHandler); } function fncEndHandler() { fncAfterAsyncPostBack(); } Sys.Application.add_init(fncApplicationInitHandler); window.onload = fncProcessJavascript(); </script> - On the following slides, you’ll copy/paste the Javascript code shown on the slide right after the first line above that starts with <script…> - Test, test, test… • Internet Explorer 8, Internet Explorer 9, Internet Explorer 10, Chrome, Firefox, Safari, etc JAVASCRIPT FOR NETCOMMUNITY
    • 10/7/2013 #bbcon 7 • Here is your first Javascript program to display a NetCommunity Page’s browser title field & unique PC #, to test that everything works - Add code below to base code on slide 4, below first line starting with <script…> function fncProcessJavascript() { var objTitle, strTitle, strPCNumber; if (document.getElementsByTagName("title")) { objTitle = document.getElementsByTagName("title"); strTitle = objTitle[0].innerHTML; strPCNumber = fncGetPCNumber(); if (strPCNumber != "") { alert("You’re on the " + strTitle + " page, which has a unique PC number of " + strPCNumber); } } } function fncGetPCNumber() { var strPCNumber, objSpan, i; strPCNumber = ""; objSpan = document.getElementsByTagName("span"); for (i=0; i<objSpan.length; i++) { if (objSpan[i].id.substring(0,2) == "PC") { strPCNumber = objSpan[i].id.substring(0,objSpan[i].id.search("_")); break; } } return(strPCNumber); } JAVASCRIPT FOR NETCOMMUNITY
    • 10/7/2013 #bbcon 8 • On any Page, limit Title picklist (if found) to only show top “x” items JAVASCRIPT FOR NETCOMMUNITY
    • 10/7/2013 #bbcon 9 • On any Page, limit Title picklist (if found) to only show top “x” items - Add code below to base code on slide 4, below first line starting with <script…> function fncProcessJavascript() { var strPCNumber; strPCNumber = fncGetPCNumber(); if (strPCNumber != "") { fncLimitTitle(strPCNumber); } } function fncLimitTitle(strPCNumber) { var objSelect, strElement = ""; if (document.getElementById(strPCNumber + "_ddTitle")) { strElement = "_ddTitle"; } else if (document.getElementById(strPCNumber + "_BBControl5_0_0")) { strElement = "_BBControl5_0_0"; } else if (document.getElementById(strPCNumber + "_Wizard1_DonationCapture1_cboTitle")) { strElement = "_Wizard1_DonationCapture1_cboTitle"; } else if (document.getElementById(strPCNumber + "_DonationCapture1_cboTitle")) { strElement = "_DonationCapture1_cboTitle"; } if (strElement != "") { objSelect = document.getElementById(strPCNumber + strElement); objSelect.options.length = 9; // Show top 8 items in Title picklist (change 9 as required) } } JAVASCRIPT FOR NETCOMMUNITY
    • 10/7/2013 #bbcon 10 • On donation pages, reformat and align text (change “$1,000.00” to “$1,000”) JAVASCRIPT FOR NETCOMMUNITY
    • 10/7/2013 #bbcon 11 • On donation pages, reformat and align text (change “$1,000.00” to “$1,000”) - Add code below to base code on slide 4, below first line starting with <script…> function fncProcessJavascript() { var strPCNumber; strPCNumber = fncGetPCNumber(); if (strPCNumber != "") { fncReformatDollarColumn(strPCNumber); } } function fncReformatDollarColumn(strPCNumber) { var objTable, i; if (document.getElementById(strPCNumber + "_tblAmount")) { objTable = document.getElementById(strPCNumber + "_tblAmount"); for (i=0; i<objTable.rows.length - 1; i++) { if (objTable.rows[i].cells[1].textContent) { if (objTable.rows[i].cells[1].textContent.indexOf(".00") != -1) { objTable.rows[i].cells[1].textContent = objTable.rows[i].cells[1].textContent.substring(0, objTable.rows[i].cells[1].textContent.indexOf(".00")); } } else { if (objTable.rows[i].cells[1].innerText.indexOf(".00") != -1) { objTable.rows[i].cells[1].innerText = objTable.rows[i].cells[1].innerText.substring(0, objTable.rows[i].cells[1].innerText.indexOf(".00")); } } objTable.rows[i].cells[1].style.textAlign = "right"; } } if (document.getElementById(strPCNumber + "_chkAcknowledge")) { document.getElementById(strPCNumber + "_chkAcknowledge").parentNode.parentNode.style.display = "none"; } } JAVASCRIPT FOR NETCOMMUNITY
    • 10/7/2013 #bbcon 12 • On event registration classic pages, change text justification in a row JAVASCRIPT FOR NETCOMMUNITY
    • 10/7/2013 #bbcon 13 • On event registration classic pages, change text justification in a row - Add code below to base code on slide 4, below first line starting with <script…> function fncProcessJavascript() { var strPCNumber; strPCNumber = fncGetPCNumber(); if (strPCNumber != "") { fncEventSectionUnitAlignUnitTableRowsToTop(strPCNumber); } } function fncEventSectionUnitAlignUnitTableRowsToTop(strPCNumber) { var i, j; i = 0; while (document.getElementById(strPCNumber + "_Wizard1_dgEventItems2_dgPriceList_" + i)) { j = 0; while (document.getElementById(strPCNumber + "_Wizard1_dgEventItems2_dgPriceList_" + i + "_ddlQuantity_" + j)) { document.getElementById(strPCNumber + "_Wizard1_dgEventItems2_dgPriceList_" + i + "_ddlQuantity_" + j).parentNode.style.verticalAlign = "top"; // replace with bottom if needed document.getElementById(strPCNumber + "_Wizard1_dgEventItems2_dgPriceList_" + i + "_lblPrice_" + j).parentNode.style.verticalAlign = "top"; // replace with bottom if needed j++; } i++ } } JAVASCRIPT FOR NETCOMMUNITY
    • 10/7/2013 #bbcon 14 • On event registration classic pages, hide columns JAVASCRIPT FOR NETCOMMUNITY
    • 10/7/2013 #bbcon 15 • On event registration classic pages, hide columns - Add code below to base code on slide 4, below first line starting with <script…> function fncProcessJavascript() { var strPCNumber; strPCNumber = fncGetPCNumber(); if (strPCNumber != "") { fncEventSectionUnitHideUnitColumn(strPCNumber); } } function fncEventSectionUnitHideUnitColumn(strPCNumber) { var i, j; i = 0; while (document.getElementById(strPCNumber + "_Wizard1_dgEventItems2_dgPriceList_" + i)) { j = 0; while (document.getElementById(strPCNumber + "_Wizard1_dgEventItems2_dgPriceList_" + i + "_lblNumParticipants_" + j)) { document.getElementById(strPCNumber + "_Wizard1_dgEventItems2_dgPriceList_" + i + "_lblNumParticipants_" + j).innerHTML = ""; j++; } i++; } } JAVASCRIPT FOR NETCOMMUNITY
    • 10/7/2013 #bbcon 16 • Sort constituent attributes on a registration page - Add code below to base code on slide 4, below first line starting with <script…> function fncProcessJavascript() { fncSortConstituentAttributes(); } function fncSortConstituentAttributes() { var arrSort = [ "Attribute name 1", // Replace Attribute name 1 with your first attribute you want at the top "Attribute name 2", // Replace Attribute name 2 with your second attribute you want shown next "etc" ]; var arrTemp = new Array(); //array to hold the <tr>'s that we'll be sorting var intAttributeCounter = 0; // counter to count up as we find <tr>'s with attributes var intAttributeStarting = 0; //we'll set this to the index of the first <tr> that contains an attribute var objTRCollection = $('table.LoginFormTable > tbody').eq(2).children(); //collection of <tr>'s where the attributes var intTRCounter = objTRCollection.length - 1; // counter for all of the <tr>'s in our collection //loop over collection of <tr>'s, looking for those with constituent attributes for (var i=0; i<intTRCounter; i++) { var objTRWithAttributeClass = objTRCollection.eq(i).children().eq(1); //get the 2nd child <td> if ((objTRWithAttributeClass.length > 0)&&(objTRWithAttributeClass.attr('id'))) { //check to see if there are at least 2 children if (objTRWithAttributeClass.attr('id').indexOf('ParentControl') != -1) { //is the current <td> one with an attribute? if (intAttributeStarting == 0) { intAttributeStarting = i; } //marking where in the collection the attributes start arrTemp[intAttributeCounter] = new Array(2); //sub-array to hold the <tr>'s and their correct sort position //find correct sort position for current attribute var strAttributeName = objTRCollection.eq(i).children().eq(0).children().eq(0).html(); //get the attribute name strAttributeName = strAttributeName.substring(0, strAttributeName.length-1); //lop off the dangling colon //loop over sort array to see if we find a match var intSortBasisCounter = 0; var intFound = 0; //if match found, will set = 1 while (intSortBasisCounter < arrSort.length) { if (strAttributeName == arrSort[intSortBasisCounter]) { //if found a match in the sort array... arrTemp[intAttributeCounter][0] = intSortBasisCounter; //sort position intFound = 1; break; //stop checking...we found our match } //end if (checking for match in sort array) intSortBasisCounter += 1; } //end while to loop over the sort array arrTemp[intAttributeCounter][1] = objTRCollection.eq(i).html(); //HTML inside the <tr> if (intFound == 0) { //if we have an attribute but didn't find a match in the master sort array... arrTemp[intAttributeCounter][0] = 99999; //we'll push non-found attributes to the bottom to identify them easily } // intAttributeCounter += 1; //increment to keep count of how many <tr>'s with attributes we've found } // end if (where we check to see if the current <td> contains an attribute } // end if (where we check to see if the <tr> has at least 2 children } //end for loop (looping as long as we're still finding <tr>'s with attributes if (arrTemp.length > 0) { //if not > 0 then no attributes to rearrange //sort the array on the attribute ID arrTemp.sort(function(a, b) { var intX = parseInt(a[0], 10); var intY = parseInt(b[0], 10); if (intX > intY) return(1) else if (intX < intY) return(-1); return(0); }); intTRCounter = objTRCollection.length - 2; //reset this counter to loop backwards again //loop again over the same collection to update the attribute order for (var i = intAttributeStarting; i < intAttributeStarting + intAttributeCounter; i++) { objTRCollection.eq(i).html(arrTemp[i - intAttributeStarting][1]); //get the 2nd child <td> } //end while (looping as long as we still have <tr>'s to replace } } JAVASCRIPT FOR NETCOMMUNITY
    • 10/7/2013 #bbcon 17 • Once you or your team is comfortable with making the changes shown earlier, there are more advanced Javascript techniques: - Dynamically show/hide fields based on other fields (i.e. picklists, checkboxes, radio buttons, etc), including setting default values for mandatory fields that remain hidden - On the guest selection page for an event registration, hide fields to make the screen less cluttered • Example: If a table of 10 is purchased and you want all 10 guest names as placeholders in Raiser’s Edge, but don’t want to ask the purchaser for all guest names, you can hide the fields and insert default guest names such as “Guest 1”, “Guest 2”, etc - On registration forms, change single line input boxes into multi-line text areas (for comment fields and other “long question” fields), including a counter to tell the user how many characters they have left until the limit - On registration forms, show/hide various country specific address fields, such as hiding province/state fields for those countries that don’t have provinces/states - And more! JAVASCRIPT FOR NETCOMMUNITY
    • 10/7/2013 #bbcon 18 CUSTOM TEMPLATES
    • 10/7/2013 #bbcon 19 • Create your own templates for a completely different look & feel for various events - Click on “New template” under Pages & Templates, then create/use different parts for images/text/links for your new template to give your users a unique look & feel for specific events that you want to look different than your current setup CUSTOM TEMPLATES
    • 10/7/2013 #bbcon 20 • Run daily/weekly/monthly/yearly queries / plug-ins as appropriate for your organization - Check for blank/missing cities, provinces/states, postal/zip codes, phones, titles, etc - Check for improper format of postal/zip codes (see query to right for postal code example) and other fields - Run Plug-Ins such as Apply Phone Formats and the various Duplicate/Delete plug-ins - Run the Duplicate Constituents report under Admin - Review the excellent multi-part series called “Raiser’s Edge Data Cleanup” which you can search for “cleanup series” on blackbaudknowhow.com QUERIES / PLUG-INS FOR AUDITING & CLEAN-UP
    • 10/7/2013 #bbcon 21 • DO NOT OVERUSE; you can usually find output of what a user requires via queries, exports, built-in Raiser’s Edge Reports, etc • Use for complicated totaling/sorting or very specific formatting • Use parameters to make it easier for users to filter results CRYSTAL REPORTS
    • 10/7/2013 #bbcon 22 • If you host with Blackbaud - Easy to manage requiring only “one finger to point” if something goes wrong • Full regular backups • Full disaster recovery plan • Automatic upgrades as new versions are released • Accessible from anywhere - Limitations • No integration directly to your user’s email programs – Users must use Blackbaud’s Outlook 2007 after logging into Raiser’s Edge to see alerts/actions and synchronize contacts • No automated / scheduled emailing of Reports via Queues – Each report must be manually run to be refreshed • Inability to print to any local printer that requires a billing code for each print – Example: Shared printer for multiple companies located in one office which requires each user to enter a code for billing before printing • Requires a minimum 1Mbps upload connection to the internet TO HOST OR NOT TO HOST WITH BLACKBAUD
    • 10/7/2013 #bbcon 23 CONTACT INFO: Maurice Kowanetz - National Director, Information Technology Email: mkowanetz@jacan.org Phone: 416-622-4602 ext 240 Chris Weber - National Manager, Sponsorships and Fund Development Systems Email: cweber@jacan.org Phone: 416-622-4602 ext 239 THANK YOU!