<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Certified Umbraco Developer | David Conlisk | Web Garden Limited | Blog</title><link>http://web-garden.co.uk/</link><pubDate>Mon, 09 Nov 2009 19:40:30 GMT</pubDate><generator>umbraco</generator><description>This is my blog about Umbraco development, .NET development and general web development-related issues.</description><language>en</language><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/WebGardenBlog" type="application/rss+xml" /><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2FWebGardenBlog" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FWebGardenBlog" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2FWebGardenBlog" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/WebGardenBlog" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FWebGardenBlog" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FWebGardenBlog" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FWebGardenBlog" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><title>SocialFront for Umbraco - Development Day One</title><link>http://feedproxy.google.com/~r/WebGardenBlog/~3/F6XzFJCy-wI/socialfront-for-umbraco---development-day-one.aspx</link><pubDate>Mon, 09 Nov 2009 19:40:30 GMT</pubDate><guid isPermaLink="false">http://web-garden.co.uk//2009/11/9/socialfront-for-umbraco---development-day-one.aspx</guid><description>Certified Umbraco Developer | David Conlisk | Web Garden | blog entry</description><content:encoded><![CDATA[ 
<p>So you and your mate decide to spend the day programming your
new pet project. As you do. You agree a time and place. You turn up
ready to go. But you're not ready to go. Why? Because you haven't
thought about the practicalities. You've been too busy with your
day job.</p>

<p>Well, maybe you'd do better, but <a href="http://www.itsux.com/"
target="_blank">Jon</a> and I made the most basic of errors. But
despite this we had a great day - productive and enjoyable. So I
thought I'd share a report on the day that you might find amusing,
but also might help you if you decide to do something similar. It's
basic as hell - but it's the little things that get ya!</p>

<p>1. Bring the power supply for your laptop (this one's mine -
still can't believe I did this!). Thankfully there was another Dell
laptop at the office that I could steal for the day. Schoolboy
error number one.</p>

<p>2. Ensure that the power works in the room you'll be working
in.</p>

<p>3. If there is a codebase in a repository somewhere already,
then make sure each team member has logged in and has downloaded
the latest codebase in preparation to hit the ground running. I'd
logged in and changed my avatar - but hadn't changed my password,
so I was locked out. Schoolboy error number two. Also, there is a
difference between being able to log in and being able to download
the code, depending on the granularity of the security settings of
the system you're using.</p>

<p>4. Have plenty of refreshments on hand, and know how everyone
takes their tea. A very important one this, and thankfully Jon was
on it, plenty of tea flowing all day. (I know, real developers
drink coffee, but we're just pretending to be geeks).</p>

<p>5. Ensure your codebase builds and is stable - no last-minute
changes! The last thing you want is to be tweaking it while the
other members of the team twiddle their thumbs while you fix your
mistakes. Bring new code by all means, but don't commit until
you're sure it's going to work - at least then you won't stop
others from getting on with it. Basic SVN best practices.</p>

<p>6. Make sure you're using the database you think you are, and
have the latest version online on your server (if you are running a
demo site like we were). Messing about downloading database
publishing wizards and the like is just more time wasted.</p>

<p>7. Have all of the tools you're going to need installed and
working on your laptop. Make sure you have enough disk space free
for the tools you'll need too (schoolboy error number three).</p>

<p>8. Have your usernames/passwords/connection strings/etc
somewhere central that everyone can access them. Using a forgotten
password link while everyone sits around waiting for the email to
arrive is not very productive.</p>

<p>9. Factor in time for excited tweeting.</p>

<h3>Timeline</h3>

<p>09.30 - 10.00 Fun with power cables and SVN - WASTE.</p>

<p>10.00 - 11.00 Architecture chat.</p>

<p>11.00 - 12.00 Database issues, getting latest database onto the
server, installing database publishing wizard and worrying about
twindling disk space - WASTE.</p>

<p>12.00 - 13.00 Let the real work begin! Creating Umbraco document
types, getting existing code onto server, getting site finally
finally working. Started on user controls.</p>

<p>13.00 - 14.00 Excellent slap-up lunch. We deserve it.</p>

<p>14.00 - 16.30 Awesome burst of creation. Site grows and grows.
Not much said, lots of tea drank.</p>

<p>16:30 User signup live and tested on live site! Can browse to
members, their blogs and galleries, etc.</p>

<p>16:30 - 17:30 Testing, more development and wrap-up.</p>

<h3>Completed</h3>

<p>Member sign up, sign in.</p>

<p>Browse your blogs and image galleries.</p>

<p>Upload images.</p>

<p>Create blog entries.</p>

<p>Add comments to all content.</p>

<h3>Summary</h3>

<p>So we've created the bare bones of a social networking platform
based on Umbraco in a matter of hours. This is a testament to
Umbraco's ease of use rather than our programming prowess that's
for sure. It shows you how much is possible with Umbraco in a short
time - imagine if we'd actually been organised! We have a second
day of SocialFront development planned for later in the month and
hopefully we'll be releasing the lot before the end of the year. As
I said in the <a
href="/2009/11/9/socialfront-for-umbraco---introduction.aspx"
target="_blank">Introduction to SocialFront</a> we are hoping to
provide the foundation for Umbraco developers to build on, and
we're hoping that folk will get involved. Having both worked on a
number of large social networking sites, and with Jon's extensive
experience with the existing systems out there, and knowing what
the Umbraco community is like, we are confident that we are
starting the development of a system to rival the best of the
paid-for social networking platforms out there. We have plenty of
ideas for future development, but first step is to get the code out
the door so people can see it and use it and get involved. Watch
this space!</p>
<img src="http://feeds.feedburner.com/~r/WebGardenBlog/~4/F6XzFJCy-wI" height="1" width="1"/>]]></content:encoded><feedburner:origLink>http://web-garden.co.uk//2009/11/9/socialfront-for-umbraco---development-day-one.aspx</feedburner:origLink></item><item><title>SocialFront for Umbraco - Introduction</title><link>http://feedproxy.google.com/~r/WebGardenBlog/~3/-agjNwCBkkg/socialfront-for-umbraco---introduction.aspx</link><pubDate>Mon, 09 Nov 2009 18:57:48 GMT</pubDate><guid isPermaLink="false">http://web-garden.co.uk//2009/11/9/socialfront-for-umbraco---introduction.aspx</guid><description>Certified Umbraco Developer | David Conlisk | Web Garden | blog entry</description><content:encoded><![CDATA[ 
<p>For the past six months or so I've been chatting with my good
friend <a href="http://www.itsux.com/" target="_blank">Jon
Carlos</a> (<a href="http://twitter.com/billywizz"
target="_blank">@billywizz on twitter</a>) (see <a
href="http://www.itsux.com/" target="_blank">his blog</a> for some
more preamble to the project) about coming together and developing
an open-source social networking platform. We've worked together in
the past and we share a pretty similar outlook as web developers.
Most importantly we get on and we know that we work well together
(luckily having a similar taste in music is not so important. Next
code camp I'll be getting back to my grunge roots, that's all I'm
saying.). Some of the ideas that we like, to give you an idea,
are:</p>

