Integrating uBlogsy Templates

Integrating uBlogsy Templates

3rd in a series of uBlogsy articles. This article concentrates on modifying Umbraco Templates to integrate into your existing site.  It assumes you have already read the previous two articles:

 

OK, so we all love Umbraco, but possibly for different reasons.  From a development background, I love that Umbraco gives me a really powerful CMS, but still feels close to .Net.  This makes it easy for me to bespoke where required.

Although a blessing for many .Net developers, without the basic understanding of master pages, making the required changes to uBlogsy Templates (.Net master pages), can be a daunting task.

For those in the .Net development camp, a quick flick though this article and you will be away, however although it would be impossible to equip everyone with enough knowledge to go forth and customise any Umbraco website, this article is targeted to the second category and I hope you will be equipped with enough knowledge to integrate uBlogsy into your existing site.

 

Essential Background

If you arn't already familure with Umbraco Templates or .Net master pages, I have created an article which doesn't cover everything, but should be enough to get us set for uBlogsy customisation.

If you think this may be useful, please follow the below link:

Understanding Umbraco Templates

 

Breaking Down The uBlogsy Templates

Overview

Not only does the uBlogsyBaseSite Template contains a lot of the glue which results in the content been rendered, as uBlogsy can run as a stand alone site, it contains all the other bits which make the page function.  In our existing site, we will have a lot of the plumming already, so we need to break down what is useful from the duplicate machanics already on your existing site.

 

Review of the Existing Site

As each site is different, I will take a worked example using the Business starter kit with the u.Media skin.

Reviewing the layout of the Business starter kit, it has a header, two colums (main content to the left) and a footer.  This fits braodly with the uBlogsy layout, so thinks are looking good.  A deeper look at the "Starterkit Master" (alias umbMaster) Template, revleas some further work is required.

Although the layout of the template contains two columns, all the content in the right column is hard coded.  To allow the uBlogsy content to sit here and other areas in the existing template, ContentPlaceHolder tags can be placed as required, then the uBlogsy template carved up and split into Content tags.

Although working in this way may end in the optimal resault, changing the uBlogsy templates this much will most likley result in requiring a major overhaul of the CSS, so may be best left to the more seasoned Umbraco developers.

In this article, I am going to take a minimalist aproach, giving a good resault plus a deaper knowledge should you deside to take the aprach outlined above.

Prepairing Your Website's Template

uBlogsy produces a number of general features which you may want to keep (e.g. setting meta tags and title tags etc.), requires a javaskript library and requires a css include (unless totally re-working).  To allow these to be passed into your site, you will require a ContentPlaceHolder in the <head> section of your existing master page.

The Business starter kit has the following ContentPlaceHolder already defined, so we will use this:

<asp:ContentPlaceHolder  Id="HeadContent"  runat="server">

</asp:ContentPlaceHolder>

 

If you want to use one of the functions defined in uBlogsy which is already defined in your site, you may also want to wrap additional ContentPlaceHolders round the areas you want to override:

<asp:ContentPlaceHolder   Id="OverrideMe"   runat="server">

Existing code

</asp:ContentPlaceHolder>

Using the above your existing pages will function as they are.

 

As mensioned earlier, you could take this appraoch and continue to disect the rest of your primary master page, however, to simplify the process and get a blog section to your site, which actually looks like your site, we are going to make one more change.  We want to keep our sites header (not refering to the <head> tag) and footer, but insert the blog inbetween.

In your primary masterpage, locate the section which drives the cenrtal content and wrap it in a ContentPlaceHolder tag.

In the Business starter kit, the central content is defined as follows:

"

 <div id="content">
<div id="leftcontent">
<form id="RunwayMasterForm" runat="server">
<asp:contentplaceholder id="cp_content" runat="server"></asp:contentplaceholder>
</form>
</div>
<div id="rightcontent">
<div class="hotspot">
<h4>Edit the right column</h4>
<img src="/images/icons/dezinerfolio/info.png" width="52" height="52"/>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas leo lectus, iaculis a laoreet in, lobortis in ligula. Proin in diam elit. Nulla facilisi. </p>
<a href="#">Find more packages</a>
</div>
<div class="hotspot">
<h4>Create your own Macros and unleash the power of XSLT </h4>
<img src="/images/icons/dezinerfolio/info.png" width="52" height="52"/>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas leo lectus, iaculis a laoreet in, lobortis in ligula. Proin in diam elit. Nulla facilisi. </p>
<a href="#">Using XSLT</a>
</div>
</div>
</div>

 "

 After placing the new ContentPlaceHolder tags around this it will look as follows:

