The subject is a bit off topic from what I usually write but I found it pretty interesting.
2008 Online Giving Trends
Tuesday, January 6, 2009Posted by Garrett at 07:10 0 comments Links to this post
Labels: 2008, Blackbaud, giving, Ma, maclaughlin, steve maclaughlin, trends
Blackbaud NetCommunity 5.6 relases soon
Friday, December 19, 2008Latest blog post and some twitter activity indicates NetCommunity 5.6 might release later today. It's a control release so you'll need to call support to get the download. The download will be available online next week...
From Steve's blog...
Here are just some of the changes you'll see in the release;
- Ability to enter metadata descriptions and keywords at the Template and Page level
- Ability to copy Layouts and Stylesheets to quickly reuse or modify site designs
- Ability to style menus using unordered lists and custom classes
- Ability to put the Donation, Event Registration, and Payment parts into a "test" mode
- Ability to print and export Survey part results
- Ability to compare content performance for testing purposes
- Adding tooltips for every merge field in the product
- Adding default text for several of the email types and helplets
- Adding custom tabs within Wave Social Networking
- Adding group photos and other user contributed photo improvements
Posted by Garrett at 10:58 0 comments Links to this post
Labels: 5.6, Blackbaud, NetCommunity, wave
NetCommunity Developer Challenge Entries Released
Friday, December 12, 2008Shaun has posted a few of the top entries from the NetCommunity Developer Challenge. They are all open source. They don't come with support but if you have a problem with any of them post something on the Bus and someone will probably help you out.
You can download my entry here or view them all here.
Posted by Garrett at 14:13 0 comments Links to this post
Labels: challenge, developer, NetCommunity
re-cap of the 2008 Conference for Non-Profits
Thursday, November 20, 2008So this year's Conference for Non-Profits is over. As usual Blackbaud put on a great show. Props to all the folks that made everything happen! I had a lot of fun seeing attendees from past conferences as well as meeting lots of new ones. I thought I'd do a quick post recapping some of the highlights, at least from a developer's perspective.
During Monday's keynote, Shaun Sullivan unveiled a pretty killer Facebook Toolkit for NetCommunity. I haven't had a chance to do anything but download it but you can be sure to see some posts in the future about it. It looks like it's got a pretty comprehensive integration layer between Faceook and NetCommunity. In a later sessions Michael Andrews dove a bit deeper into the Toolkit and gave us a good overview of what's possible. You'll be able to basically build your own Facebook application that will allow you to post news and events, acquire new constituents, collect gifts or donations and of course leverage existing relationships in Facebook to help spread our mission. It's important to point out that this is a developer's toolkit and you'll probably need someone technical in nature to help you implement it.
Shaun also showed off Nimbus, Blackbaud's dive into the world of "cloud computing". I'm pretty impressed with it. It's going to help alleviate much of the problems that could occur in an RE7 to RE8 migration by syncing your RE7 data to the "cloud" and converting it over to an RE8 format. When you are ready to migrate over to RE8 all your data will be up-to-date in the "cloud" for RE8 to access.
Tuesday was Infinity SDK day with Ben Lambert. Some great stuff in those sessions. I think that topic could have been discussed for 4 days alone and I probably would have still had questions. The Infinity platform is just awesome and as a developer I'm extremely excited about how simple and easy it's going to be to customize Blackbaud applications in the future.
Lastly I wanted to mention the Developer's Contest. My entry, Events To Google, was selected by the Blackbaud as the winner. Thanks to everyone who congratulated me on the win. All the entries will be available on Labs soon and will include the source code to those projects. That's huge and I think it represents a major milestone in Blackbaud's continuing efforts to broaden the developer community for their products. If I stop look at what was available a year ago in terms of developer resource for Blackbaud products it's amazing how far they have come.
So it was a great conference and I left energized, partly due to all the Red Bull in the Internet Strong Lounge, and with lots of new ideas for the next year.
Thanks again to Blackbaud and the events team that helped make this another great conference!
Posted by Garrett at 08:30 1 comments Links to this post
Labels: 2008, Blackbaud, conference, developer contest, FaceBook, Infinity, non-profit, SDK, toolkit
RePost: Rock Your NetCommunity with jQuery
Monday, November 10, 2008This was posted by Michal Andrews on Labs earlier today.
I'm shamelessly re-posting it in an effort to generate blog traffic off of his work.
Seriously though, it's a good post and jQuery is something that I'm excited to see being used in NetCommunity.
Have a read
Posted by Garrett at 11:44 1 comments Links to this post
Labels: API, Jquery, NetCommunity
Using the PageLink custom server control
Monday, November 3, 2008This is the second in a series of posts on the new custom server controls that were released in v5.5 of NetCommunity. As I stated in the previous post, custom server controls allow us to take canned pieces of functionality and include them in our own custom parts. In this post I'm going to touch on using the PageLink control. This control allows the user to select a link. It shows the link currently selected and offers the standard modal dialog for selecting a link either from the site, to a document, or a manually entered URL. You'll be able to download the Visual Studio project at the end of this post.
I'm going to assume that you are familiar with the concept of how to build and implement custom parts in NetCommunity. If you aren't, don't worry, just take a few minutes to check out the developer resources before getting started.
PageLinkControlEditor.ascx (Design View)
<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="PageLinkControlEditor.ascx.vb" Inherits="PageLinkControl.PageLinkControlEditor" %>Here we are registering the BBNCExtensions.ServerControls with the tag "bbnc".
<%@ Register TagPrefix="bbnc" Namespace="BBNCExtensions.ServerControls" Assembly="BBNCExtensions" %>
Please select a page: <bbnc:pagelink runat="server" id="PageLink1"></bbnc:pagelink>
Please enter the name for the link: <asp:textbox runat="server" id="txtPageLinkName"></asp:textbox>
Then we include the control <bbnc:pagelink runat="server" id="PageLink1">
Also we are allowing the name of link on the front end to be specified in txtPageLinkName.
PageLinkControlEditor.vb (Code Behind)
Imports BBNCExtensionsIn the OnSaveContent() we take the ID of the selected page using PageLink1.PageID and save it to oProperties.PageLinkID.
Partial Public Class PageLinkControlEditor
Inherits BBNCExtensions.Parts.CustomPartEditorBase
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
'not really used for editors, the OnLoadContent() handles this...
End Sub
#Region " Editor Specific Sub "
Public Overrides Sub OnLoadContent()
If Not Page.IsPostBack Then
Dim oProperties As Properties
oProperties = CType(Me.Content.GetContent(GetType(Properties)), Properties)
If Not oProperties Is Nothing Then
PageLink1.PageID = oProperties.PageLinkID
txtPageLinkName.Text = oProperties.PageLinkText
End If
End If
End Sub
Public Overrides Function OnSaveContent(Optional ByVal bDialogIsClosing As Boolean = True) As Boolean
Dim oProperties As New Properties
With oProperties
.PageLinkText = txtPageLinkName.Text
.PageLinkID = PageLink1.PageID
End With
Me.Content.SaveContent(oProperties)
Return True
End Function
#End Region
End Class
We are also going to save the text for the link name using txtPageLinkName.Text to oProperties.PageLinkText.
The OnLoadContent() we load up any previously saved Properties and apply it to the respective controls.
Properties.vb (Editor Properties)
Public Class PropertiesHere we dim out the Properties the Editor and the Display will be using.
Public PageLinkText As String
Public PageLinkID As String
End Class
PageLinkControlDisplay.ascx (Design View)
<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="PageLinkControlDisplay.ascx.vb" Inherits="PageLinkControl.PageLinkControlDisplay" %>Nothing fancy here, just declaring the HyperLink control we'll be working with in the code behind.
<:asp:hyperlink runat="server" id="hypPageLink"></asp:hyperlink>
PageLinkControlDisplay.vb (Code Behind)
Imports BBNCExtensions
Partial Public Class PageLinkControlDisplay
Inherits BBNCExtensions.Parts.CustomPartDisplayBase
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
getProperties()
End Sub
#Region " Data Handling "
Private Sub getProperties() 'this loads up the properties from the editor
Dim oProperties As Properties 'class contating the availible properties
oProperties = CType(Me.Content.GetContent(GetType(Properties)), Properties) 'this is a BBNC method
If Not oProperties Is Nothing Then 'don't try to assign the properties to the display controls if there aren't any returned
hypPageLink.NavigateUrl = API.Pages.BuildStandardLink(CType(oProperties.PageLinkID, Integer)) 'this bit here basically takes the PID and then dynamically builds the URL for your specific website.
hypPageLink.Text = oProperties.PageLinkText
End If
End Sub
#End Region
End Class
Again, nothing really fancy. We are retrieving the Properties saved in the Editor using oProperties = CType(Me.Content.GetContent(GetType(Properties)), Properties).
Then we want to apply the Properties to the hypPageLink control. The important piece here is API.Pages.BuildStandardLink(CType(oProperties.PageLinkID, Integer)). It is a native function in the v5.5 API that takes the saved PID (page ID) from the Properties and returns a full URL for that page.
We are also applying the oProperties.PageLinkText to the hypPageLink.Text.
Download this project.
That's it! Pretty simple. If you want me to showcase a specific control please send me an email.
If you haven't already, follow me on Twitter and join our FaceBook group.
Posted by Garrett at 19:21 0 comments Links to this post
Labels: 2008, Blackbaud, conference, custom parts, custom server control, link, NetCommunity, page
Code Smart & Fast: Working with custom server controls in v5.5
Tuesday, October 28, 2008In NetCommunity v5.5 there is native support for Custom Server Controls. A custom server control for those that aren’t familiar with them simply allows you to modularize bits of functionality so it can be re-used in other applications without having to re-write the same code again.
In NetCommunity v5.5 these custom server controls have been exposed via that API so they can be easily used in any custom part. As a developer this offers two benefits in addition to saving time writing code. Your NetCommunity users are probably familiar with some of these server controls since they are already using them in various parts of NetCommunity. The learning curve will be smaller if you utilize these custom server controls in your custom parts. The second benefit is stability. Since they are part of the core NetCommunity product they are put through the QA process. This means there is less of a chance that an upgrade will break a custom part. Being able to quickly and easily add canned functionality is the real benefit though.
So what are some specific examples of the custom server controls that are available in v5.5? Well, here is a nice list, courtesy of Labs.
- AddressUI - Offers the form for entering an address, taking into account the selected country and morphing itself appropriately such as changing a field caption from City to Suburb.
- CFAPicker - Offers a modal UI for selecting a Campaign, Fund, or Appeal from the back office, making the appropriate web service calls to populate a search form, and return the selected item.
- EmailEditor - Offers the HTML editor in email edit mode, allowing you to specify a field provider for populating the merge fields drop down. Choices include Profile fields, Donation fields, User Registration fields or none. You can also provide a set of custom merge fields that your custom transaction part may provide the data for at runtime. Very useful for designing email acknowledgments for custom transaction forms.
- HtmlEditor - Offers the HTML Editor including the appropriate dialogs for link picking, and image selection. Handles the processing of the content for safe storage, including the translation of all links from actual to relative.
- HtmlDisplay - Use this control whenever you want to display HTML that was edited with the HTMLEditor control. It handles the translation of links from relative back to fully qualified, among other things.
- ImageSelectButton - Renders an ASP Button control that summons the Image select modal dialog. This is the same dialog used by the platform and honors security of the current user to offer the ability upload new images if allowed as well as controlling access to only those images the user has access to.
- PageLink - This control allows the user to select a link. It shows the link currently selected and offers the standard modal dialog for selecting a link either from the site, to a document, or a manually entered URL.
- PartEditButton - Renders an ASP Button that summons the modal dialog for editing any part instance.
- PartSelectButton - Renders the UI for selecting another part, showing the part name currently selected. Can be set to only allow selection of a certain part type.
- QueryPicker - Renders the UI for selecting a back office Query, showing the one currently selected. Offers the same modal dialog for searching and selecting a Query that is available in the system. Options include limiting the type of Query that can be selected and whether to look at The Raiser's Edge/eCRM or The Education Edge (if applicable).
- TimeZonePicker - Renders a dynamic drop down that is populated with all of the available world time zones.
For this post I’m going to touch on the HTMLEditor & Display because it’s probably one of the controls that most people will want to implement. The basic concept will apply to all of the server controls so if I don't get to one of the ones you'd like to play with you should be able to get the hang of it.
Before I get started, I wanted to thank Michael Andrews at Blackbaud for helping me out with this post. Blackbaud has made leaps and bounds in the last year building up the developer's network around NetCommunity. For those of you that have been working with NetCommunity for a while you'll remember the days when the SDK was a 5 page Word Doc. That was less than 2 years ago. As a developer it's nice to have solid resources and an energetic developer community. It's makes working much easier and a lot more fun.
OK, enough with the sentimental stuff.
So start up Visual Studio and setup a project. If you have no clue how to do that you can check out some of the previously mentioned developer resources here.
HTMLControlEditor.ascx (Design View)
<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="HTMLControlEditor.ascx.vb" Inherits="HTMLControl.HTMLControlEditor" %>
<%@ Register TagPrefix="bbnc" Namespace="BBNCExtensions.ServerControls" Assembly="BBNCExtensions" %>
Here you are basically registering the ServerControls and then adding the HTMLEditor custom control to your page. There are some configuration options for the HTMLEditor but I'll handle that in the code behind.
HTMLControlEditor.ascx (Code Behind)
Imports BBNCExtensions
Imports BBNCExtensions.Interfaces.Parts
Partial Public Class HTMLControlEditor
Inherits BBNCExtensions.Parts.CustomPartEditorBase
Public Overrides Function OnSaveContent(Optional ByVal bDialogIsClosing As Boolean = True) As Boolean
Dim oProperties As New Properties
With oProperties
.html = HTMLEditor1.StorageHTML
End With
Me.Content.SaveContent(oProperties)
Return True
End Function
Public Overrides Sub OnLoadContent()
Dim oProperties As Properties
If Not Page.IsPostBack Then
oProperties = CType(Me.Content.GetContent(GetType(Properties)), Properties)
If Not oProperties Is Nothing Then
With oProperties
HTMLEditor1.StorageHTML = .html
HTMLEditor1.FeaturesMode = 1
End With
End If
End If
End Sub
End Class
Properties.vb (Custom part properties class)
Public Class Properties
Public html As String
End Class
So here we are really doing two things. The OnSaveContent() is used to take the HTML that is in HTMLEditor1 and save it to oProperties.html which is just a String. Then it saves all the oProperties for this custom part to be loaded later by the display.
In OnLoadContent() we are simply retrieving the previously saved values for this part and popping HTMLEditor1.StorageHTML. I'm also defining other properties for HTMLEditor1 here, specifically FeaturesMode = 1. This is a canned set of buttons that are available on the editor. Here is how those break out.
- 1 = basic formatting and styling options
- 2 = more advanced options like links and photos.
- 3 = everything available.
One thing to be cautious about though is that if you are planning on using the HTMLEditor on a custom part where non-admin will have access do NOT used FeaturesMode = 2. This will expose them to your NetCommunity images and all your content pages if they try to insert an image or a link. I'd like to see another option exposed in a later release that lets us control that with the API. Might be a good IdeaBank post :D
HTMLControlDisplay.ascx (Design View)
<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="HTMLControlDisplay.ascx.vb" Inherits="HTMLControl.HTMLControlDisplay" %>Same deal here with the editor but the HTMLDisplay is just used to display the contents saved in the HTMLEditor control.
<%@ Register TagPrefix="bbnc" Namespace="BBNCExtensions.ServerControls" Assembly="BBNCExtensions" %>
HTMLControlDisplay.ascx (Code Behind)
Imports BBNCExtensionsHere we are just retrieving the stuff that was saved in the Editor and displaying it using HTMLDisplay1.storageHTML. Nothing too fancy.
Partial Public Class HTMLControlDisplay
Inherits BBNCExtensions.Parts.CustomPartDisplayBase
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
getProperties()
End Sub
Private Sub getProperties()
Dim oProperties As Properties 'class contating the availible properties
oProperties = CType(Me.Content.GetContent(GetType(Properties)), Properties) 'this is a BBNC method
If Not oProperties Is Nothing Then
With oProperties
HtmlDisplay1.StorageHTML = oProperties.html
End With
End If
End Sub
End Class
So that's pretty much it. It's really straight forward and again you can apply this to any of the other controls. If there is a specific control you want me to do a post on just drop me a line. Oh and for those of you that are too lazy to copy and paste this into your project, you can download the project here. :D
Don't forget to follow me on Twitter and to join the FaceBook group.
Posted by Garrett at 20:21 0 comments Links to this post
Labels: Blackbaud, custom parts, custom server control, FaceBook, NetCommunity, twitter