<p><a href="http://www.joelonsoftware.com/items/2009/09/23.html"
target="_blank">The Duct Tape Programmer</a> (may as well get the
controversial ones in there first!)</p>

<p><a
href="http://girldeveloper.com/waxing-dev/how-to-contribute-to-open-source-when-you-re-not-exactly-scott-hanselman/"
 target="_blank">How to Contribute to Open Source (When You're Not
Exactly Scott Hanselman)</a></p>

<p><a
href="http://code.google.com/events/io/2009/sessions/MythGeniusProgrammer.html"
 target="_blank">The Myth of the Genius Programmer</a></p>

<p><a
href="http://www.cs.utexas.edu/~EWD/transcriptions/EWD03xx/EWD340.html"
 target="_blank">The Humble Programmer</a></p>

<p>So you might get the impression that we are not hot-shot
programmers - and you'd be right. We certainly aren't. But we have
a good idea, and we're willing to give it a shot, and we're even
willing to let the uber-programmers in the community see our
"work". We are all about making a start, a foundation, for the work
to continue from. We hope that people will like what we produce and
find it interesting and useful enough that they will make use of it
and perhaps even contribute to it themselves.</p>

<p>Initially we thought about developing the site in a number of
different ways. We got bogged down in the latest and greatest
technologies and even talked about IOC for a while. We both wanted
to play with and learn to use this trendy new MVC stuff, and maybe
we could use LINQ as well just to be cool. We got nowhere. We read
a lot, learned a lot, be we developed squat. So the project kind of
died a death for a while. Then we thought about what we were doing
and realised that what we really needed to do was Keep It Simple.
We also didn't really want to reinvent the wheel. And we both had
plenty of good experience with Umbraco. I think you can see what
happened next.</p>

<p>Anyway to get to the point Jon and I agreed to commit to two
full days of coding with Umbraco to see what kind of magic we could
come up with in that admittedly short timescale. And last Saturday
was day 1.We learnt a lot, made plenty of mistakes, made plenty of
progress, and had a lot of fun. (Non-geeks: fun is a relative
term). We aren't about to release anything just yet, as we have a
second day to do towards the end of this month, with a view to
releasing an alpha (pre-alpha?) version by Christmas. Right Jon?
But I thought I'd blog about it and share our experiences with the
community over the next few blog posts, as a kind of teaser and
lead-up to the release of the package itself. I don't want to big
it up too much - but it's going to be AWESOME.</p>
<img src="http://feeds.feedburner.com/~r/WebGardenBlog/~4/-agjNwCBkkg" height="1" width="1"/>]]></content:encoded><feedburner:origLink>http://web-garden.co.uk//2009/11/9/socialfront-for-umbraco---introduction.aspx</feedburner:origLink></item><item><title>Umbraco site upgraded to v4.0.2.1 and new twitter package installed</title><link>http://feedproxy.google.com/~r/WebGardenBlog/~3/rvda9PcuIIM/umbraco-site-upgraded-to-v4021-and-new-twitter-package-installed.aspx</link><pubDate>Fri, 21 Aug 2009 09:01:42 GMT</pubDate><guid isPermaLink="false">http://web-garden.co.uk//2009/8/21/umbraco-site-upgraded-to-v4021-and-new-twitter-package-installed.aspx</guid><description>Certified Umbraco Developer | David Conlisk | Web Garden | blog entry</description><content:encoded><![CDATA[ 
<p>If any of you have live sites running Umbraco v4 then you'll
probably have noticed the helpful little popup that lets you know
when there is a new version of Umbraco available. Or maybe you
don't think it's so helpful at all - when your customers ring you
up demanding an upgrade to the latest version!</p>

<p>Everyone knows how upgrading a site can lead to problems, and
sometimes work like this is just more hassle than it's worth. If
this is your attitude, it's pretty simple to turn off the
notifications by updating the following entry in your
web.config:</p>

<pre class="brush: xml">
&lt;add key="umbracoVersionCheckPeriod" value="7" /&gt;
</pre>

<p>Set the value to zero to turn off the updates - the default
value is to check for a new version<br />
every 7 days. It's also worth noting that this popup only appears
to administrator-type users of the site.</p>

<p>But in reality there's nothing to be afraid of, the upgrade
process is pretty straightforward, at least for a minor upgrade
such as the one I've just finished with the Web Garden site. You
can find the <a href="http://umbraco.codeplex.com"
target="_blank">latest version of Umbraco for download here</a>
along with all the documentation you could possibly need to ensure
a smooth upgrade process. This includes install guides for a number
of server setups, and an upgrade guide which deals with the various
upgrade scenarios. Of course you should avoid upgrading your live
site directly; upgrade your local or dev version first, do your
testing, and then ftp the changes to the live server when you're
happy it's all ready to go.</p>