"

<asp:contentplaceholder id="cp_main_content" runat="server">
 <div id="content">
<div id="leftcontent">
<form id="RunwayMasterForm" runat="server">
...
...
...
           </div>
</div>
</div>
</asp:contentplaceholder>

"

Form tag

.Net only allows on <form> tag on your page.  In most sites, this is places just inside the <body> tag, which is the safest bet, allowing for any requirement within.

In the Business starter kit, I noticed <form id="RunwayMasterForm" runat="server"> embedded deep inside the page, so I moved this to just below the <body>, with its closing tag just above the </body> tag:

<body  class="t">
   <form  id="RunwayMasterForm"  runat="server">

...

...

...

    </form>
</body>

 "

The uBlogsy Temlates

What uBlogsy Templates

uBlogsy installes a number of Templates, however, for the perpuse of integrating, uBlogsyBaseSite is the main template, with potential minor changes to the uBlogsyLanding, uBlogsyPand and uBlogsyPost Templates.

uBlogsy Templates

 

Modifying the uBlogsyBaseSite Template

Thier are three things we need to do to the uBlogsyBaseSite template:

  1. Set the master template to your primary master page.
  2. Define a Content tag to populate data into the <head> tag of the primary master page.
  3. Define a Content tag to populate center area of the primary master page.
  4. Delete all other content

 

Setting the Master Template

For the Business starter kit, the primary masterpage is "Starterkit Master".

uBlogsy Set Master Template

 

Defining the Content tags

In the primary master page, the following two content areas have been defined:

  • <asp:ContentPlaceHolder   Id="HeadContent"   runat="server">
  • <asp:contentplaceholder id="cp_main_content" runat="server">

 

 

So in our uBlogsyBaseSite template, we need to define two reciprical tags:

  • <asp:content contentplaceholderid="HeadContent"  runat="server">
  • <asp:content contentplaceholderid="cp_main_content" runat="server">

 

The first is the trickiest, as it depends on your existing header, to what you want from uBlogsy, however the Business starter kit is fairly basic, so in the following example I take most of the existing header section:

   <asp:content  contentplaceholderid="HeadContent"   runat="server">
      <%--get  title  for  browser--%>
         <umbraco:Macro  ID="Macro1"  runat="server"  Language="razor"  Alias="uBlogsyBrowserTitle"  />
         <%--get  meta  title  and  description--%>
         <umbraco:Macro  ID="Macro5"  runat="server"  Alias="uBlogsySeoMeta"  />
         <script  src="/scripts/jquery-1.6.min.js"  type="text/javascript"></script>
         <script  type="text/javascript"  src="http://s7.addthis.com/js/250/addthis_widget.js"></script>
        
         <link  type="text/css"  rel="Stylesheet"  media="screen"  href="/css/uBlogsy.css"  />
         <asp:ContentPlaceHolder  ID="Head"  runat="server"  />
   </asp:content>

 

Note, it is important to keep the ID="Head" content place holder tag hear as it is used in uBlogsyBaseSite's child master pages.

 

The second section is a little more clear cut and should take everything from the uBlogsy div down to the end of the uBlogsy_footer div:

<asp:content  contentplaceholderid="cp_main_content"  runat="server">
    <div  id="uBlogsy">
             <div  id="uBlogsy_header_container">
                 <div  id="uBlogsy_header_inner">
                     <h1>

...

...

...

                         Powered by uBlogsy and Umbraco</div>
                 </div>
             </div>

</asp:content>

 

Note, it is important to keep the ID="LeftCol" content place holder tag hear as it is used in uBlogsyBaseSite's child master pages.

 

 

