Blog on SharePoint: Series
October 29, 2012
I always wanted to have automatic Series tracking on my blog. So i.e. when you're
writing some long thing breaking it into several posts, the links to the
posts are automatically updated every time a new post gets published.
Manually maintaining those links is boring and also it sometimes messes up
your RSS, because posts get updated and thus they go up in the feed.
Now I have it all automatically, RSS isn't affected, all is great and
works. You can see the thing at the bottom of this page. And it was implemented,
once again, as a simple DataFormWebPart! :)
Actually, the implementation part was a bit tricky, that's why I'm
writing this post.
So basically how can you track series? Since my blog is a document
library, I can just add some "Series" column to the library (most likely
it will be a lookup field to some "Series" list), and then in my
data view I should filter by this "Series" column, right?
In other words, I need to create a DataFormWebPart, which displays
posts belonging to current series. Easy, isn't it? Uh, I thought
so :)
So I opened my SharePoint Designer, and created a simple DFWP pointing to
the articles library.
By the way, are you aware of this handy View Style feature? You see, by
default, your Data View is rendered as a table. But "Posts of this series"
obviously should look like a list, not a table! And wow, it turns out you
can just switch the view to be an ordered list, instead of processing all
those XSLT changes manually:

Very convenient indeed. Of course, some changes
are still necessary, but they are minor now:
-
Wrap title in link, so that it points to the
corresponding article page
-
Add "Posts of this series" header before the
list.
-
Clear empty template in order to avoid
"There are no items in this view" message.
Just for clarity: I'm a developer to bones. I'm perfectly aware of XSLT
and it's not a problem for me to write as much XSLT as it is necessary. And
some time ago I was writing tons of XSLT, yet now I prefer to give SPD the
pass to do as it wants, even although some of its changes are not perfect.
That's neither because I'm in love with SPD nor because I'm lazy, however
both true :) It's just because it's much faster.
I can create almost any possible data view with SPD in no more than 5
minutes. Writing similar XSLT from scratch, even not touching all these
DataSource settings, would take at the very least twice that! And if you don't
know XSLT well enough, it could actually take hours for you.
So let's get back to my Series DFWP. This is what I've got after applying
ordered list style:

Now to wrap post titles into hyperlinks, I
selected a title, then clicked "Hyperlink" ribbon button (Insert tab), and picked
URL Path field from the formula editor (fx button).

Ok, now I can switch to Code view and perform
some XSLT coding at last :)
First task (avoid "No items to show in this view" message) was very simple, I found "dvt_empty"
template and just removed all the contents inside this tag.
Then, in "dvt_1" template, right before "<ol>"
tag, I inserted "<h4>Posts of this
series</h4>".
Ok, now it looks fine, and it's time to filter the dataset (back to
Design view, select DFWP, click "Filter" button on Ribbon). So basically the
condition should be "[value of Series column] equals to [value of Series
column of the current page]".

Here, in the Filter Criteria dialog, SPD allows you
to pass either a hardcoded value or a parameter. Since in my case the value
obviously cannot be hardcoded, I created a new parameter. Parameters can be
of different types, and the types are actually not limited to those which
are presented in SPD.
The most comprehensive description of those
parameters' types (actually in markup, they're presented by ParameterBinding tags)
can be found
in Stefan Stanev's blog post.
Unfortunately, even in the mentioned above blog
post, although it is in fact covers more details than you can find on MSDN,
there is no parameter type (ParameterBinding Location value), which can be
used directly for fetching a property from the current page.
But as you probably know, OOTB way to render
current list item properties to the page is to use
ListItemProperty control. And among parameter types you can notice
"Control" type, which can bind parameter to property value of some
server-side control on the page.
Unfortunately, it turns out that
the ListItemProperty control doesn't expose any property which contains the
desired value. It just renders the value to the page, but doesn't store it in
a public property. No luck.
I started to google on this topic, trying to
find a solution, and stumbled upon a very good post by
Jussi Palo: SharePoint: Filter Data Form Web Part using Metadata
value of current Publishing Page. This blog pointed me to the right
direction: you can use one of BaseFieldControl-derived controls for binding
to the DFWP, leveraging ItemFieldValue property!
Note: it seems that
ItemFieldValue property yields the field value only if the control which
you're using correctly corresponds the field type. For example, value of a
field of type MultiChoice can only be fetched through the
CheckBoxChoiceField control.
Woo-hoo! Now, having this knowledge in mind, I
created control "CurrentArticleSeries":
<SharePoint:LookupField ID="CurrentArticleSeries"
FieldName="Series" Visible="false" runat="server"/>
Then, I pointed my ArticleSeries parameter to this control's ItemFieldValue
property:

And yes, that's that, I've got DataFormWebPart for automatic series
tracking!
Wrap up
- DataFormWebPart is a very powerful OOTB SharePoint webpart, it can
be used in many real scenarios for pulling data from lists and various
other data sources.
- It takes only a couple of minutes to create and configure such
webpart using SharePoint Designer.
- DataFormWebPart can have dynamic parameters. Parameters can be
fetched from query string, control property, server variable, etc., and
used when accessing the data source and also inside XSLT.
Please, feel free to ask any additional questions in the comments!