<p>I've also installed Warren Buckley's <a
href="http://twitter4umbraco.codeplex.com/"
target="_blank">Twitter4Umbraco</a> package to display my latest
tweet on the website. Once again Ashleigh at <a
href="http://www.ash-creative.com/" target="_blank">Ash
Creative</a> came up with the design in keeping with the look and
feel of the Web Garden site and I think it brightens everything up
a little. It's a great little package and very easy to use - a good
example of how easy it is to extend Umbraco with packages. For many
other excellent Umbraco packages, check out the <a
href="http://our.umbraco.org/projects" target="_blank">Umbraco
project hub</a> which is filled with the latest code from the
community.</p>
<img src="http://feeds.feedburner.com/~r/WebGardenBlog/~4/rvda9PcuIIM" height="1" width="1"/>]]></content:encoded><feedburner:origLink>http://web-garden.co.uk//2009/8/21/umbraco-site-upgraded-to-v4021-and-new-twitter-package-installed.aspx</feedburner:origLink></item><item><title>Umbraco quick tip: export your document type to save time</title><link>http://feedproxy.google.com/~r/WebGardenBlog/~3/UupXHksb77E/umbraco-quick-tip-export-your-document-type-to-save-time.aspx</link><pubDate>Fri, 17 Apr 2009 13:24:10 GMT</pubDate><guid isPermaLink="false">http://web-garden.co.uk//2009/4/17/umbraco-quick-tip-export-your-document-type-to-save-time.aspx</guid><description>Certified Umbraco Developer | David Conlisk | Web Garden | blog entry</description><content:encoded><![CDATA[ 
<p>A quick tip for a Friday afternoon. Let's say you've been
working on your Umbraco site for a while, and there's a version on
a server somewhere that the client is using. You need to add loads
of attributes to an existing document type (exists on both
versions). It's a pain, because you have to do it locally, test
your layouts, etc, and then re-do your changes on the server (I'm
assuming that you don't have access to the Courier tool here).</p>

<p>Well, actually, you don't. Just export your document type from
your local install, and import it on your server, and it will
magically overwrite the existing document type! This means that
existing nodes that use that document type now have all of your new
attributes!</p>

<p><strong><em>Disclaimer</em></strong>: this has worked a grand
total of once for me, so be careful! Also, I have no idea what
happens to your data if you change existing attribute types - this
worked nicely when I had to <em>add</em> many new attributes. As I
said, this is a <em>quick</em> tip! Use at your own risk!</p>
<img src="http://feeds.feedburner.com/~r/WebGardenBlog/~4/UupXHksb77E" height="1" width="1"/>]]></content:encoded><feedburner:origLink>http://web-garden.co.uk//2009/4/17/umbraco-quick-tip-export-your-document-type-to-save-time.aspx</feedburner:origLink></item><item><title>Umbraco: using macros with the richtext editor to give more control over content</title><link>http://feedproxy.google.com/~r/WebGardenBlog/~3/PYIfZU8ZIsw/umbraco-using-macros-with-the-richtext-editor-to-give-more-control-over-content.aspx</link><pubDate>Sun, 05 Apr 2009 15:41:45 GMT</pubDate><guid isPermaLink="false">http://web-garden.co.uk//2009/4/5/umbraco-using-macros-with-the-richtext-editor-to-give-more-control-over-content.aspx</guid><description>Certified Umbraco Developer | David Conlisk | Web Garden | blog entry</description><content:encoded><![CDATA[ 
<p>When the designs came through for my latest Umbraco project, I
saw that on certain pages there were images embedded in the main
page content. Beneath these images were a caption header and
caption text. It looked great.</p>

<p>From my point of view, I saw that I had a number of options. I
could add three fields to each document type which could have such
an image: one for the image, one for the caption header, and one
for the caption text. Then I could create two templates - one that
had extra fields for the image, caption header and caption text,
and another without. Then the content editor could choose which
template was required. Or, I could create a macro to be used in the
richtext editor - a much more elegant solution. Here's how to do
it.</p>

<p>Firstly, I updated the image media type so that content editors
could add a caption header and caption text to any image that they
wanted to:</p>

<p><a
href="/media/3194/WindowsLiveWriter_Umbracousingmacroswiththerichtexteditort_E5A0_mediatype_6.jpg"
 target="_blank"><img src="/media/3199/WindowsLiveWriter_Umbracousingmacroswiththerichtexteditort_E5A0_mediatype_thumb_2.jpg" width="244" height="167" alt="mediatype" border="0" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px"/></a></p>

<p>Then I created a new xslt macro called Image With Caption. Here
is the xslt. Note that it takes one parameter, which is a
mediaCurrent parameter type (hence the slightly unusual way of
accessing the macro parameter).</p>

<pre class="brush: xslt">
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE xsl:stylesheet [ &lt;!ENTITY nbsp " "&gt; ]&gt;
&lt;xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxml="urn:schemas-microsoft-com:xslt"
    xmlns:umbraco.library="urn:umbraco.library" xmlns:Exslt.ExsltCommon="urn:Exslt.ExsltCommon" xmlns:Exslt.ExsltDatesAndTimes="urn:Exslt.ExsltDatesAndTimes" xmlns:Exslt.ExsltMath="urn:Exslt.ExsltMath" xmlns:Exslt.ExsltRegularExpressions="urn:Exslt.ExsltRegularExpressions" xmlns:Exslt.ExsltStrings="urn:Exslt.ExsltStrings" xmlns:Exslt.ExsltSets="urn:Exslt.ExsltSets" 
    exclude-result-prefixes="msxml umbraco.library Exslt.ExsltCommon Exslt.ExsltDatesAndTimes Exslt.ExsltMath Exslt.ExsltRegularExpressions Exslt.ExsltStrings Exslt.ExsltSets "&gt;


&lt;xsl:output method="html" omit-xml-declaration="yes"/&gt;

&lt;xsl:param name="currentPage"/&gt;
  &lt;xsl:param name="image" select="/macro/image/node"/&gt;

&lt;xsl:template match="/"&gt;


  &lt;div class="img img203"&gt;
    &lt;img class="left" height="138" width="203"&gt;
      &lt;xsl:attribute name="src"&gt;
        &lt;xsl:value-of select="$image/data[@alias = 'umbracoFile']"/&gt;
      &lt;/xsl:attribute&gt;
      &lt;xsl:attribute name="alt"&gt;
        &lt;xsl:value-of select="$image/data[@alias = 'altText']"/&gt;
      &lt;/xsl:attribute&gt;
    &lt;/img&gt; 
    &lt;p class="caption"&gt;
      &lt;span class="highlight"&gt;
        &lt;xsl:value-of select="$image/data[@alias = 'captionHeading']"/&gt;
      &lt;/span&gt;  &lt;xsl:value-of select="$image/data[@alias = 'captionText']"/&gt;
    &lt;/p&gt;
  &lt;/div&gt;