After deleting all that is left (accept the first line), you should have a uBlogsyBaseSite template (master page) as follows:

"

<Primary Master Page definition on first line>

       <asp:content  contentplaceholderid="HeadContent"   runat="server">

...

...

...

      <asp:ContentPlaceHolder  ID="Head"  runat="server"  />

</asp:content>

<asp:content  contentplaceholderid="cp_main_content"  runat="server">
  <div  id="uBlogsy">

...

...

...

        Powered by uBlogsy and Umbraco</div>
     </div>
    </div>
</asp:content>

"

 

Style Sheet Fix

After applying the above changes, my first view of the site was far from anticipated!

A little digging found an incompatiable setting in the custom style sheet and the offending line removed'

Custom Style Sheet

 

The Final Result

Drum roll and taaaadaaar:

uBlogsy The Result

 

 

 

If you are hungry for more, remember to checkout the Integrating uBlogsy into your Umbraco site article for further changes.

 

Best of luck and let me know how you get on,

Richard

Written by Richard Bowers at 20:00

7 Comments :

Lloyd Apter said...
Hi Richard,

Many thanks for the guidelines on integrating uBlogsy in an existing site template.

My template is different from the startkit site, so i'm battling a bit to understand the instructions and update my site templates accordingly.

My uBlogsyBaseSite looks like this, can you see if there are any errors please?

<%@ Master Language="C#" MasterPageFile="~/masterpages/SEPMaster.master" AutoEventWireup="true" %>

<asp:content ContentPlaceHolderId="cp_head" runat="server">

<!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd">
<html lang="en-GB" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-GB" dir="ltr">

<%--get title for browser--%>
<umbraco:Macro ID="Macro1" runat="server" Language="razor" Alias="uBlogsyBrowserTitle" />
<%--get meta title and description--%>
<umbraco:Macro ID="Macro5" runat="server" Alias="uBlogsySeoMeta" />
<script src="/scripts/jquery-1.6.min.js" type="text/javascript"></script>
<script type="text/javascript" src="http://s7.addthis.com/js/250/addthis_widget.js"></script>

<link type="text/css" rel="Stylesheet" media="screen" href="/css/uBlogsy.css" />
<asp:ContentPlaceHolder ID="Head" runat="server" />

</asp:content>

<asp:content ContentPlaceHolderId="cp_content" runat="server">

<form id="uBlogsy_main_form" runat="server">
<div id="uBlogsy">
<div id="uBlogsy_header_container">
<div id="uBlogsy_header_inner">
<h1>
<%--get site name--%>
<umbraco:Macro runat="server" Language="razor">@{ var landing = uBlogsy.BusinessLogic.DataService.Instance.GetLanding(Model.Id);
<a href="@landing.Url">@landing.uBlogsyContentTitle</a> } </umbraco:Macro>
</h1>
</div>
</div>
<%--top navigation--%>
<div id="uBlogsy_nav_container">
<umbraco:Macro runat="server" Alias="uBlogsyNavigation" />
</div>
<div id="uBlogsy_main">
<div id="uBlogsy_left_col">
<asp:contentplaceholder id="LeftCol" runat="server" />
</div>
<div id="uBlogsy_right_col">
<%--search--%>
<umbraco:Macro Alias="uBlogsySearch" runat="server" />


<%--rss link--%>
<umbraco:Macro Alias="uBlogsyShowRSSLink" runat="server" />


<%--list of authors--%>
<umbraco:Macro Alias="uBlogsyListAuthors" runat="server" />


<%--list of categories--%>
<umbraco:Macro Alias="uBlogsyListCategories" runat="server" />


<%--the awesome tag cloud--%>
<umbraco:Macro Alias="uBlogsyListTags" runat="server" ShowCount="0" />


<%--list of related posts--%>
<umbraco:Macro Alias="uBlogsyListRelatedPosts" ItemCount="5" MatchCount="1"
RelatedAlias="" runat="server" />


<%--list of latest posts--%>
<umbraco:Macro Alias="uBlogsyListPosts" ItemCount="5" Small="1" runat="server" />