&lt;/xsl:template&gt;

&lt;/xsl:stylesheet&gt;
</pre>

<p>And here is the macro. Note that I have checked the "use in
editor" checkbox - this means that you can use the macro in the
richtext editor, as you'll see.</p>

<p><a
href="/media/3204/WindowsLiveWriter_Umbracousingmacroswiththerichtexteditort_E5A0_macro_2.jpg"
 target="_blank"><img src="/media/3209/WindowsLiveWriter_Umbracousingmacroswiththerichtexteditort_E5A0_macro_thumb.jpg" width="244" height="182" alt="macro" border="0" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px"/></a></p>

<p>I've also set up the macro with a single MediaCurrent parameter,
so that the user can specify which image they want to include in
the content:</p>

<p><a
href="/media/3214/WindowsLiveWriter_Umbracousingmacroswiththerichtexteditort_E5A0_macroparameters_2.jpg"
 target="_blank"><img src="/media/3219/WindowsLiveWriter_Umbracousingmacroswiththerichtexteditort_E5A0_macroparameters_thumb.jpg" width="244" height="54" alt="macroparameters" border="0" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px"/></a></p>

<p>And that's pretty much it for configuring the functionality. For
your content manager, they can now use the insert macro button to
insert a macro into their content:</p>

<p><img src="/media/3224/WindowsLiveWriter_Umbracousingmacroswiththerichtexteditort_E5A0_insertmacro_3.jpg" width="38" height="39" alt="insertmacro" border="0" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px"/></p>

<p>When they click this button, they get a list of all macros that
you have defined for your site as being available to use in the
editor:</p>

<p><a
href="/media/3229/WindowsLiveWriter_Umbracousingmacroswiththerichtexteditort_E5A0_insertmacrowindow_2.jpg"
 target="_blank"><img src="/media/3234/WindowsLiveWriter_Umbracousingmacroswiththerichtexteditort_E5A0_insertmacrowindow_thumb.jpg" width="233" height="244" alt="insertmacrowindow" border="0" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px"/></a></p>

<p>Click OK, and then they get to choose the image that they want
to display:</p>

<p><a
href="/media/3239/WindowsLiveWriter_Umbracousingmacroswiththerichtexteditort_E5A0_chooseimage_2.jpg"
 target="_blank"><img src="/media/3244/WindowsLiveWriter_Umbracousingmacroswiththerichtexteditort_E5A0_chooseimage_thumb.jpg" width="234" height="244" alt="chooseimage" border="0" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px"/></a></p>

<p>Click choose, and select the image required by browsing the
Media section of the site. Click on the image they want and then
click the OK button. Now themacro should appear in the content in
the richtext editor:</p>

<p><a
href="/media/3249/WindowsLiveWriter_Umbracousingmacroswiththerichtexteditort_E5A0_macroineditor_2.jpg"
 target="_blank"><img src="/media/3254/WindowsLiveWriter_Umbracousingmacroswiththerichtexteditort_E5A0_macroineditor_thumb.jpg" width="244" height="152" alt="macroineditor" border="0" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px"/></a></p>

<p>How it appears in the richtext editor is not necessarily how it
will appear on the site. It depends on the stylesheets on the site
and the markup in the xslt as to how it will appear. You'll notice
that my xslt file has a lot of custom markup like heights and
widths and classes in there to style the output.</p>

<p>So there you have it. A user-friendly way of inserting stylish
content straight into your richtext editor without any need for
content managers to mess about with html or understand xslt. Yet
another great feature of Umbraco!</p>

<p>David</p>
<img src="http://feeds.feedburner.com/~r/WebGardenBlog/~4/PYIfZU8ZIsw" height="1" width="1"/>]]></content:encoded><feedburner:origLink>http://web-garden.co.uk//2009/4/5/umbraco-using-macros-with-the-richtext-editor-to-give-more-control-over-content.aspx</feedburner:origLink></item><item><title>Umbraco search engine optimisation with the PingXMLRPC package</title><link>http://feedproxy.google.com/~r/WebGardenBlog/~3/Eyqvyha00Uk/umbraco-search-engine-optimisation-with-the-pingxmlrpc-package.aspx</link><pubDate>Mon, 30 Mar 2009 17:10:46 GMT</pubDate><guid isPermaLink="false">http://web-garden.co.uk//2009/3/30/umbraco-search-engine-optimisation-with-the-pingxmlrpc-package.aspx</guid><description>Certified Umbraco Developer | David Conlisk | Web Garden | blog entry</description><content:encoded><![CDATA[ 
<p>When you blog about something on your website, you want people
to know about it. The more people that know about it the better.
And the more blog search engines that know about it, the better it
is for your search engine optimisation (SEO).</p>

<p><a href="http://www.nibble.be/?page_id=2" target="_blank">Tim
Geyssens</a> has created a very useful package for Umbraco (in
fact, he has created <a href="http://www.nibble.be/?page_id=4"
target="_blank">several</a>) that lets some of the more important
blog-related sites know that you've published new content or
updated your existing content in your blog. From the package
documentation:</p>

<blockquote>
<p>By default, the package is set up to work with the umbracoblog
package so that every time you create a new blog post or update an
existing one, this package sends out a ping (asynchronously) to a
list of sites specified in the config file to notify them
immediately of the new or updated post. You can easily configure
the package to work with your own document types instead of the
umbracoblog package.</p>
</blockquote>

<p>The package is called PingXMLRPC, and it is available from the
Umbraco package repository. Just go to the developer section of
Umbraco, expand the Packages folder and click on the Umbraco
package repository link. Choose Website Utilities, and then
PingXMLRPC. Here you can download and install the package. You can
also link directly to it here: <a
href="http://packages.umbraco.org/packages/website-utilities/pingxmlrpc?callback="
 target="_blank">Tim's excellent PingXMLRPC package for
Umbraco</a>.</p>

<p>The <a
href="http://packages.umbraco.org/media/1709/pingxmlrpc_1.1.1.pdf"
target="_blank">documentation</a> [pdf] is linked to from here too
and it explains how you can customise it for your own purposes. I
have set mine up to ping a long list of blog search engines every
time a blog entry is published, including <a
href="http://technorati.com/" target="_blank">technorati.com</a>
and <a href="http://blogsearch.google.com/"
target="_blank">blogsearch.google.com</a>, among many others. A
great way to increase your online profile without doing very much
extra work at all.</p>

<p>David</p>
<img src="http://feeds.feedburner.com/~r/WebGardenBlog/~4/Eyqvyha00Uk" height="1" width="1"/>]]></content:encoded><feedburner:origLink>http://web-garden.co.uk//2009/3/30/umbraco-search-engine-optimisation-with-the-pingxmlrpc-package.aspx</feedburner:origLink></item><item><title>Umbraco with Windows Live Writer integration: the dangers</title><link>http://feedproxy.google.com/~r/WebGardenBlog/~3/AWV2ZqHhaes/umbraco-with-windows-live-writer-integration-the-dangers.aspx</link><pubDate>Sun, 29 Mar 2009 15:51:29 GMT</pubDate><guid isPermaLink="false">http://web-garden.co.uk//2009/3/29/umbraco-with-windows-live-writer-integration-the-dangers.aspx</guid><description>Certified Umbraco Developer | David Conlisk | Web Garden | blog entry</description><content:encoded><![CDATA[ 
<p>Yesterday I upgraded the Web Garden site to Umbraco v4.0.1. I
added some blog entries, and twittered about them, and even had
some comments from some members of the Umbraco community. I come in
this morning, and my site's totally screwed. It kept redirecting
you to the /config/splashes/noNodes.aspx page, even though in the
admin section all of the pages were there.</p>

<p>I checked over everything. I checked all my Plesk permissions. I
checked that all of the v4.0.1. files had been updated correctly. I
republished the whole site. Repeatedly. I checked the umbracoLog
table in the database. And there it was. An xml error:</p>

<pre>
Xml wasn't saved: System.Xml.XmlException:
</pre>

<pre>
Invalid XML document, The document does not have a root element..
</pre>

<pre>
at System.Xml.XmlDocument.Save(String filename)
</pre>

<pre>
at umbraco.content.SaveContentToDisk(XmlDocument xmlDoc)
</pre>

<p>And it also turns out that the data/umbraco.config file didn't
exist.</p>

<p>Here's what I think happened. When I was testing Live Writer
integration, I kept getting errors to do with special characters,
specifically where single, straight quotes were being converted to
"smart" quotes, and my dashes were becoming other characters that
were in fact invalid characters to include in xml. The blog entries
were appearing in Umbraco, but Live Writer was crapping out on
me.</p>

<p>I deleted the offending files in Umbraco and messed about with
the settings in Live Writer. I'm using Windows Live Writer 2009,
and there are a couple of options that you need to check:</p>

<p>Go to Tools -&gt; Options... and choose the Editing tab</p>

<p>Uncheck the following options:</p>

<p>- Replace hyphens (--) with dash (-)</p>

<p>- Replace "straight quotes" with "smart quotes"</p>

<p>- Replace other special characters</p>

<p>Save your changes. This will prevent Live Writer from uploading
invalid xml characters to your Umbraco site. Because the Umbraco
content tree is stored as xml, these characters can break your
whole site.</p>

<p>My site was down until I emptied the recycle bin at which point
the invalid characters were finally purged from the site, and the
data/umbraco.config file could be written to disk correctly (at
least, that's my theory at this point!). This is the site structure
stored as xml, and if there are invalid characters, then it won't
get written correctly to disk.</p>

<p>I hope that this helps you if you're having similar issues, or
just configuring Live Writer for client use. Now that these issues
have been ironed out, I'll still be using Live Writer to blog with
ahead of the built-in rich-text editor - it's just so much
easier.</p>

<p>Cheers,</p>

<p>David</p>
<img src="http://feeds.feedburner.com/~r/WebGardenBlog/~4/AWV2ZqHhaes" height="1" width="1"/>]]></content:encoded><feedburner:origLink>http://web-garden.co.uk//2009/3/29/umbraco-with-windows-live-writer-integration-the-dangers.aspx</feedburner:origLink></item><item><title>Web Garden site upgraded to Umbraco v4</title><link>http://feedproxy.google.com/~r/WebGardenBlog/~3/G1ttDxYzJLk/web-garden-site-upgraded-to-umbraco-v4.aspx</link><pubDate>Sat, 28 Mar 2009 17:24:15 GMT</pubDate><guid isPermaLink="false">http://web-garden.co.uk//2009/3/28/web-garden-site-upgraded-to-umbraco-v4.aspx</guid><description>Certified Umbraco Developer | David Conlisk | Web Garden | blog entry</description><content:encoded><![CDATA[ 
<p>This week I finally got around to upgrading my site to Umbraco
v4. I've been building up a wishlist of things to add or change on
the site for months, and now I've checked them all off! Without
further ado, here is a list of the upgrades and features that I've
used. By the way, I know the site doesn't look very different, but
under the hood there's quite a big change!</p>

<p>First off, a couple of packages that I now use on all Umbraco
sites as standard:</p>

<p><strong>1.</strong> <a
href="http://www.percipientstudios.com/imagegen.aspx"
target="_blank"><strong>Douglas Robar's excellent ImageGen
package</strong></a></p>

<p>You can get from the Umbraco package repository (Developer
section -&gt; packages in the Umbraco admin). I uploaded the
content images for the site to the Media section, and then linked
to them using ImageGen instead of a direct link in the html. This
means that the images are cached automatically for me. I don't use
thumbnails on my site, but for client sites that is often a
requirement, and ImageGen is an excellent tool for that - the
images look better than squashing them with height and width values
in the html, and again you can take advantage of the caching to
speed up page load times.</p>

<p><strong>2.</strong> <a
href="http://www.dijksterhuis.nu/peterdcompress.aspx"
target="_blank"><strong>PeterD's compression
package</strong></a></p>