<%--list of latest comments--%>
<umbraco:Macro Alias="uBlogsyListComments" ItemCount="5" Small="1" runat="server" />


<%--archive--%>
<umbraco:Macro Alias="uBlogsyListPostArchive" runat="server" />


<%--alternate archive layout --%>
<%-- <umbraco:Macro Alias="uBlogsyListPostArchive" AltLayout="1" runat="server" />--%>


<%--list blog roll --%>
<umbraco:Macro Alias="uBlogsyListBlogRoll" runat="server" ItemCount="5" />
</div>
</div>
<div id="uBlogsy_footer">
<div class="uBlogsy_footer_text">
<umbraco:Macro ID="Macro13" runat="server" Language="razor">@{ var landing = uBlogsy.BusinessLogic.DataService.Instance.GetLanding(Model.Id);
@Html.Raw(landing.uBlogsyContentFooter) } </umbraco:Macro>
<div>
Powered by uBlogsy and Umbraco</div>
</div>
</div>
</div>
</form>
</html>


</asp:content>

<asp:content ContentPlaceHolderId="cp_footer" runat="server">

</asp:content>
July 4, 2012 12:57
Admin Richard Bowers (author) said...
Hello Lloyd,

It is hard to say without having a look at your primary master page (~/masterpages/SEPMaster.master), which will need all the reciprocal ContentPlaceHolderId tags, but it looks like you are nearly their.

It is likely that your primary master page will already have a form and html tag, so think the following lines will probably need deleting:
<form id="uBlogsy_main_form" runat="server">
</form>
</html>


If you do not wish to share the content of SEPMaster.master, then send me an e-mail directly (you should have my personal e-mail address from when I sent you credentials for the uBlogsy sample site) and I will give it a quick once over. Alternatively, if you are happy to share it's content, please add another comment (this way others can also benefit).

Kind regards,
Richard
July 4, 2012 08:16
Lloyd Apter said...
Hi Richard,

It works now - here is the content in the master file:

<%@ Master Language="C#" MasterPageFile="~/umbraco/masterpages/default.master" AutoEventWireup="true" %>

<asp:Content ID="Content" ContentPlaceHolderID="ContentPlaceHolderDefault" runat="server">
<!doctype html><!--[if lt IE 7]>
<html<umbraco:Macro Alias="Languages" runat="server" />>
<![endif]--><!--[if IE 7]>
<html>
<![endif]--><!--[if IE 8]>
<html>
<![endif]--><!--[if IE 9]>
<html>
<![endif]--><!--[if gt IE 8]>
<!-->
<html>
<!--<![endif]-->
<head>
<meta charset="utf-8">
<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible">
<title>
<asp:placeholder runat="server">
<umbraco:Item ID="Item1" runat="server" Field="pageName"></umbraco:Item> -
<umbraco:Item ID="Item2" runat="server" Field="siteName" recursive="true"></umbraco:Item></asp:placeholder>
</title>
<meta content="" name="description">
<meta content="" name="author">
<meta content="width=device-width,initial-scale=1" name="viewport">
<link href="/css/SEPstyle.css" rel="stylesheet">
<umbraco:Macro Alias="SEPRTLCssLinker" runat="server" />
<link href="/img/favicon.ico" rel="shortcut icon" type="image/x-icon">
<script src="/scripts/js/libs/modernizr-2.0.6.min.js" type="text/javascript"></script>
<umbraco:Macro Alias="MLMetadata" runat="server"></umbraco:Macro>
<asp:ContentPlaceHolder ID="cp_head" runat="server">
</asp:ContentPlaceHolder>
</head>
<body>
<!-- Header / Logo-->
<header class="header clearfix">
<div class="container">
<h1 class="logo">
<a href="/">e3 energy partner</a>
</h1>
<!--<form id="search-form" action="/" method="get"></form>-->
<ul class="l10n-panel clearfix">
<li>Countries</li>
<li><a class="il" href="/hebrew.aspx">hebrew</a></li>
<li><a class="en" href="/">english</a></li>
</ul>
</div>
</header>
<div class="container">
<div class="clearfix">
<!-- main-menu-->
<div class="main-menu">
<umbraco:Macro Level="1" Alias="SEPNavigationMenu" runat="server"></umbraco:Macro>
</div>
<!-- minor-menu-->
<!--<ul class="minor-menu">
<li><a href="#"><span class="chat"></span>live chat</a></li>
<li><a href="#"><span class="msg"></span>leave a message</a></li>
</ul>-->
</div>
<!-- slide-->
<div class="slide">
<img alt="" src="/img/slideshow-cap.jpg">
</div>
<!-- main-->
<div id="main" class="widget-container clearfix" role="main">
<form id="RunwayMasterForm" runat="server">
<asp:contentplaceholder id="cp_content" runat="server"></asp:contentplaceholder>
</form>
</div>
<!-- footer-->
<footer class="clearfix">
<umbraco:Macro Alias="SiteMapFooter" runat="server" />
<asp:contentplaceholder id="cp_footer" runat="server">
</asp:contentplaceholder>
</footer>
</div>
<!--! end of #container -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
<script> window.jQuery || document.write('<script src="js/libs/jquery-1.6.2.min.js"><\/script>')</script>
<!-- scripts concatenated and minified via ant build script-->
<script defer src="../scripts/js/plugins.js" type="text/javascript"></script>
<script defer src="../scripts/js/script.js" type="text/javascript"></script>
<!-- end scripts-->
<script> // Change UA-XXXXX-X to be your site's ID
window._gaq = [['_setAccount', 'UAXXXXXXXX1'], ['_trackPageview'], ['_trackPageLoadTime']];
Modernizr.load({
load: ('https:' == location.protocol ? '//ssl' : '//www') + '.google-analytics.com/ga.js'
});
</script>
<!--[if lt IE 7 ]>
<script src="//ajax.googleapis.com/ajax/libs/chrome-frame/1.0.3/CFInstall.min.js"></script>
<script>window.attachEvent('onload',function(){CFInstall.check({mode:'overlay'})})</script>
<![endif]-->

</body>
</html>
</asp:Content>

Also, here is the content in the uBlogsyBaseSite file:

<%@ Master Language="C#" MasterPageFile="~/masterpages/SEPMaster.master" AutoEventWireup="true" %>

<asp:content ContentPlaceHolderId="cp_head" runat="server">

<!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd">
<html lang="en-GB" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-GB" dir="ltr">

<%--get title for browser--%>
<umbraco:Macro ID="Macro1" runat="server" Language="razor" Alias="uBlogsyBrowserTitle" />
<%--get meta title and description--%>
<umbraco:Macro ID="Macro5" runat="server" Alias="uBlogsySeoMeta" />
<script src="/scripts/jquery-1.6.min.js" type="text/javascript"></script>
<script type="text/javascript" src="http://s7.addthis.com/js/250/addthis_widget.js"></script>

<link type="text/css" rel="Stylesheet" media="screen" href="/css/uBlogsy.css" />
<asp:ContentPlaceHolder ID="Head" runat="server" />

</asp:content>

<asp:content ContentPlaceHolderId="cp_content" runat="server">


<div id="uBlogsy">
<div id="uBlogsy_header_container">
<div id="uBlogsy_header_inner">
<h1>
<%--get site name--%>
<umbraco:Macro runat="server" Language="razor">@{ var landing = uBlogsy.BusinessLogic.DataService.Instance.GetLanding(Model.Id);
<a href="@landing.Url">@landing.uBlogsyContentTitle</a> } </umbraco:Macro>
</h1>
</div>
</div>
<%--top navigation--%>
<div id="uBlogsy_nav_container">
<umbraco:Macro runat="server" Alias="uBlogsyNavigation" />
</div>
<div id="uBlogsy_main">
<div id="uBlogsy_left_col">
<asp:contentplaceholder id="LeftCol" runat="server" />
</div>
<div id="uBlogsy_right_col">
<%--search--%>
<umbraco:Macro Alias="uBlogsySearch" runat="server" />


<%--rss link--%>
<umbraco:Macro Alias="uBlogsyShowRSSLink" runat="server" />


<%--list of authors--%>
<umbraco:Macro Alias="uBlogsyListAuthors" runat="server" />