<p>This is another staple for all my Umbraco sites. Dead simple to
install and configure (the instructions are included when you
install the package and they are very easy to follow), this tool
compresses all of your javascript and css files. It also merges
multiple javascript and css references in the header into a single
reference for each, thus improving response times. It's pretty much
free compression, there's no reason not to have this tool on every
site you build.</p>

<p>And some other improvements that I've been meaning to make for
ages now:</p>

<p>The <strong>blog package</strong> was completely updated to the
<a href="http://www.nibble.be/?p=57" target="_blank">new blog for
Umbraco v4</a>. This is available from the package repository. It
checked a number of things on my wishlist, including Gravatars in
the blog comments, a blogroll, categories and date filtering and
archiving. I did customise the xslt for my own uses a bit but the
vast majority of the work was already done.</p>

<p>I also implemented <strong>AJAX comments</strong> on my site.
Once again I turned to PeterD for help with this one (<a
href="http://www.dijksterhuis.nu/blog/2008/6/29/ajax-comments.aspx"
target="_blank">Implementing AJAX comments on your Umbraco
site</a>). I actually took his code and messed with it a bit so
that I could use it both for blog comments and for the contact form
on my site. Using his datatype for blog comments but also using
Tim's Umbraco blog package meant I had to make some minor tweaks to
get them to play nice together but they seem to work well now.</p>

<p><strong>Syntax highlighting for code</strong> in my blog posts
is something I've wanted for ages. I used <a
href="http://alexgorbatchev.com/wiki/"
target="_blank">SyntaxHighlighter version 2.0</a> for this. It
provides a number of "brushes" which are basically sets of syntax
highlighting tools. I use the Javascript, c# and Sql brushes on the
site. It works using javascript along with some very simple css. I
add tags like &lt;pre class="brush: c#"&gt;code here&lt;/pre&gt;
around my code and it does the rest using javascript. Smart.</p>

<p><strong>Twitter integration</strong> I used <a
href="http://www.umbraco.org/blog/2008/4/21/twitter-package-for-umbraco"
 target="_blank">Warren Buckley's Twitter package for Umbraco</a>.
It displays a number of my latest tweets, or it can be configured
to include tweets of those people that I follow, i.e. my whole
tweet stream. You'll probably notice that you can't see it on the
site at the moment. Well, that's because I'm a really crap designer
and I'm going to wait until I get someone to make it look nice for
me!</p>

<p><strong>Windows LiveWriter integration</strong>. I followed <a
href="http://www.nibble.be/?p=13" target="_blank">Tim's excellent
instructions to configure Windows LiveWriter</a>. They are for an
older version of Windows Live Writer than the latest one but they
still work. You can <a href="http://download.live.com/writer"
target="_blank">download Windows Live Writer from the Microsoft
site</a>. This makes it a hell of a lot easier to post code, for
example. I find that Tiny MCE does strange things when you try and
paste code into the HTML view, and you can often lose your tags.
This way is much easier, and it keeps a draft copy locally too.</p>

<p><strong>Google Sitemap</strong>. This is just an xslt template
which creates a sitemap in the format that Google likes. I then let
Google know about it and they can use it to index my site and work
out where the new pages are. It also allows you to specify how
often the content is updated, and which are the most important
pages on your site. Great for search engine optimisation.</p>

<p>Of course the irony is that just as I finally upgrade to v4.0.0,
v4.0.1 is released! Sometimes being a cutting edge developer is
hard work :) Luckily though the upgrade is straightforward and
easy. There is a good blog post on <a
href="http://forum.umbraco.org/yaf_postsm42971_Upgrade-Umbraco-400-to-401.aspx#42971"
 target="_blank">how to upgrade your Umbraco v4.0.0 site to
v4.0.1</a> on the forum by PeterD. Dead simple.</p>

<p>David</p>
<img src="http://feeds.feedburner.com/~r/WebGardenBlog/~4/G1ttDxYzJLk" height="1" width="1"/>]]></content:encoded><feedburner:origLink>http://web-garden.co.uk//2009/3/28/web-garden-site-upgraded-to-umbraco-v4.aspx</feedburner:origLink></item><item><title>An update to my Umbraco helper class</title><link>http://feedproxy.google.com/~r/WebGardenBlog/~3/6CCZ9A4KW3M/an-update-to-my-umbraco-helper-class.aspx</link><pubDate>Sat, 28 Mar 2009 16:04:52 GMT</pubDate><guid isPermaLink="false">http://web-garden.co.uk//2009/3/28/an-update-to-my-umbraco-helper-class.aspx</guid><description>Certified Umbraco Developer | David Conlisk | Web Garden | blog entry</description><content:encoded><![CDATA[ 
<p>I previously blogged about <a
href="/2009/1/15/a-simple-umbraco-helper-class-to-get-umbraco-data-into-your-usercontrols.aspx"
 target="_blank">a simple Umbraco helper class to get Umbraco data
into your usercontrols</a>, but since then I've updated it quite a
bit. Due to ongoing efforts to package up my code into more easily
re-usable chunks, I've created a new class library,
WebGarden.Utilities, that I just add to each new project. It gives
me access to a number of handy functions, a few of which I'm going
to share here (the more general purpose ones).</p>

<p>The way that I get Umbraco information to my user controls is
through the use of the web.config file (<a
href="/2009/1/15/a-simple-umbraco-helper-class-to-get-umbraco-data-into-your-usercontrols.aspx"
 target="_blank">see my other post for more details</a>), so I'll
assume that you understand that method. It means that there is a
central location to change each setting, regardless of how many
different user controls use those settings. I think this is a
little easier to maintain than passing parameters - what if you are
passing a settings node parameter to seven different macros in
twelve different templates, and for some reason the settings node
id changes? With the web.config solution, you only have to update
it in one place.</p>

<p>Anyway, I've updated my methods so that if you've forgotten to
set your values in the web.config, or if the setting is there but
empty or invalid, then you get a nice big exception thrown telling
you exactly what the problem is. Remember that this is only
supposed to happen during development/testing phase of your
project, and its supposed to explicitly tell you the problem so you
can fix it quickly. These exceptions should never be thrown once
the site is live. So here are my methods hope you find them
interesting/thought provoking/useful. As always I'm interested in
the best way to do things so if you disagree with my methods or
there's a better way please let me know! Also, I'd love to hear if
you use the code, or make any modifications, or whatever.</p>