<%--list of categories--%>
<umbraco:Macro Alias="uBlogsyListCategories" runat="server" />


<%--the awesome tag cloud--%>
<umbraco:Macro Alias="uBlogsyListTags" runat="server" ShowCount="0" />


<%--list of related posts--%>
<umbraco:Macro Alias="uBlogsyListRelatedPosts" ItemCount="5" MatchCount="1"
RelatedAlias="" runat="server" />


<%--list of latest posts--%>
<umbraco:Macro Alias="uBlogsyListPosts" ItemCount="5" Small="1" runat="server" />


<%--list of latest comments--%>
<umbraco:Macro Alias="uBlogsyListComments" ItemCount="5" Small="1" runat="server" />


<%--archive--%>
<umbraco:Macro Alias="uBlogsyListPostArchive" runat="server" />


<%--alternate archive layout --%>
<%-- <umbraco:Macro Alias="uBlogsyListPostArchive" AltLayout="1" runat="server" />--%>


<%--list blog roll --%>
<umbraco:Macro Alias="uBlogsyListBlogRoll" runat="server" ItemCount="5" />
</div>
</div>


</div>

</html>


</asp:content>

<asp:content ContentPlaceHolderId="cp_footer" runat="server">

</asp:content>

Now, I need to know please how to copy the blog content node across to another language content node. Can you please give me the exact steps for this as i keep on getting this error when i try post a blog in the new language:

Server Error in '/' Application.
--------------------------------------------------------------------------------

Object reference not set to an instance of an object.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:


[NullReferenceException: Object reference not set to an instance of an object.]
uTagsy.Web.usercontrols.uTagsy.datatypes.uTagsy.SaveSettings() in D:\_PROJECTS\Personal\uBlogsy - Blog\Branches\2.1.0.0\uBlogsy\uBlogsy\usercontrols\uTagsy\uTagsy.ascx.cs:109
uTagsy.Web.usercontrols.uTagsy.datatypes.uTagsy.OnLoad(EventArgs e) in D:\_PROJECTS\Personal\uBlogsy - Blog\Branches\2.1.0.0\uBlogsy\uBlogsy\usercontrols\uTagsy\uTagsy.ascx.cs:43
System.Web.UI.Control.LoadRecursive() +70
System.Web.UI.Control.LoadRecursive() +189
System.Web.UI.Control.LoadRecursive() +189
System.Web.UI.Control.LoadRecursive() +189
System.Web.UI.Control.LoadRecursive() +189
System.Web.UI.Control.LoadRecursive() +189
System.Web.UI.Control.LoadRecursive() +189
System.Web.UI.Control.LoadRecursive() +189
System.Web.UI.Control.LoadRecursive() +189
System.Web.UI.Control.LoadRecursive() +189
System.Web.UI.Control.LoadRecursive() +189
System.Web.UI.Control.LoadRecursive() +189
System.Web.UI.Control.LoadRecursive() +189
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3047

Many thanks,

Lloyd

July 25, 2012 12:02
I was struggling with integration ublogsy , ur article saved me a day, thnx
July 30, 2012 04:27
Adam said...
Great articles Richard, thanks. I have managed to display posts from my blog on the homepage but the titles only are showing up. Do you know how to get the short description or summary to display too?

Thanks!
February 4, 2013 05:04
Admin Richard Bowers (author) said...
Hello Adam,

Glad to hear you are having some success.

The answer depends on how you are rendering the titles (e.g. Razor, XSLT or bespoke), however I believe the field you are looking for is uBlogsyContentSummary.

If this isn't enough, let me know a few more details and I will try to give some additional pointers.

Kind regards,
Richard
February 6, 2013 10:59
Adam said...
Thanks Richard. I have been posting on the Umbraco forums so perhaps if you have time please take a look at http://our.umbraco.org/projects/starter-kits/ublogsy/ublogsy-razor-blog/27114-no-uBlogsy-posts-on-homepage?p=2#comment137550 to see where I am up to.

Thanks again!
February 7, 2013 11:14

Comment

Comments closed

Try our Umbraco Hosting free for 3 months