<p>Cheers,</p>

<p>David</p>

<p>P.S. I'm pretty sure there must be a better way to implement
GetImageAltText and GetImagePath let me know if you know what that
is!</p>

<pre class="brush: csharp">
using System;
using System.Configuration;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using umbraco.cms.businesslogic.web;
using umbraco.presentation.nodeFactory;
using umbraco.BusinessLogic;
using umbraco.cms.businesslogic.member;
using System.Collections.Specialized;
using System.Xml.XPath;

namespace WebGarden.Utilities
{
    public static class UmbracoHelper
    {
        /// &lt;summary&gt;
        /// Get the name of the specified node
        /// from the Umbraco content section
        /// &lt;/summary&gt;
        /// &lt;param name="productId"&gt;&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        public static string GetContentNodeName(int nodeId)
        {
            // Get the countries from the Umbraco content - children of the Countries node
            Node n = new Node(nodeId);

            return n.Name;
        }

        public static string GetContentNodeProperty(string appSettingName, string propertyName)
        {
            if (ConfigurationManager.AppSettings[appSettingName] == null)
            {
                throw new Exception(String.Format("The app setting {0} does not exist in the web.config. It should exist and contain the id of an Umbraco node.", appSettingName));
            }

            int nodeId = 0;
            if (!int.TryParse(ConfigurationManager.AppSettings[appSettingName], out nodeId))
            {
                throw new Exception(String.Format("The app setting {0} in the web.config does not contain a valid integer. It should contain the id of an Umbraco node.", appSettingName));
            }

            return GetContentNodeProperty(nodeId, propertyName);
        }

        /// &lt;summary&gt;
        /// Get the value of the named attribute of the specified node
        /// from the Umbraco content section
        /// &lt;/summary&gt;
        /// &lt;param name="productId"&gt;&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        public static string GetContentNodeProperty(int nodeId, string propertyName)
        {
            // Get the countries from the Umbraco content - children of the Countries node
            Node n = new Node(nodeId);

            if (n == null || n.Id == 0)
            {
                throw new Exception(String.Format("The requested node (id {0}) was not found by WebGarden.Utilities.GetUmbracoContentNodeProperty when looking for the {1} property", nodeId, propertyName));
            }

            if (n.GetProperty(propertyName) == null)
            {
                throw new Exception(String.Format("The property {0} does not exist in the current node {1} (id {2})", propertyName, n.Name, nodeId));
            }
            return n.GetProperty(propertyName).Value;
        }

        /// &lt;summary&gt;
        /// Get the value of the named attribute of the CURRENT node
        /// from the Umbraco content section
        /// &lt;/summary&gt;
        /// &lt;param name="productId"&gt;&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        public static string GetCurrentNodeProperty(string propertyName)
        {
            return GetContentNodeProperty(Node.GetCurrent().Id, propertyName);
        }

        /// &lt;summary&gt;
        /// Takes the name of an appsetting in the web.config and returns the umbraco nice url to the node
        /// Assumes that the App Setting exists and contains a valid Umbraco node id
        /// &lt;/summary&gt;
        /// &lt;param name="appSettingName"&gt;&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        public static string GetNiceUrlFromAppSetting(string appSettingName)
        {
            if (ConfigurationManager.AppSettings[appSettingName] == null)
            {
                throw new Exception(String.Format("The app setting {0} does not exist in the web.config. It should exist and contain the id of an Umbraco node.", appSettingName));
            }

            int nodeId = 0;
            if (!int.TryParse(ConfigurationManager.AppSettings[appSettingName], out nodeId))
            {
                throw new Exception(String.Format("The app setting {0} in the web.config does not contain a valid integer. It should contain the id of an Umbraco node.", appSettingName));
            }

            return umbraco.library.NiceUrl(nodeId);
        }

        /// &lt;summary&gt;
        /// Takes the name of an appsetting in the web.config and returns the umbraco node
        /// Assumes that the App Setting exists and contains a valid Umbraco node id
        /// &lt;/summary&gt;
        /// &lt;param name="appSettingName"&gt;&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        public static Node GetNodeFromAppSetting(string appSettingName)
        {
            if (ConfigurationManager.AppSettings[appSettingName] == null)
            {
                throw new Exception(String.Format("The app setting {0} does not exist in the web.config. It should exist and contain the id of an Umbraco node.", appSettingName));
            }

            int nodeId = 0;
            if (!int.TryParse(ConfigurationManager.AppSettings[appSettingName], out nodeId))
            {
                throw new Exception(String.Format("The app setting {0} in the web.config does not contain a valid integer. It should contain the id of an Umbraco node.", appSettingName));
            }

            return new Node(nodeId);
        }

        /// &lt;summary&gt;
        /// Recursive function to find a content node based on a property value
        /// Checks the propertyName property of each node, and if it matches value then returns 
        /// the id of the node
        /// If the node has children, then it recurses the tree until a match is found
        /// Returns -1 if no match is found
        /// &lt;/summary&gt;
        /// &lt;param name="propertyName"&gt;&lt;/param&gt;
        /// &lt;param name="value"&gt;&lt;/param&gt;
        /// &lt;param name="rootNodeId"&gt;&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        public static int GetNodeIdByProperty(string documentType, string propertyName, string value, int rootNodeId)
        {
            Node n = new Node(rootNodeId);
            int result = -1;

            foreach (Node child in n.Children)
            {
                // If it's a node with the correct documenttype, then check the property value.
                if (child.NodeTypeAlias.ToLower().Equals(documentType.ToLower()))
                {
                    if (child.GetProperty(propertyName).Value.Equals(value))
                    {
                        return child.Id;
                    }
                }
                else
                {
                    // If node has child nodes - recurse over them to find your required node
                    if (child.Children.Count &gt; 0)
                    {
                        result = GetNodeIdByProperty(documentType, propertyName, value, child.Id);
                        if (result != -1)
                        {
                            return result;
                        }
                    }
                }
            }
            return result;
        }

        /// &lt;summary&gt;
        /// Get the value of the named attribute from the Umbraco settings node
        /// &lt;/summary&gt;
        /// &lt;param name="productId"&gt;&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        public static string GetSettingsNodeProperty(string propertyName)
        {
            int nodeId = -1;
            if (int.TryParse(ConfigurationManager.AppSettings["UmbracoSettingsNodeId"], out nodeId))
            {
                // Get the named attribute from the Settings node in Umbraco
                Node n = new Node(nodeId);

                if (n.GetProperty(propertyName) == null)
                {
                    throw new Exception(String.Format("A property called {0} was expected in the Umbraco settings node (id: {1}). Note that this is case sensitive.", propertyName, nodeId));
                }
                return n.GetProperty(propertyName).Value;
            }
            else
            {
                throw new Exception("You must enter a valid integer for UmbracoSettingsNodeId in the web.config");
            }
        }

        /// &lt;summary&gt;
        /// Takes the id of an image in the media section of Umbraco and returns the alt text
        /// &lt;/summary&gt;
        /// &lt;param name="mediaId"&gt;&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        public static string GetImageAltText(int mediaId)
        {
            // Get the path to the image
            XPathNodeIterator xImage = umbraco.library.GetMedia(mediaId, true);
            XPathNodeIterator nodes = xImage.Current.Select("/node/data[@alias='altText']");
            string path = string.Empty;

            while (nodes.MoveNext())
            {
                path = nodes.Current.Value;
                break;
            }
            return path;
        }

        /// &lt;summary&gt;
        /// Takes the id of an image in the media section of Umbraco and returns the path to that image
        /// &lt;/summary&gt;
        /// &lt;param name="mediaId"&gt;&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        public static string GetImagePath(int mediaId)
        {
            // Get the path to the image
            XPathNodeIterator xImage = umbraco.library.GetMedia(mediaId, true);
            XPathNodeIterator nodes = xImage.Current.Select("/node/data[@alias='umbracoFile']");
            string path = string.Empty;

            while (nodes.MoveNext())
            {
                path = nodes.Current.Value;
                break;
            }
            return path;
        }

        /// &lt;summary&gt;
        /// Takes a list of nodes, a property name and a value, and returns a list of nodes 
        /// where the property value matches the value. Case insensitive.
        /// &lt;/summary&gt;
        /// &lt;param name="nodes"&gt;&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        public static List&lt;Node&gt; TrimNodeListByProperty(List&lt;Node&gt; nodes, string propertyName, string value)
        {
            List&lt;Node&gt; results = new List&lt;Node&gt;();

            foreach (Node n in nodes)
            {
                if (n.GetProperty(propertyName).Value.ToLower() == value.ToLower())
                {
                    results.Add(n);
                }
            }

            return results;
        }

        /// &lt;summary&gt;
        /// Returns the children of a node as a list.
        /// The id of the parent node is taken from the named AppSetting in the web.config file
        /// &lt;/summary&gt;
        /// &lt;param name="appSettingName"&gt;The name of an AppSetting that contains the parent node id&lt;/param&gt;
        /// &lt;returns&gt;A List of Nodes&lt;/returns&gt;
        public static List&lt;Node&gt; GetNodeChildrenFromAppSetting(string appSettingName)
        {
            int nodeId = -1;
            List&lt;Node&gt; results = new List&lt;Node&gt;();

            if (int.TryParse(ConfigurationManager.AppSettings[appSettingName], out nodeId))
            {
                Node n = new Node(nodeId);

                foreach (Node child in n.Children)
                {
                    results.Add(child);
                }
            }
            else
            {
                throw new Exception(String.Format("You must enter a valid integer for the {0} setting in the web.config", appSettingName));
            }
            return results;
        }     
    }
}
</pre>
<img src="http://feeds.feedburner.com/~r/WebGardenBlog/~4/6CCZ9A4KW3M" height="1" width="1"/>]]></content:encoded><feedburner:origLink>http://web-garden.co.uk//2009/3/28/an-update-to-my-umbraco-helper-class.aspx</feedburner:origLink></item><item><title>Umbraco Codegarden 2009 open for registration</title><link>http://feedproxy.google.com/~r/WebGardenBlog/~3/5DDFUJ0bRHk/umbraco-codegarden-2009-open-for-registration.aspx</link><pubDate>Tue, 24 Mar 2009 13:55:49 GMT</pubDate><guid isPermaLink="false">http://web-garden.co.uk//2009/2/10/umbraco-codegarden-2009-open-for-registration.aspx</guid><description>Certified Umbraco Developer | David Conlisk | Web Garden | blog entry</description><content:encoded><![CDATA[ 
<p>For those of you not following <a
href="http://www.twitter.com/umbraco" target="_blank"
title="http://www.twitter.com/umbraco">@umbraco on twitter</a> (why
not?), Niels has just announced that the registrations are open for
Codegarden 2009 in Copenhagen!</p>

<p><a href="http://umbraco.org/codegarden-2009" target="_blank"
title="Codegarden 2009">Codegarden 2009</a> is now open for
registrations, and with a very generous &euro;150 off the price for
early registration (before March 31st). I went last year to my
first Codegarden, and it was excellent. A nicer bunch of folk is
hard to meet, and I made some solid friends there who I'm looking
forward to seeing again this year.</p>

<p>But of course the focus is Umbraco, and as a freelance Umbraco
developer going to Codegarden was probably one of the best
decisions I made in my first year of business. Armed with a box of
business cards, I made some excellent connections and of course I
learned a hell of a lot about Umbraco. It just went 'click!' in my
brain as I saw what people were doing with Umbraco for their sites
- and I could then do for my clients.</p>

<p>Anyway, I think it's obvious that I highly recommend a trip to
Copenhagen. It's June 22nd and 23rd, and it's going to be great.
See you there?</p>
<img src="http://feeds.feedburner.com/~r/WebGardenBlog/~4/5DDFUJ0bRHk" height="1" width="1"/>]]></content:encoded><feedburner:origLink>http://web-garden.co.uk//2009/2/10/umbraco-codegarden-2009-open-for-registration.aspx</feedburner:origLink></item></channel></rss>
