North America Certification Courses Step Up

Tuesday, July 06, 2010 by Paul Sterling

Over the past 16-months there have been more than 80 attendees at our Umbraco Certification courses in North America.  From many of these committed folks we've heard great feedback on how we can make the Umbraco Certification courses even better.  Today we are thrilled to announce some changes based on this feedback:

  • We now have both a West Coast and East Coast trainers (Paul Sterling from Umbraco and Christopher Rushing from Webangelo)
  • We have reset the pricing to better reflect the costs and expectations of North American attendees
    • $995 per attendee for 1-4 attendees from your group, Level 1 or Level 2
    • $895 per attendee for 5+ attendees from your group, Level 1 or Level 2
    • $1,595 per attendee for combined Level 1 and Level 2
  • We have/will schedule courses based on geographical interest

We are scheduling courses in the areas where most interest is currently focused, Seattle, San Francisco, New York, and Chicago - and we will schedule future courses in areas where interest is strong (so let us know).  As anyone who has attended an Umbraco Certification course knows, the courses are an important way to learn about Umbraco, to support the health of the project, and to meet other Umbraco users. 

We're looking forward to seeing you at one of our upcoming courses in Boulder or Seattle.  More locations to be announced soon on the Umbraco training schedule.

Codegarden ‘10 Wrap Up

Wednesday, June 30, 2010 by Paul Sterling

Three days of Umbraco love with 250 Umbricians in Copenhagen came to a close late Friday afternoon on 25 June 2010.  A collective sigh of disappointment that Codegarden was over and a gasp of excitement about the potential for using all that was learned was felt by the crowd.  While some walked away with fabulous prizes (leather biker vest!) all left with a deeper knowledge of the Umbraco project and the technology underneath and around it.  There was no doubt the community is what makes Umbraco successful and all who came to Codegarden participated in a meaningful way.

entrance
(all photos courtesy of Doug Robar - thanks Doug!)

Codegarden 2010 consisted of a one-day pre-conference focusing on ASP.NET MVC followed by a day of keynotes and sessions and a final day of open-space discussions.

ASP.NET MVC Bootcamp

We had the pleasure of hosting Simone Chiaretta, Jon Galloway and Steven Sanderson who delivered a two-track ASP.NET MVC bootcamp.  In preparation for the upcoming Umbraco 5 release, which is based on ASP.NET MVC, we offered this pre-conference day free for all attendees.  The response was very good with nearly 200 attendees present for the day.

flag
(all photos courtesy of Doug Robar - thanks Doug!)

This day corresponded with the Scandinavian Midsummer celebration and, in true Umbraco community fashion, the entire group of attendees, speakers, and various hangers-on boarded a pair of canal tour boats for a turn around Copenhagen's canals to view the festivities from the water.  It was difficult to determine if the real spectacle was the groups of Danes gathered around bonfires burning witch effigies or the canal boats full of Umbricians flying the Umbraco Pirate flag.

Keynote

Day one of Codegarden dawned bright (as expected) as the official conference (er, festival) kicked off with Alexander Kjerulf (aka The Chief Happiness Officer) talking about Happiness at Work.  The site and sound of over 250 attendees greeting each other with an enthusiastic high-five and "You Rock!" was a fitting opening to the enthusiasm of Codegarden.

Umbraco 4.5

As Niels Hartvig presented the Umbraco keynote we released Umbraco 4.5 - an amazing release that is more stable, much more performant, and has more features than any release to date.  The response was, and is, overwhelming and something the entire community can be proud of. 

our.Umbraco.org

Not only did we release a new version of Umbraco but we also released a new version of the Umbraco Community site, known as Our 2.0.  Taking community feedback from the past year, we gave the community site some serious attention, and it shows.  More proof that the community is the most important part of Umbraco.

Core Team Developer of the Year

While every member of the Umbraco Core Team is an exceptional developer who gives generously of his time, this year we decided to award the most productive developer (as measured by source-code commits) the title of 'Umbraco Core Team Developer of the Year.'  This year's award goes to Shannon Deminick and it is well deserved.

core-dev-espresso

Most Valuable People

By community vote we awarded five Umbricians the title of MVP.  This year's Umbraco MVPs are:  Dirk De Grave, Lee Kelleher, Warren Buckley, Richard Soeteman and Doug Robar.  Congratulations to these five amazing community members!

Karma Fund

We also announced the creation of the Karma Fund.  In short, this is a 10.000 EUR fund to be awarded to the top five packages, as determined by community awarded Karma points, at next year's Codegarden.  If Umbraco Community recognition was not enough, the 10.000 EUR Karma Fund is our way of giving back to the best CMS community in the world!

Bingo

Codegarden is not complete without a few rounds of Umbraco Bingo, and this year was no exception.  The fabulous prizes this year ranged from a USB vacuum signed by 'The Umbracos' to a photo-realistic painting of the core team in repose. 

painting
(all photos courtesy of Doug Robar - thanks Doug!)

Demonstrating that we are never ones to take ourselves too seriously the bingo round was briefly interrupted by Niels shouting 'bring in the horns' and the entrance of a brass band which proceeded to march through the conference venue come bingo hall.

band 
(all photos courtesy of Doug Robar - thanks Doug!)

Open Space

This year the second conference day was again given over to the community as the day's agenda was defined by the attendees.  Forming what may well have been one of the largest open-space opening circles ever the agenda quickly filled up.

open-space
(all photos courtesy of Doug Robar - thanks Doug!)

There was some incredible output from the open-space day.  Some of our favorites are the Umbraco Core Values and the multi-node picker source

Packages and Skins

The final (official) event of Codegarden is the package and skins contest…always an entertaining exercise in how many things can go wrong in a seven-minute demo.  The package contest winner was Shannon Deminick's multi-node tree picker and the skin contest winner was Warren Buckley's retro theme.

retro

The Best CMS Community in the World

Umbraco Codegarden is truly the community's event and the Umbraco Community again demonstrated why this is the way it should be.  We at Umbraco HQ are honored that such a large, diverse, and generous community has chosen Umbraco and supports the project and the rest of the community with generous contributions of time, effort, money, and humor. 

Can't wait to see you at Umbraco Codegarden 2011 - 15-17 June 2011 in Copenhagen.

cg-flag

Codegarden Survival Guide

Monday, June 21, 2010 by Niels Hartvig

cg-venue

Codegarden 2010 is only a couple of days away and to help you prepare we've put together a list of essential knowledge and survival tips from seasoned CodeGarden veterans. The conference SOLD OUT so we'll be 250 Umbracians together for three awesome and packed days. Here's how you'll survive:

Finding the venue

The venue is called "Kedelhallen" (The kettle hall) and is located on Nyelandsvej 75A, 2000 Frederiksberg. BUT Google Maps got it mapped wrong! Here's the street view of the venue location and the venue has a huge chimney (see the picture above), so you can use that as a landmark.

Be there before 8:45

The Conference starts at 9:00 sharp, but registration opens at 8.00. So help everyone by coming early and make the registration go as smooth as possible. We're 250 people so it may take a little time to get everyone through.

Remember cash

While food, water, coffee, etc is on the house, you might want to buy snacks or something else at the cafe. BUT the Cafe only accepts the Danish credit card "Dankort" or cash. So make sure to bring Danish crowns in cash as most places only accept Danish cash not EUR or USD.

WiFi

We've done our best to ensure as good network connections as possible and we were going to get extra DSL landlines installed at the venue. But in the middle of it all the telco workers decided to go on strike and we had to improvise by buying ten wireless 3G boxes. We'll see how that goes, but as we've said before - there's no guarantee that you'll be able to get online, so if you need that bring a 3g dongle!

Sun blocker

The venue has a large outside area which traditionally is used for sessions and the weather looks good. So remember to bring sun blocker, sunglasses and a good tan

It's a festival - not a conference; CodeGarden doesn't stop at 4'o clock

There's dinner and social events on both Wednesday and Thursday. On Wednesday we'll celebrate the Midsummer by touring around the canals of Copenhagen in two charted Canal boats with music and bar and Thursday there's the classic and classy Umbraco Bingo with the Umbracos. So CodeGarden does not end at 4 o'clock.

Bring your laptop

To get the most out of CodeGarden you'll need your laptop ready to run Umbraco and likely be installed with tons of new stuff during the conference. For more details see the prepare for the MVC day post.

CG10 is the official hashtag

If you're adding photos to Flickr or if you tweet about CodeGarden make sure to use the CG10 hashtag (#CG10 on Twitter) so it'll be a part of the backchannel.

Make it yours

CodeGarden is all about participation and you can already start to suggest and vote topics. So if you got anything you'd like to discuss, present or learn make sure to submit a topic today!

Umbraco 4.1RC is out

Tuesday, June 15, 2010 by Niels Hartvig

Finally. 18 months of hard work is coming to an end as we - the Umbraco Core Team - proudly can announce the release candidate of Umbraco 4.1 - the biggest update to Umbraco. Ever.

With the Release Candidate stamp this means that we're now recommending Umbraco 4.1 for all new projects. So get yourself indulged in all there is to love (and this is just the summary!):

Performance - it's a screamer!

  • Updated XML Schema ensuring higher performance
  • Build in caching of Members and Media when referenced via the umbraco.library methods
  • Completely new Back Office tree with caching and much clever loading of data
  • Heavily reduced http requests when working in the Back Office
  • Heavily reduced SQL queries in Back Office
  • A .NET 4.0 product that works perfectly with Visual Studio 2010
Stability
  • Updated DB schema with more constraints and indexes
  • More than a 100 unit tests written to verify API methods and datalayer
Feature packed
  • Enhanced preview. Browse your entire site as it looks in the future, including out-of-the-box support for all XSLT and NodeFactory based macros
  • SpellChecker. With support for more than ten languages out of the box!
  • LINQ 2 Umbraco. More a .NET Developer than an XSLT guru? You'll love accessing data via the all brand new .NET LINQ API
  • Examine. Ultra performant and stable index-based search engine. With a fluent API that developers will love
  • New XML Schema. Not only more performant, but makes it easier to understand your data and adds future support for Intellisense in Visual Studio!
  • Improved DLR support. Faster than ever and with support for Ruby too!
  • New Datatypes: Image Cropper for editor friendly image manipulation and Macro Container for easily handling of feature areas. (Needs to be manually created in the data type section in the RC)
  • Improved Mediapicker: Preview and advanced dialog with upload is now a part of the default MediaPicker (needs to be activated on the datatype in the RC)
  • A ton of other improvements and updates!

Upgrades

Umbraco 4.1RC is a HUGE update to previous versions and while we've done our best for backwards compatibility we do not recommend that you upgrade any production environments until the final release. Especially if you use 3rd party packages.

However, we'd love feedback on experimental upgrades and we've made a WIKI page on Our Umbraco to sum up what's needed to upgrade.

Gotchas and logging bugs

Remember that this is a release candidate and not a release. There will be bugs, however we haven't encountered any showstoppers for long and we're using it for a good range of our own sites! The final release however, is not far away and we're constantly ironing out bugs as they're logged. When logging bugs please take the time to search the issue tracker if the issue have already been logged, that helps the core team big time! Also, before logging a bug you should also consider discussing it in our dedicated 4.1 forum, especially if you're in doubt if it's a core bug.

Final word

Enjoy! And keep an eye on our nightly builds and our @umbracoproject twitter account for latest updates. Be nice to the Core Team - they've worked insanely hard.

How to prepare for CodeGarden MVC day

Monday, June 14, 2010 by Niels Hartvig

As you probably know the day before CodeGarden kicks off we have a whole day of MVC to prepare people for Umbraco 5 coming early 2011. We've been fortunate enough to get three of the biggest capacities in the ASP.NET MVC sphere to come and talk about many different aspects of MVC, from a beginners MVC bootcamp by Jon Galloway to advanced topics by the Wrox authors Steven Sanderson and Simone Chiaretta.

What do you need to know?

The bootcamp by Jon Galloway is targeted web developers and ASP.NET WebForm people who wants to transition to MVC. So this is MVC from scratch. You don't need to know anything about MVC to join. The advanced sessions by Simone Chiaretta and Steven Sanderson is for those with some MVC knowledge or people interest in some of the specific topics such as MVC Web Security and Behavior Driven Development.

What do you need to bring?

To get the most out of the sessions, we recommend that you bring a laptop with .NET 4.0, MVC 2.0 and either Visual Studio 2010 or Visual Web Developer Express (free!) installed.

Most importantly

Apart from bringing your laptop and tools, make sure to bring an open mind too. ASP.NET MVC is a different way to build websites and if you come from a Webforms background you might get frustrated at first. But there's a reason behind the madness of bringing Umbraco to the world of MVC. We simply believe that it's a better way to build websites and it's a perfect fit for Umbraco.

So leave your fear of change at home and indulge yourself with a chance to enhance your skills and prepare for Umbraco 5. Because you're worth it ;-)

Codegarden: The package contest

Wednesday, June 09, 2010 by Per Ploug Hansen

This is a post in our series of what is going to happen at Codegarden 2010, the umbraco conference.

One of the Codegarden traditions is the offical package contest, which on the last day of the conference wraps everything up with some fast-paced and entertaining presentations from community developers, showing off new packages for Umbraco.

It is the ultimate show-off place for Umbraco companies and developers who wish to show the world what they have created, and get a shot at winning some big prizes. The winner is decided by the audience, so it all comes down to creating the best Umbraco package and presenting it with style and passion.

New this year: skin contest

The package contest has mostly been for developers being able to hack together some code. But this year, there is an option for all web-designers at Codegarden: the Skin contest.

The skin contest is run the exact same way as the package contest, and with the same rules. But instead of a package, you submit a skin into the contest.

A skin for Umbraco is a very basic thing, it consists of a CSS file, some images, and a simple manifest for installation, and should world with the pre-set Runway or blog-package CSS, so if you know your css and your way around Photoshop,

then this contest is for you.

There are the exact same huge prizes for skins as packages, so go on, fire up photoshop right away.

The Rules:

  1. The package / skin must be installable on a clean Umbraco instance, using the standard package installer or the umbraco repository and integrate nicely with the Runway package
  2. You have a maximum of 7 minutes to install, show-off and leave the stage again.
  3. Everyone uses the same laptop on stage, and installs their package live during the show-off
  4. No powerpoints, graphs or other extras, extreme body language is accepted though
  5. Skins can be submitted for either the Runway Package or the Blog Package

Points are rewarded for

Besides the functionality, the show-off is rewarded for:

  1. Clean installation
  2. Consistent UI
  3. Entertainment value
  4. Documentation
  5. Originality

The prizes

Besides the fame and being celebrated by the Umbraco community on the big stage, you will also get your hands on some neato swag.

In the past we've handed out Rockband Instruments, Xbox 360's, Nazbatag rabbits and so much more.

Deadlines

Contest entries are accepted all 3 days, just get a hold of one of the HQ guys and we will get you signed up. The presentation will take place at the end

of day 3 after the open space sessions has ended.

CodeGarden 10: Evening Canal cruise

Tuesday, June 08, 2010 by Niels Hartvig

Here's yet another reason to join Codegarden 10: On the pre-conference day of CodeGarden, Wednesday evening it's Sankt Hans - or midsummer eve - which is an old tradition to celebrate in Denmark.

We want to share this with all the attendees so we've rented two huge canal tour boats that'll take us around Copenhagen to watch the different parties where crazy Danes burn witches on bonfires - that's how civilized we are. However due to recent legislation the witches are rarely alive anymore.

2150851920012335790TEQbYH_fs

Not only will it be a great way to see the Wonderful city of Copenhagen, we'll also have a great party on the boats with music and a traditional Danish alcohol policy.

canaltour1

Umbracians Douglas Robar, Per Ploug Hansen, Kenneth Solberg, Warren Buckley, Niels Hartvig and Casey Neehouse enjoying a canal boat tour in 2007.

Conference Highlight: Umbraco Runs on Windows Azure

Monday, June 07, 2010 by Paul Sterling

This is a post in our series of what is going to happen at Codegarden 2010, the umbraco conference.

windows-azure-logo-lg

The Topic

If you're a .Net developer and haven't been living in a cave (without wifi), you've no doubt heard about Windows Azure.  You may have even wondered if Windows Azure and Umbraco could be combined.  The answer is that Windows Azure and Umbraco are a great match.  In this session Dirk Primbs will be discussing how Umbraco runs on Windows Azure, why using Windows Azure with Umbraco makes sense, and showing a live demo of Umbraco on Windows Azure. 

If you want to know more about Windows Azure with Umbraco straight from the official source, don't miss this session.  Feel free to bring your questions, ideas, and mis-conceptions - all are welcome.

The Speaker

Dirk Primbs works as a Developer Partner Evangelist for Microsoft Germany and is part of the partner team that works with Umbraco.  He is a fan of open-source solutions on the Microsoft stack and has a deep technical knowledge of web applications for the Microsoft platform. 

In addition to his expertise with Windows Azure, Dirk is well versed in the Web Platform Installer and other emerging technologies - some too new to disclose.  Dirk will be at Codegarden Thursday and Friday, so if you have specific technical questions he'll be around to help.

Session spotlight: Crowdsourcing via Facebook

Friday, May 28, 2010 by Per Ploug Hansen

This is a post in our series of what is going to happen at Codegarden 2010, the umbraco conference.

kashmir

The Topic

Why make the content yourself, if you can get your users to do it? The famous Danish band Kashmir are animating their fans to generate content on their website. This is done using Facebook Connect and Umbraco. Come and learn how Kashmir takes advantage of their social media and aspects of crowdsourcing on www.kashmir.nu.

The Speaker

René Pjengaard works for Skybrud, a danish web-development agency, located in Vejle. As an agency they've been lifting some pretty heavy clients in the past, including major danish municipals, the danish national postal service, Danfoss, Danish Crown, and many others, and been nominated for a creative circle award as well. However, kashmir.nu is actually their first website on Umbraco, now that's a great debut!

René and the rest of the team at Skybrud collaborated with the lead singer from Kashmir, on how to build a new site for their many fans, and how they could actually make the fans participate and add content directly to the band's website through services like facebook, youtube and twitter.

We think the solution they've put together is an excellent showcase of how to use modern webservices and communties with Umbraco, and very much look forward to hearing more about their experiences building www.kashmir.nu.

Meet René at Codegarden

If his session doesn't answer all your questions on integrating services with Umbraco. Why not setup an open space topic about it? René might even drop by and share some additional wisdom, or maybe even have some code-snippets for you, who knows?

Session spotlight: Designing forms with Umbraco and Contour

Thursday, May 27, 2010 by Per Ploug Hansen

This is a post in our series of what is going to happen at Codegarden 2010, the umbraco conference.

tim

Tim Geyssens, at Codegarden 2008, photo: Douglas Robar

The Topic

Join Tim Geyssens - Core Team member and lead dev on Contour - on a guided tour on the user-friendly form designer for Umbraco.

Adding forms to your umbraco website usually means getting dirty in visual studio, but not anymore.
Build Contact forms, comment forms, entry forms, questionnaires, ... all without writing a single line of code.

Create, edit and administer your forms via a user interface that's a fully integrated part of Umbraco.

See how easy and fast it is to collect data and process it with Contours Workflow engine and dive into how you can extend and tweak Contour to fit your exact needs.

The Speaker

Tim Geyssens is located in Belgium, where he works for the Umbraco HQ. One of his main duties is leading and maintaining Contour, a form designing tool, built for and deeply integrated with the  Umbraco CMS.

If there is anyone capable of guiding your through the architecture of Contour, and exploring every possible way to make it work as you want it, it's Tim.

Tim's been involved in this project since it was just a sketch on the HQ whiteboard, and has since the initial release then been keeping busy with developer support on the our.umbraco.org forums, providing answers to a ton of developer questions on how to solve challenges with Contour.

Meet Tim and the rest of the HQ at Codegarden

Tim Geyssens will be at the conference all three days, along with the rest of the Umbraco HQ. So if you have any questions on Contour or any of our other products, don't hesitate to ask.

This is one of the few times a year the entire Core Team, the Umbraco MVPS, and the Umbraco HQ is together in the same room, so don't miss it!

Remember: there are still a couple of days left of the 100EUR ticket discount

Learning from mistakes

Thursday, May 27, 2010 by Niels Hartvig

I've been a big believer in running Umbraco as transparent as possible and every now and then this brings upon interesting challenges. This week I had one of the bigger ones.

When going through the CodeGarden 10 budget it turned out that I had made a number of mistakes that meant that the cost price for doing the conference was higher than the early bird price for the tickets. At the same time we had sold more than double the number of early bird tickets that the previous years. In other words, we were loosing money on CodeGarden.

We've always kept the ticket price (and therefore the buffer) low as CodeGarden is a non-profit event. We (the HQ) work for free and the money from the conference is spent on gathering the most active people in the ecosystem - the MVPs, the most active cores and the speakers - by paying for their plane tickets, hotel and arranging a pre-CodeGarden weekend where we discuss the state and future of the Umbraco project.

But I was frustrated and embarrassed beyond belief. This year it wouldn't be a non-profit event, it would be a money loss event. It was a result of me being sloppy when doing the initial budget and not adding enough buffer. It was entirely my fault. No excuses.

So last week I decided that we would take the hit in the HQ and write the loss of as a marketing expense. As such - gathering 250 people for three days - the expense was low. But it didn't feel right. CodeGarden has never been a marketing event. It's not OUR (the HQs) event, it's the community's event.

So with shaking hands I wrote an e-mail to everyone who had bought the early bird tickets, telling them the truth and letting them know that by paying an additional EUR65 the conference would mount up. I stared at the send button for minutes before finally clicking. However, my fear for the response was unnecessary. The response was overwhelmingly positive and within the first six hours 25% of all the attendees had paid the extra.

CodeGarden came back to the community. The only place it belongs. Nobody owns a movement.

Umbraco at The Gilbane Conference SF

Monday, May 24, 2010 by Paul Sterling

Umbraco had a presence at Gilbane SF that many folks thought was 'surprising' - in the best possible way.  It was a pleasure to be featured alongside commercial CMS vendors and other open-source vendors alike.  Nik Wahlberg from Scandia Consulting (and Certified Umbraco Professional)  joined me in representing Umbraco. 

One of the themes present in many sessions at Gilbane SF was the importance of open-source CMS in the market - it is not a minor consideration by any stretch.  Most commercial gilbane-bannervendors are beginning to mimic the best parts of open-source systems - principally the community aspects of user forums and exchanges.  Meanwhile, the distinction between open-source and commercial offerings is narrowing as open-source systems mature and accrue proven track records.  For open-source systems such as Umbraco, this is an exciting time.

As with any contemporary conference program there was much attention on social media relative to marketing, analytics, search, and user experience considerations.  I wish I'd had more time to attend some of these sessions as well.

Both Nik and I spoke to many people interested in Umbraco, and in our business model.  The interest in user centric, developer friendly, easily extensible CMS systems is quite high.  Umbraco is an easy CMS to describe and discuss since its flexibility allows it to fit many different scenarios.  All in all we spoke to hundreds of people and had some interesting discussions with other vendors, commercial and open-source alike. 

An unrelated, but exciting development, is that Nik is assuming the lead author role for the Umbraco User's Guide from Wrox press due out in 2011.  With Nik in the lead this work will take shape more quickly than it has in the past with, ahem, a different lead author.

Codegarden: How to convince your boss in 90 seconds

Friday, May 21, 2010 by Per Ploug Hansen

Get all the arguments for going to Codegarden 2010 on a single page. Easy to print and easy to place on your bosses desk.

attendees

Attendees at Codegarden 2009, Photo: Douglas Robar

In a perfect world, your boss will know that Codegarden is a good investment, both in time and money.

But the world isn't always like that. Maybe your boss didn't read all the session spotlights on our blog, he didn't notice the positive vibe on twitter and he certainly didn't explore the open space sessions on codegarden10.com, so who can blame him for having second thoughts on spending money on tickets, travel and hotels for a conference he doesn't know anything about.

A solution

So that is why we've put together a detailed whitepaper on Codegarden. It explains what it is, what you get out of it, and lists 7 solid reasons to make Codegarden 2010 a priorit. Download it now, print it, and hand it to your boss. It won't take you more then 90 seconds to do, and while you are at it, make sure to mention the 100€ discount ends on June 1st.

Download Codegarden 2010 Whitepaper

 

See you at Codegarden 2010.

Version 4.0.4.1 is out

Friday, May 21, 2010 by Niels Hartvig

A new update of Umbraco 4 is out - v4.0.4.1 - fixing 13 issues based on feedback from 4.0.3 users. Full download and upgrade instructions on Codeplex. We expect 4.0.4.1 to be available from the Microsoft Web Platform Installer within a week.

Most importantly is a fix to a serious date bug where day and month could be flipped when using non English cultures. Also fixes to issues mostly related to high performance websites have been included. Lastly, using Members via /base is now back to full support. All the details is in the release notes pdf under "Other Available Downloads".

In addition to these bugfixes, VistaDB has been removed from the default distribution due to licensing conflicts. We're working on a future alternative as this was a great feature - especially for people trying Umbraco for the first time without installing from Microsoft Web Platform Installer.

This release had the honor of being know is Umbraco version not found, due to its original name version 4.0.4 when it was released yesterday. However, Darren Ferguson almost immediately discovered a bug which we fixed yesterday evening. So nemesis would be that Umbraco Version Not Found, indeed only were discoverable for less than a day.

Thank you to the community for feedback and especially Darren Ferguson - maker of the brilliant PDF Creator for Umbraco btw - to help identify this bug quickly.

If you've already upgraded to 4.0.4 you can upgrade to 4.0.4.1 by simply replacing umbraco.dll and businesslogic.dll in the /bin folder. Sorry for any inconvenience - even a UnitTest wouldn't had found this bug so could you forgive us even with ALT.NET in your blood?

Session Spotlight: Integrating a 3rd party service with the umbraco backend

Thursday, May 20, 2010 by Per Ploug Hansen

This is a post in our series of what is going to happen at Codegarden 2010, the umbraco conference.

morten

Morten after winning last years Package Contest, Photo: Douglas Robar

The Topic

The creator of one of the most popular Umbraco packages: " Google Analytics for Umbraco", and winner of Codegarden 2009's package contest, takes a deep dive into how you can integrate your own data into the Umbraco backend.

Walking you through the creation of custom sections, tree components, Editor pages and installation actions, he will show how every aspect of an integrated Umbraco application fits together.

The Speaker

Morten Christensen works for Codehouse in Copenhagen and should need no introduction to anyone who spend more than a couple of days in the umbraco community.

Morten attended last years Codegarden conference and blew everybody away with his slick and well-integrated Google Analytics package for umbraco, which got him the main price in the package competion, an Xbox 360 Elite. Since then it's become one of the most popular add-ons for umbraco, and downloaded item from our.umbraco.org and the Umbraco Package Repository.

We were so impressed by Mortens package, that we've asked him to come back this year as a speaker to share how he built that award winning package.

Meet Morten at Codegarden

Morten will be there on all 3 days of Codegarden 2010, sharing his knowledge and tricks learned from his work with Umbraco. Got a question on how to integrate your service or appliation into the backend? Morten is the man to track down and ask. 

Session spotlight: Website Search with Examine

Tuesday, May 18, 2010 by Per Ploug Hansen

This is the first of many session spotlights, as we prepare for Codegarden 2010, keep reading for indepth information on the topic and the speaker, you can also view the list of all the announced sessions here .

shannon 

Shannon Deminick, Photo by Peter Gregory

The topic

Have you ever wanted a real search engine built into Umbraco? Well, Lucene is a powerful indexer and searcher and has been part of Umbraco for years, but it was always tricky to use.

Examine brings a new level of power to the Lucene.Net implementation by giving you a search engine that is both easy to setup and extremely extensible.

It has a fluent API, multiple index capabilities and a flexible provider model. See how Examine can give you site searching capabilities beyond what is possible with just XSLT.

Go to the session page on Codegarden10.com

The speaker

Shannon Deminick is Canadian, but works for "The Farm Digital" in Australia, and is on the Umbraco Core team. He is one of the most contributing members, making major improvements to the backend Html and javascript for a faster and more efficient user interface, optimizing the datalayer for faster content mangement, completely rewrote the search engine, and a ton of other improvements.

We have no idea where he finds the time but besides the Umbraco project he also contributes to the Examine Project, which is a managed Lucene.Net Search Engine library, and the ASP.Net Client Dependency Framework, both projects have been included in the Umbraco Core. He blogs on the FarmCode blog .

Meet Shannon At Codegarden 2010

All the session speakers at this years Codegarden will be present all 3 days, it's a great opportunity to socialize, network and pick their brains on anything umbraco. They will also take part in the Open Space topics, making it a unique opportunity to get some expert input on a topic you choose.

The Codegarden 2010 program is ready

Monday, May 17, 2010 by Per Ploug Hansen

cg10

It is with much joy I can lift some of the covers on what is going to happen at this year's Codegarden, the annual Umbraco conference.

This year has our most ambitious program to date. The quality of this year’s sessions are incredible, we have been fortunate enough to get some of the most experienced umbraco developers to share their knowledge and experiences.

Today we’re announcing the overall conference format, with the pre-conference, the 3 tracks of umbraco sessions, and the open space format. As we get closer to Codegarden, we will share even more details and background on the different sessions as they get announced.

Pre-conference: MVC Bootcamp

Learn asp.net MVC from 3 of the most experienced MVC developers around. Simone Chiaretta (ASP.NET MVP, ASPInsider and author of Beginning ASP.NET MVC on Wrox) , Jon Galloway (Microsoft) and Steven Sanderson (Microsoft MVP, author of "Pro ASP.NET Mvc)  will host MVC bootcamps to get you up to speed on the new technical foundation for future versions of Umbraco.

View the details on the MVC bootcamp

Day 1: Sessions on 3 tracks

This year we will have 3 tracks, covering umbraco from all angles, with sessions on all levels, from beginner to ninja. There will be something for everyone.

Track: From 0 to 100
From 0 to 100 covers specific topics indepth and gets you up to speed in just 45 minutes, with a focus on giving attendees the tools and knowledge to start using and taking advantage of the subjects covered right away.

Track: What we've learned
What we've learned are sessions on the many nuggets of knowledge you gain while implementing Umbraco solutions. Get the insider tips from some of biggest and most experienced Umbraco developers out there, sharing cases and solutions to development challenges.

Track: Integrations
Ever wondered how you connect Umbraco to your ERP, CRM, twitter, facebook or any other application or service? The Integrations track is all about building Umbraco solutions that use 3rd party services and applications.

View all the currently announced sessions

Day 2: Open space

If you are not satisfied with the sessions offered on the 3 tracks, you can suggest your own topic for the conference open space, that invites anyone to suggest or take part in any umbraco-topic.

Go suggest a topic right now to get it on the conference agenda. Unlike the previous years, all open space sessions will be set before the conference, so hurry and suggest a topic now, and vote for those you want to see included in the program.

Remember: Discount ending on June 1st

If you order your codegarden ticket before June 1st, you will save 100€ on your conference ticket, so make sure to order your ticket today.

The Umbraco Tour for Webmasters

Tuesday, May 11, 2010 by Paul Sterling

Continuing our new what is Umbraco video series we have created an overview for webmasters.  Here we highlight content versioning, users and permissions, workflow, and notifications.

 

 

We are also updating the Umbraco TV site to feature this series in the getting started section.

What is Umbraco?

Tuesday, May 11, 2010 by Paul Sterling

For many Umbraco professionals we never have to stop and think 'what' Umbraco is.  Having visited with hundreds of current and potential Umbraco users in the last three months I can tell you that the majority do not know 'what' Umbraco is.  Have you ever really thought about it?  Describing 'what' Umbraco is?  Its not easy.  Kind of like when your mom asks you, for the 10th time, "so, what do you do again?" 

One of my goals, along with the rest of the talented Umbraco team I am fortunate enough to work with, is to clearly define 'what' Umbraco is so that anyone can understand.  As part of that goal, I've begun creating brief videos that illustrate 'what' Umbraco is.

In the future, there will be additional videos as well as a collection of white papers outlining 'what' Umbraco is and describing in detail some usage scenarios.  As with all things Umbraco, you're input is welcome and will be taken with gratitude.

New Umbraco Identity

Monday, May 03, 2010 by Niels Hartvig

Today is a day that I've been looking forward to for long. We can finally reveal the new identity for Umbraco. After five years of DIY we've teamed up with the brand experts at 1508 and got a new logo, logotype, font, colors, imagery and tone of voice. The old logo by Hudson Maul have served us incredibly well, but it was time to get a cleaner and more modern look. At the same time it was also time to say adios to the old Kontrapunkt font as it really doesn't work on screen. Our new font is the gorgeous Apex New.

And without more mumbling - here's how we look now:

Basic CMYK

 

We're working hard on our brand new website which we hope to launch before the summer - until then be patient as we implement the new identity and please let us know if we forgot to replace the logos somewhere.

You can download the new logo and logotype as illustrator files here. Feel free to use them, but remember to ask for permission if used commercially.

Here's a couple of new desktop wallpapers (1900x1080 - more sizes will come) to start the week:

UmbracoDesktopUdo

UmbracoDesktopUffe

umbracoDesktopUri

umbracoDesktopUdo2

Umbraco MVPs 2010

Wednesday, April 28, 2010 by Niels Hartvig

Earlier this year we reached out to the community to help pick the 2010 Umbraco MVPs. The results have been processed and we're happy to announce the lucky five. In random order:

All five have done a tremendous amount of community work in 2009 by helping people on the forums, blogging about hidden gems in Umbraco and producing killer packages. On behalf of the HQ and the rest of the community I can't say thanks enough and I'm looking forward to giving you a cheesy diploma at CodeGarden '10.

Over the next couple of weeks we'll post profiles of each of the five along with community testimonials on what makes this bunch extra special.

Congrats, guys and thanks again!

Axing gadgets or the importance of platform responsibility

Tuesday, April 20, 2010 by Niels Hartvig

After I 'axed' my iPhone two weeks ago, my video of the action have seen almost 6,000 screenings and caused quite some debate. That's wonderful - that was my hope. However, some think that my action was simply an act of unconscious rage or a cry for publicity. In regards to the latter I have to disappoint my detractors with the fact that I have more publicity than I could possibility ask for already. In regards to the first, my act was quite calculated.

You see, the essence of 3.3.1 gate is not about whether to allow a certain programming language or a platform, the essence is about being a responsible platform owner. A test that Apple definitively failed with their new iPhone OS terms.

As a successful platform owner you're blessed with having a huge eco-system making your platform even more valuable. These eco-system consists of thousands of developers all believing in your platform and building their business upon your directions and by giving you trust. Sure, they benefit too and that's what makes it all a healthy and sustainable practice - a win-win so to speak if I knew how to tie a Windsor.

But trust and power goes hand in hand with responsibility and this is where Apple failed miserably. While I've always found the current constellation with the AppStore lock-in and their double moral censorship unhealthy as it gives the platform owner (Apple) way too much power of the ecosystem, it's the name of their game and not a surprise for anyone investing in the platform. But the 3.3.1 gate showed just a slight glimpse of just how huge their power is. With two tiny sentences they swipe out a ton of independent developers who actually want to contribute to their platform.

But worst of all - it's a completely unnecessary show of force. It was a proof of an arbitrary and ruthless platform leadership. iPhone apps developed using Monotouch, Unity or Adobe tools is not guaranteed to perform worse than native Objective-C apps nor are the theories about lack of full API support for new versions legit - Monotouch is already on pair even with iPhone OS4 still in beta.

I didn't axe my iPhone as an act of rage. I axed my iPhone to show my disgust for this type of leadership and misuse of power. And as a signal to the Umbraco community that you'd never see this in our eco-system. That was worth the $699!

New packages added to the package repo

Friday, April 16, 2010 by Tim Geyssens

We've added another bunch of the best rated/most downloaded projects on our.umbraco.org to the umbraco package repository. Here's an overview of what got added:

Google Analytics

This package adds a new section to the Umbraco backend, which gives you access to your google analytics statistics in form of some standard reports (out of the box). You also have the ability to create your own reports from the metrics and dimensions, which are available through the Google Analytics API.

http://our.umbraco.org/media/wiki/4787/634029034778260000_SitereactorGoogleAnalytics-PageSpecificReport.jpg

More details on this project on our.umbraco.org.

Standard Values

This package adds a Standard Values folder in the Settings section of Umbraco, which allows you to add standard values to all your document types.

http://our.umbraco.org/media/wiki/7008/633999456685609371_01StandardValue-main.JPG

More details on this project on our.umbraco.org.

Pixlr

The Pixlr package makes it possible to edit your Media images with Pixlr, an online image editor.

http://our.umbraco.org/media/wiki/7312/634015097922558424_screen1.jpg

More details on this project on our.umbraco.org.

TaskScheduler

With Taskscheduler you can schedule url's to be executed on a certain date and time. It's a simplified version of the Windows Task Scheduler, build on top of the Umbraco scheduler functionality.

http://our.umbraco.org/media/wiki/7823/634060088150310000_TaskScheduler.png

More details on this project on our.umbraco.org.

bing Maps

This package allows you to integrate Microsoft™ bing Maps into your Umbraco implementations.

http://our.umbraco.org/media/wiki/7833/634061103039170000_view-map-basic.png

More details on this project on our.umbraco.org.

 

Remember to keep voting on your favorite projects and spread some karma on our.umbraco.org!

Umbraco 4.2 coming

Thursday, April 01, 2010 by Niels Hartvig

With Umbraco 4.1 currently on its way towards RC mode, the core team is hard at work on v4.2. Last week the engineering team had a major breakthrough on one of the most requested features - support for 3rd party CMS modules.

"We're seeing more and more people coming to Umbraco from other last generation Web CMSes", Umbraco Founder Niels Hartvig says and continue "They enjoy the pure elegance of a next generation Web CMS such as Umbraco, but unfortunately they're stuck with a galore of old modules they've purchased for their previous CMS and that delays a complete transition to Umbraco".

With the new Modulizer Factory in Umbraco 4.2 it'll be possible to use modules from other systems such as Joomla, EpiServer®, Drupal®, DotNetNuke® and Ektron® with just a single click from the Web interface. It'll automatically import data and convert php, python, perl and Cobol into native .NET compatible CLR code.

"With the Modulizer Factory®, the new Umbraco users will have access to more than 53.000 modules which means that they can spend all their time evaluating modules that replicates what was hot last year instead of using the Umbraco building blocks to release new innovations in record time. As such, users coming from these systems will feel at home in Umbraco 4.2" states Niels Hartvig.

Umbraco 4.2 and the Modulizer Factory® is expected to be available in Q4 2010 with a working preview available for Umbraco CodeGarden '10 attendees.

Profit through generosity

Friday, March 26, 2010 by Niels Hartvig

The number one question I always get asked is how Umbraco is making money and how on earth we can be profitable when we give things away for free. Our business philosophy is internally coined as "Profit through generosity". Not only do we believe that generosity - not to confuse with philanthropy -  leads to business, but we've also walked the walk and proven for almost two years that it's sustainable.

Let's start with some tiny facts about Umbraco HQ (the company):

  • We have been profitable since Q2 2008
  • We're four employees
  • We see ourselves as an equal part and participant of the Umbraco community
  • We make our money by adding value to the Umbraco CMS ecosystem
  • We use the profit to work on the core of Umbraco CMS

And here's some on the Umbraco CMS:

Our sources of revenue are three:

Our mighty training/certification empire
We've developed a very successful and appreciated course system. In the beginning all courses were run be ourselves but now we've started to franchise the system to other key persons in the Umbraco CMS community.

Why this adds value: We ensure that people learn to use Umbraco CMS in the very best way, we take responsibility in terms of setting a standard for what makes a skilled Umbraco Developer/Solution Provider which makes it easier for companies to screen the market. For Umbraco HQ it gives a stable and predictable income which in returns gets invested in the core product.

Umbraco.tv
While the above is awesome for the people attending, it's not for all. Not only do the courses (almost) always sell out, but the price tag and regional availability can prevent it from a broader appeal. This is why we introduced umbraco.tv in the fall of 2008. It doesn't replace the courses, but enable us to share our knowledge with many people at a very low price while still ensuring a revenue flow.

Why this adds value: It makes it easy for everyone to get started with Umbraco CMS at a price less than a book. Being a service it also lets us add more and more content to people who subscribe ensuring that they can keep improving their skill sets also on very narrow topics which makes it an awesome supplement to the courses. For Umbraco HQ it's a source of income that both scales and is attractive for the huge and constantly growing user base. For me - this is likely the product that I'm most proud of.

Umbraco PRO
This was for a lack of a better name and I hope it'll change in the future. Umbraco PRO is our supported and guaranteed version of Umbraco CMS. Today it's a mashup of different services and products we had in the beginning, but we're starting to release the product in the bundle as individual offerings with our successful form designer - Umbraco Contour - being the first. At the very heart of it, Umbraco PRO tries to solve some of the concerns we meet from bigger companies. With Umbraco PRO they get better bug fixing warranty than any standard Web CMS EULA meets and with the support option on top, they get stellar tech support from the very people who make the software.

Why this adds value: The bug fixing warranty brings great comfort for companies and the support not only ensures that companies and solution providers can get solid answers in very short time but also ensures that we - the company - get a great sense of what areas of Umbraco CMS need more attention.

As our revenue sources clearly show, our business is not rocket science. We use the power of our brand, trademarks and knowledge to ensure revenue. The more people using Umbraco CMS, the bigger market for our services. Hence a strong motivation for a solid core product. Hence a motivation to invest back directly on the product [generosity] as it makes the platform more attractive.

And while some might argue that our business is small, Umbraco is fast-forwarding towards one of the biggest install bases for Microsoft based Web CMS. This while being strongly profitable. Something very few VC-backed projects can boast. You don't need to be big to make change. But you need to be profitable to be sustainable long term.

Our business model is a perfect mashup of ongoing trends such as Freemium, Transparency and Open Source and at the same time we get to do what we love - being part of a stunning change backed by the most wonderful community.

That's sustainable change.

Greedy Umbraco

Friday, March 19, 2010 by Niels Hartvig

greedyUmbraco

Dear Tony!

I wanted to mail you, but the pissedoffWithgreadyUmbraco.com doesn't seem to be a real domain.

Our videos are free for everyone who bought Umbraco PRO, but for everyone else it's a 19EUR (29USD) bargain! How about that - we provide the a product for free, yet you're able to gain access to the same quality training materials that the paying customers get for less than a book cost.

The reason that we post partial videos as teasers is to ensure that people get a chance to evaulate the .tv product in case they want to buy. Not only do we offer ten essential foundation videos for free, but we also make sure that you can get a sense on what's going on in the other videos from more than just a title and an abstract.

I don't think your metaphor around the partially assembled product holds water. Honestly - you haven't bought anything. If you think we're greedy, I think the world needs more greedy people.

Best,
Niels…

Umbraco @ MIX10 Wrap Up

Thursday, March 18, 2010 by Paul Sterling

As the umbraco team heads home we consider what MIX means for umbraco - and its all good.  MIX is a fantastically exciting event for web developers and especially for those of us who have based our solutions on the Microsoft stack.  A great collection of smart and talented web professionals attend MIX and we were thrilled to be part of it.  Many MIX attendees also head home in possession of a shiny new umbraco logo sticker - these were found in a variety of surprising locations throughout the MIX venue.  Look for them to appear on the laptop lids of umbraco users soon, sort of the new hotness for the cool umbraco kids - at least that's what we told folks at MIX!

umbraco-stickers

The Team

I, Paul Sterling, had the pleasure of attending MIX in the company of Per Ploug Hansen from Umbraco, Alex Nordcliffe from Xeed, Peter Miller from Condé Nast Digital, and Benjamin Howarth from Code Gecko.  Our days were packed full of meetings with current and potential partners and very interesting sessions covering a broad range of topics from Silverlight to Windows Phone 7 Series to MVC v2.0 and more.  We had scant time for a break, but we did manage to see the sun once or twice all the same.

4438744536_f37ca7fc22[1]

Day 1

Umbraco's success in the Microsoft Web App Gallery was prominently featured in the Day 1 keynote.  Umbraco has been downloaded more than 100,000 times from the Web App Gallery and the total number of downloads is more than 10 million - all of this in the last 12 months.

75522692[1]

Day 2

The Day 2 Keynote was not without its umbraco tie-in as well.  Microsoft launched its oData protocol and related technologies all presented on the odata.org site - which is powered by umbraco and built by the talented folks at Vizioz.

Its no secret that more than a couple of current and future Microsoft sites are built using umbraco.  To further the great relationship umbraco and Microsoft share we are developing a deeper partnership in 2010.  Much of the results from this partnership will not be seen in the immediate future but rest assured we are working hard together to ensure the growth and stability of the umbraco installed base.  If you've been waiting for the time when Microsoft recognized the unique and valuable combination of umbraco's technology and community - that time is now.

The Dinner

On Tuesday evening umbraco hosted a dinner for 35 MIX attendees.  The response was overwhelming and we were forced to use a highly complex and proprietary algorithm to select the lucky dinner invitees. 

75838835[1]

In addition to a host of interesting and hungry people, a number of virtual celebrities joined us and participated in the lively discussion.  Among the attendees were Scott Hanselman, Sara Chipps, Pete Brown, Chris Woodruff, Jon Galloway, and Jim Minatel

The End

Talking with current umbraco users and partners is a huge rush but meeting people curious about umbraco is even more exciting.  Of all the people we spoke with at MIX we were most impressed with the open-mindedness and willingness to consider an approach like umbraco - one that is open-source, friendly, and maybe a little bit of an underdog.

Get certified in the Benelux

Wednesday, March 17, 2010 by Tim Geyssens

We've just opened registration for the first round of official Umbraco courses (both level 1 and level 2) held in Antwerp, Belgium.

Level 1 is running on 3rd & 4th May 2010
Level 2 is running on 5th & 6th May 2010

Both courses will be be taught by umbraco HQ team member Tim Geyssens who brings more then 3 years Umbraco experience to the dojo.

These are the same courses taught throughout Europe and North America, the training will give you everything you need to know to attain your Umbraco Certification at either level 1 or level 2.

Secure your seat here.

CodeGarden 10 is coming

Wednesday, February 24, 2010 by Niels Hartvig

3650589586_d8bc0718f9_o

Our annual Umbraco Conference - CodeGarden - is here again. On June 24-25th 2010 web developers, designers, editors and other Umbracians from all over the world will gather in Copenhagen for the sixth time. We opened registration last week and we're already past 70 attendees which means it took less than 48 hours to outnumber the number of attendees from 2005-2007!

CodeGarden is a phenomenal conference and THE conference to attend if you work with Umbraco or consider doing it. We've managed to keep the early bird price at EUR300 and that's a *steal* for three full days of talks from all the numero uno Umbraco experts and the fee is even including swag, awesome organic food and loads of surprises along the way.

ASP.NET MVC Pre conference

As we revealed last year, we're transitioning to Microsoft ASP.NET MVC for the next version of Umbraco - Umbraco 5 - which we're aiming to release Q1 2011. At last years CodeGarden, I also promised that we'd help to make this a smooth transition for everyone. And action speaks louder than words, so I'm proud that we're not only thinking about how the software works but also in how to raise the level of competence for people in the Umbraco community by arranging an MVC pre-conference day on the 23rd.

We've somehow managed to convince MVC experts Simone Chiaretta and Jon Galloway to come and do MVC bootcamps on the day before CodeGarden starts (June 23rd). It's free for all attendees and it's an absolutely stunning chance to get up to speed with the next generation of ASP.NET and the foundation of Umbraco 5.

Simone Chiaretta is an ASP.NET MVP and ASPInsider as well as the author of the Beginning ASP.NET MVC from Wrox. Jon Galloway is working at Microsoft and is the author of the coming Professional ASP.NET MVC 2.0.

Ensure your ticket today!

All the previous CodeGardens have sold out and the ticket sale this year has obviously blown us away. Make sure to register today - either before the price goes up or before CodeGarden10 is sold out.

Umbraco 5th Birthday in London - Presentations

Monday, February 22, 2010 by Warren Buckley

Hello all,
It's Warren (The CWS guy) here I haven't blogged for Umbraco Corp for quite a while now, but its good to do a guest post again.

Last week Adam Shallcross from The Cogworks and myself from Xeed hosted the 5th Birthday party on 16th February 2010 in London and I'm glad to say it was a huge success, with around 75-80 people turning up to watch a jam packed day full of talks, birthday cake and mingling.

umbraco-5-london-attendees
Some attendees at the 5th Birthday
Photo: Douglas Robar

Adam and me organised the day to be a fun day as possible, with each attendee getting a birthday goodie bag that included:

  • Umbraco pen
  • Umbraco & Our.Umbraco button badges
  • Umbraco paper pad for all those important notes
  • Drink Voucher
  • Party popper
  • Party hat

umbraco-badges
Umbraco button badges that attendees received
Photo: Warren Buckley

 

The day's schedule was as follows:

  • Per from Umbraco - The history of Umbraco & what is to come in the future
  • William Coleman & Mark Quirk from Microsoft UK - Upcoming tech (.NET4, Azure, Silverlight)
  • Chris Houston from Vizioz.com - CMS Mailer
  • Paul Marden from Orcare.com - Google Checkout
  • Adam Shallcross & Tim Saunders from The CogWorks - Integrating systems not just CMS
  • Benjamin Howarth - Medium Trust
  • Neil Tootell & Julien Decaudin from SAS Design - SAS Design 2009 Projects
  • Alex Norcliffe & Peter Miller from CondeNast - Cloud computing & scalability
  • SWAG Raffle

Presentations

Chris Houston from Vizioz.com - CMS Mailer
http://www.slideshare.net/warrenbuckley/cms-mailer-for-umbraco

Paul Marden from orcare.com - Google Checkout
http://www.slideshare.net/warrenbuckley/google-checkout-for-umbraco

Benjamin Howarth from Code Gecko Developments - Medium Trust for Umbraco
http://www.slideshare.net/warrenbuckley/umbraco-medium-trust

Neil Tootell & Julien Decaudin from sasdesign.co.uk - 2009 Projects
http://www.slideshare.net/warrenbuckley/sas-design

Alex Norcliffe & Peter Miller from CondeNast Digital - Cloud computing & scalability
http://www.slideshare.net/warrenbuckley/pm-an-umbraco5th-presentation-pete

Videos

Paul Marden from Orcare has done a great job of recording these videos and putting them up onto Vimeo.com
http://vimeo.com/channels/88314

Want to see photos of the event?

As always our budding "umbraco" photographer Douglas Robar of Percipient Studios has put his photos online at Flickr - http://www.flickr.com/photos/percipientstudios/sets/72157623392288216/

Want to watch a room full of developers sing Happy Birthday to Umbraco?

 

Would like to say thanks again to The Cogworks and Xeed to help fund the event and also thanks to Microsoft UK for giving us some nice SWAG to give away.

 

Warren :)

We’re opening a North American office

Thursday, February 18, 2010 by Niels Hartvig

We got a lot of users in North America - in fact it's the number one visiting country on this website - but we've never had a good (official) way to support them. So to find a way, we went on a company retreat and had some unexpected help:

More (serious) details coming next week.

Time to vote for the 2010 Umbraco MVPs

Friday, February 05, 2010 by Niels Hartvig

Umbraco got the worlds most friendly community. Period. With more than 5.000 individuals helping each other every month it can be hard to pinpoint who's doing more than others, but there are Umbracians who're putting an almost unbelievable effort in answering questions on the forum, producing killer packages and sharing knowledge in the wiki and blog posts.

To show how much we appreciate their work, we made the Umbraco MVP - Most Valued People (*not* professionals) program in 2007. If you take a look at the ten different people who've previously received the MVP award, I'm sure you'll find out that they helped you when you started with Umbraco and that your Umbraco sites are using their packages.

Previously it was Per and I who decided who got to be MVPs, but last year we decided to change that. Let the people who've received help be the ones who choose the MVPs. So we invented the Karma system on Our and we've used that to make a shortlist of the twenty candidates for the 2010 MVP award:

Cast your vote before March 1st 2010

To narrow this down to five MVPs, please take your time to vote for your favorite candidate. For more details, please check the voting page on Our Umbraco.

Congratulations to all twenty people who made this list and let the best five win!

Bringing the best from our to the package repo

Thursday, January 07, 2010 by Tim Geyssens

Today we've done another update of the umbraco package repo (that's available from the packages tree in the developer section of umbraco). Again we've added some of the best rated/most downloaded projects created by our amazing community.

FamFamFam Icons by Shannon Deminick

Extends the document type icon dropdown with a massive number of icons.

633909961208530000_famfamfamUmbacoicons

More details on this project on our.umbraco.org.

Log Manager by Immo Wache

Adds a new tree to the developer section that can be used to manage the umbraco log.

633960929716338364_view_logs

More details on this project on our.umbraco.org.

Char Limit

A  datatype that allows you to set a limit on the number of characters that can be entered in a textarea.

633881969257021608_charlimit1

More details on this project on our.umbraco.org.

 

Remember to keep voting on your favorite packages and spread some karma on our.umbraco.org!

Blog 4 Umbraco 2.0.24 - Release

Thursday, December 24, 2009 by Per Ploug Hansen

It's only 24 days since we coined the idea of improving the Blog 4 Umbraco package as a christmas calendar. Today we're releasing what we've accomplished so far - and it's quite a lot so in case you've missed anything here's a summary:

In addition to the work done by Per Ploug Hansen, Tim Geyssens and yours truly, several community members have contributed with code, testing and skins. Morten Bock, Warren Buckley and Thomas Höhler have contributed with xslt improvements and Ian Houghton, Warren Buckley, Jason Prothero and Alan Ballard have contributed with skins with many more community members working on more. Awesome.

You can install the final version of Blog 4 Umbraco version 2.0 with just one click from the package repository or download the package from Our Umbraco. You can download the documentation from Our Umbraco and you can download the full source of the project from CodePlex. You can also download the nightly updates from our build server.

Merry Christmas!

Blog 4 Umbraco 2.0.23 – Create new posts from the dashboard

Wednesday, December 23, 2009 by Niels Hartvig

In this second last chapter of this wonderful journey aka the Christmas Calendar 2009 it's the final touch - what it's all about: Create new blog posts. Easier.

While Umbraco's UI makes it a breeze to manage and edit content it's still a multi step process to create a blog post. And while Blog 4 Umbraco automatically generates a content channel so you can edit with Microsoft Word, Live Writer or any other 3rd party that supports MetaBlogAPIs that might not be an option either. All we want is to login to Umbraco, write a post and click Publish. And that while still having full support for any dynamic changes to our document type.

The Dashboard and the DataType APIs to the rescue - and a lot of hacks

Once again the solution is the easy to config and extend dashboard in Umbraco. We'll simply place a "Create Blog post" control on the dashboard and make the control visible when you login. Like this:

Picture 30

Notice how the edit controls looks exactly as when we edit the blog post normally. This is because we're reusing the settings on the document types and uses the DataType APIs to fetch all the metadata on the properties. This means that if you add additional properties to the blog post document type or if you change the existing ones, they'll automatically be updated. It's very simple and the exact same technique used by AutoForm or Doc2Form (and the standard edit content page, btw). And it's really simple - if it weren't because the Rich Text Editor and the Tagging datatypes are the two most advanced and both have horrible design decisions - I couldn't get the toolbar icons from the Rich text editor appearing and I got weird exceptions in the tagging datatype.

Luckily Umbraco is open source are we can actually find the reason why all this is happening. The Rich Text Editor couldn't understand where it was, it was neither on a standard edit page (such as edit content, member or media) and it wasn't in live editing either. So it couldn't find anywhere to place the toolbar icons. Luckily it's fully configurable and we're able to tell it by accessing the Config collection in the tinymce class. Problem solved. Only thing that needs polish is the 140px left padding, but that's a job for a jQuery hack later :-)

It was a bit harder for the tagging datatype. You see, to find out which tags is already selected for the item you're editing it uses a weird technique of either calling the request collection for an id (when editing on a standard edit page) or using the node factory when editing live. This is probably legacy as data types have an easy way of getting the current id of the item edited, but that doesn't help us when it's already done wrong. Luckily we can use reflection to modify the request collection (now that's a hack!) to add the id and voila, the tagging control worked too.

All in all it was a little harder than it ought to and once again this process reveals areas where Umbraco can easily be made better. But at the same time, I was very satisfied with the end result and think it's a very handy technique for improving the editor experience in an Umbraco implementation. This technique could easily be used to news editors or other types of create tasks where users often create the same types of documents. This really speeds up the workflow.

Blog 4 Umbraco 2.0.22 – The Installer

Tuesday, December 22, 2009 by Per Ploug Hansen

We want to give people the best start possible, using the blog package. So after setting up everything in Installer actions for easy install/uninstall, we decided also to add a usercontrol based Installer.

This is purely for giving people the first configuration options - setting the blog's name and description, which is then published so content channels and everything is setup automatly at the same time.

 

So besides the standard install experience, the user also gets the additional setup options.

image

After filling the fields, the blog is setup, the channels are created, and the user is redirected to the blog where a welcome post with documentation and community information awaits:

image

Finally the blog channel is setup automaticly (if the user doesn't have a channe setup already) to make it easy to connect a blogging client to the blog.

Which is ofcourse detailed in the usage guide on how to do.

Blog 4 Umbraco 2.0.21 - Documentation

Monday, December 21, 2009 by Per Ploug Hansen

The goal of the Christmas calendar has since the beginning been a better blog package for umbraco. And so far we've had our eyes on features only. Yes we've done some polishing and finishing here and there, but it has been all about getting the feature-set up to date.

But we would like to take it a bit further and spend the last couple of days before the Christmas holidays to finish the project off in a proper way. We would like the result to be a fully done package. Not just the features, but also with good and clear documentation on how to configure this package, and how developers can skin or extend on it, as well as a good install experience that help the user getting started using the package. image

So today is all about beginning work on the documentation, and adding it to the project.

For skinners and developers

We felt the first documentation should be for skinners and developers. As we've already called out for skins for the blog package. So today we've added a sample skin file to the project, complete with Manifest, Css file, images and thumbnails. Ready to upload to packages.umbraco.org

Also, in the project, static html files have been added for reference, so you don't have to have a website with blog4umbraco on running. Just power up textmate and style away.

Finally the draft of the skinning guide has bee added. Sofar about 10 pages on the template structure, html element placements and contentplaceholders in the masterpages. And more will follow.

For end-users

Also a Usage and Configuration guide is underway. It will cover everything the blog editor need to know to get started with a umbraco powered blog. From installing the package to configuring the features and setting the visual appearance.

So far chapters on configuring pings and Akismet have been added, and more will follow.

Blog 4 umbraco 2.0.18 – A new design in 20 seconds

Friday, December 18, 2009 by Niels Hartvig

The SkinBrowser is finally alive and working. You can try it using the latest build found here. If you rather want to wait for the final version of blog4umbraco that comes in a few days then here's a little movie to show the functionality. As always - remember to crank up the volume:

You need to have Flash and javascript enabled to use this video tutorial

Hopefully we'll see a bunch of new skins (and get rid of some of the ugly ones in there) over the next couple of days now that the markup is in place. Remember to submit your skins!

Blog 4 umbraco 2.0.17 – Picking the right theme for the skinners

Thursday, December 17, 2009 by Per Ploug Hansen

It's never easy to lock down a feature, getting the final touches juuust right and then move on. When working with a feature that will be let loose into a community and get a life of it's own it's even harder. Then it's unchangeable and locked down forever, in the sense that if you change it later on, it will affect alot of people.

That is the situation with the Blog 4 Umbraco Html structure and the skinners that hopefully will use this. We needed to get it right before shipping it, too many people will depend on it. So we tried out some different options to figure out which ones was most flexible, viable and not too heavy to work with.

So we worked through:

  1. The Kubrick theme, easy to work with, included by default on wordpress accounts and known by many. The html is clean but not that flexible incase you wanted something else then a 2 column simple blog.
  2. The K2 theme, tons of features, tons of html, after working with the html, deemed too heavy to set up without cutting off too much of the included functionality
  3. K2 Lite, much better, cleaner html, simple to work with

So we had actually settled on the k2 lite theme to be included on the blog. But then, deep inside the wordpress skinning world, we encountered the Sandbox theme. Now as you can see, sandbox is very very basic, even more basic then Runway - our simple website starterkit, but that is the great thing about it, and also why it seems wordpress is about to include it by default

And there was already ported a css version of k2 for it, perfect! It looks clean, the html is built with css skinning in mind, and everything is pretty clean - wonderfull.

So after the many considerations on how to pick a theme that skinners will be able to use, we ended up using an established standard which already has a community around it. That is indeed truly wonderfull, and really in the spirit of umbraco. Don't try to reinvent the wheel, pick somehting works already if it solves your problem.

So for anyone who wants to build a skin for the blog package, this is a preview of the finished html. It includes a html page with the markup and a sample css file. So to start skinning, simply exchange the css file reference with your own stylesheet.

Download the theme html

We will post the details on how to get the skin into repository, later today.

UPDATE: The blog is now on nightly.umbraco.org as an installable package:

http://nightly.umbraco.org/Blog4Umbraco/2.0.17/Blog4Umbraco_2.0.17_633966499098161229.zip

Blog 4 umbraco 2.0.16 – Ping services

Wednesday, December 16, 2009 by Niels Hartvig

Today is about getting an automated pinger setup on our blog so you can notify indexers like Google Blogsearch about your new posts.

We will set it up with a simple event handler that checks if the blog has any urls to ping. We will add the urls to the blog root itself by using the related links control:

image

This creates a simple xml structure which is saved on our document. So everytime we publish a new blogpost, we will simple look up the serviceUrls property recursively and ping all the urls in there.

First, a little snippet to get the value recursively:

private string GetValueRecursively(string alias, int nodeId)
{
    Document n = new Document(nodeId);
    Property p = n.getProperty(alias);
    if (p != null && !string.IsNullOrEmpty(p.Value.ToString()))
        return p.Value.ToString();
    else if (n.Parent != null)
        return GetValueRecursively(alias, n.Parent.Id);

    return string.Empty;
}

So now we can just pass the alias of the property and the Id of the document where we should start looking. If nothing is found it will continue up the content tree untill it finds anything or runs out of parent documents to look in.

As soon as we've done this, we will query the related links xml. It is structure with a parent <links> element containing child <link> elements with attributes on storing urls, names and other meta data. We will also setup the blog name and url which will be send off to the pinged urls.

string blogName = GetValueRecursively("blogName", sender.Id);
string blogUrl = umbraco.library.NiceUrlFullPath(sender.Id);
string currentDomain = HttpContext.Current.Request.ServerVariables["SERVER_NAME"].ToLower();

if (!UmbracoSettings.UseDomainPrefixes)
    blogUrl = "http://" + currentDomain + blogUrl;

foreach (XmlNode link in xd.SelectNodes("//link [@type = 'external']"))
{
    string ping = link.Attributes["link"].Value;
    //Log.Add(LogTypes.Debug, sender.Id, ping + " n:" + blogName + " u:" + blogUrl);
    PingService(ping, blogName, blogUrl);
}

This is all put together in an event handler that will fire off after any documents with the contenttype alias = "BlogPost" has been published. The actual ping is handled in the method PingService which simply puts together a chunk of xml and sends it off to the url as a normal HttpWebRequest.

 

Done, we can now ping any service that supports the xmlrpc blog pings.

Blog 4 umbraco, 2.0.15 Progress on the SkinBrowser

Tuesday, December 15, 2009 by Niels Hartvig

skinbrowser

I'm getting really close on getting the SkinBrowser fully working now. It's able to load the available skins from the package repository based on the package key (for instance "blog4umbraco") and it's done through AJAX with help from the wonderful jQuery.load method (can you remember how frustrating these things could be prior to that?!?). While the current UI needs a good deal of polish the most important thing is that it works. You can click a skin and it'll save the reference to the skin as the property.

The idea is to then fetch the skin zip-file from the package repository when you save through an event handler. It'll then download and unzip the skin as well as create a new stylesheet in Umbraco and then finally store a reference to the stylesheet path as the value of the SkinBrowser property. This means that it can be fetched in our template using a very simple recursive call such as:
<umbraco:Item runat="server" id="skin" Field="css" recursive="true />

Cool - now we just need real data. We need your help!

So now that the functionality is in place it's time for some data and I've requested some help both on Twitter and Our. Basically all the nice thumbnails above are just bogus in the way that their actual skin zip file is the same - doh. And if you're a html/css ninja with spare time before Christmas it's time to ask yourself "How can I not spend a couple of late night hours converting a Wordpress theme" - and the answer is of course "YES". Go find a sweet a nice WP theme with an open source license or if you have the talent and time create your own design. Make it compatible with the blog4umbraco markup, produce a skin file and upload it to the skin service (details). Remember that an blog4umbraco skin is css and images only.

Before you begin making a skin:

- I've just been told that we're polishing the markup on blog4umbraco to match the K2 theme markup. So wait until later Thursday (the 17th after 12.00 GMT+1) to begin as we'll post the updated markup samples here

- To ensure that people don't work on the same skins, leave a comment with what skin you're creating and when it'll be ready.

As I'm known for being ridiculous optimistic, I'm hoping that Friday the 18th will reveal a blog4umbraco build with a completely done and polished SkinBrowser as well as the first couple of skins available. Let's see if I was too optimistic this time ;-)

Get skin support for your package

If you're producing a public package and like to get skin support then get in touch and we'll be happy to provide the Skinbrowser datatype as well as the skin hosting service for free.

Blog 4 umbraco, 2.0.14 Easy blog creation

Monday, December 14, 2009 by Per Ploug Hansen

Sofar we've only looked into having a single instance of a blog on your site. So the blog was the site in itself. However, there is really no reason why you couldn't run multiple instances of a blog as part of a bigger site so multiple authors could have their own place to write content. Also we havn't looked into who actually is the author. of the blog.

So today we will do 2 things:

  1. Create a simple User Picker for the UI so we can pick a user on the blog item
  2. Create a simple dashboard for creating a blog with

This will involve messing around with the AbstractDataEditor class, the User API and the build Umbraco UIcontrols which are located in the umbraco.uicontrols namespace.

The user picker

For reasons unknown there is actually no UI component in umbraco for picking a specific user and save the users ID on a document. But no worries, this is really really easy to do and faster then you can say "AbstractDataEditor".

We want to create a dropdown control so all we have to do is render a dropdown and save the user selected in the control

Start off by creating a new class, and make it inherite the class: umbraco.cms.businesslogic.datatype.AbstractDataEditor

Override the Id, and DataTypeName Properties and set a unique ID and a proper name.

Then we need the dropdown control and wire up the events we need:

private DropDownList m_control = new DropDownList();
        public UserPicker()
        {
            base.RenderControl = m_control;
            m_control.Init += new EventHandler(m_control_Init);
            base.DataEditorControl.OnSave += new umbraco.cms.businesslogic.datatype.AbstractDataEditorControl.SaveEventHandler(DataEditorControl_OnSave);
        }

When we have the events wired up we can load the users into the control:

void m_control_Init(object sender, EventArgs e)
        {
            m_control.Items.Clear();
            foreach (User u in User.getAll())
            {
                m_control.Items.Add(new ListItem(u.Name, u.Id.ToString()));
            }
            m_control.SelectedValue = base.Data.Value != null ? base.Data.Value.ToString() : "";
        }

And then tell the dataeditor to save the selected value

void DataEditorControl_OnSave(EventArgs e)
        {
            base.Data.Value = m_control.SelectedValue;
        }

And presto, we can now save a User ID on a document. We will add this as a autho property on the Blog document type. The complete class can be found here

 

The dashboard control

So now that we have a place to store the author ID, we will create a simple control to manage the creation of new blogs and place it on the dashboard. To give it a native feel and follow the umbraco UI guidelines, we use the built-in UI controls to manage the UI. These are in the controls.dll and can be referenced in the .ascx by adding a reference:

<%@ Register Namespace="umbraco.uicontrols" Assembly="controls" TagPrefix="umb" %>

So to build a simple form with internal umbraco UI components you can now use the umb prefix, like so:

<umb:Pane runat="server" Text="Create a blog">
    <umb:PropertyPanel runat="server" Text="Blog name">
        <asp:TextBox ID="tb_name" runat="server" />
    </umb:PropertyPanel>

    <umb:PropertyPanel runat="server" Text=" ">
        <asp:Button runat="server" OnClick="createBlogClick" Text="Create" />
    </umb:PropertyPanel>

</umb:Pane>

Now that we have the form in place, all we need is some simple API calls to create the correct document

DocumentType dt = DocumentType.GetByAlias("Blog");
Document d = Document.MakeNew(tb_name.Text, dt, User.GetCurrent(), int.Parse(cp.Text));

d.getProperty("author").Value = User.GetCurrent().Id;
d.getProperty("blogName").Value = tb_name.Text;
d.getProperty("blogDescription").Value = "The blog of " + User.GetCurrent().Name;

d.Save();

d.Publish(User.GetCurrent());
umbraco.library.UpdateDocumentCache(d.Id);

Later on we will enable the form to also create the author automaticly, but for now the form is just attached to the current user.

Adding it to the installer

The final thing we need to do is to ensure that the installer adds the control to the dashboard on install. The usercontrol is added automaticly, but we need to instruct the installer to add it to the dashboard.config (and remove it on uninstall as well). We do this with a package action:

<Action runat="install" alias="addDashboardSection" dashboardAlias="CreateBlog">
      <section>
        <areas>
          <area>content</area>
        </areas>
        <tab caption="Create Blog">
          <control>/usercontrols/Blog4Umbraco/BlogCreator.ascx</control>
        </tab>
      </section>
    </Action>

 

That is all for today, we did a new ui component for selection users in about 15 lines of code, we used native UI components for building a custom dashboard control and finally wrapped everything up nicely in the installer.

Blog 4 umbraco 2.011 – Html, xslt and the loose ends

Friday, December 11, 2009 by Per Ploug Hansen

So far we've just added new functionality to the blog package, without actually given any thought on how the final package should be presented and how the blog will look and function to the end users.

So today I'll go through these small nitpicking tasks. Add presentation of posts and comments to the package, look into the html and css, and get rid of (most of) the loose ends we currently have. This also means that the html will be final so developers can start modifying the css for the upcoming skinning functionality.

So the hours today have been spend on alot of the details which would normally be focused on when releasing, but as the final release is december 24, and all of us has some sort of family to go home to on that day, we thought it would be better to do today :)

Xslt for posts, comments, tags

First of all, a major thanks to Mister Morten Bock who has donated his xslt snippets for a tag cloud and weighted related posts. These have been added to the package as normal xslt extensions. The related pages xslt contains a single custom method which calculates the weight of the relation between posts by counting the number of categories in common. We are doing this in c# as xslt is not in any way capable of doing this, luckily, extending xslt is so easy to do.

Blog pages

A blog textpage has been added to the package so additional content can be created without it being a blog post.  We will use this to store about pages, search results, tag clouds and everything else that is not a blog post.

Templates refactor

Things have been moved around here and there to take advantage of masterpages multiple placeholders functionality. So each individual part of the master template comes with default html that can be override on any of the child templates. Support for changing background images on each individual blogs have been added

Xslt tweaks

Basic cleaning has been done in a handfull of files.

More polishing to come

This is the first push on the details front, as we get nearer the final release, we will continue to put small details into the package.

And yes I know this is not the most revolutionary of posts ;) So I promise we will do some really great things next week to make up for it.

Blog 4 Umbraco 2.0.10 – Comment moderation

Thursday, December 10, 2009 by Tim Geyssens

Today I continued the work on the comments part of the blog (after storing the comments in a seperate table and tackling comment spam with Akismet). I added a new control to the content dashboard where it will be possible to moderate the comments.

Dashboard ?

The (usually) blank right side of umbraco is called "The Dashboard". This area is configurable by adding references to the file called "/config/dashboard.config".

So I created a new usercontrol wich I added to the content dashboard by added this snippet to the config/dashboard.config

<section>
      <areas>
        <area>content</area>
      </areas>
      <tab caption="Comments">
        <control>/usercontrols/Blog4Umbraco/CommentModeration.ascx</control>
      </tab>
</section>

With this comment moderation usercontrol I simply list all the comments and make it possible to delete and mark as spam/ham , in case Akismet didn't make the right conclusion.

image

The content dasboard now has a comments tab where you can view all/only approved/only spam comments (with gravatar, author name, email, website, comment, timestamp and the page it was posted on). For each comment it is possible to delete. If the comment was seen as spam it has a different background color and it's possible to mark the comment as ham (this will send feedback back to Askimet and approve the comment so it displays on the frontend). If the comment wasn't seen as spam it's also possible to mark it as spam (wich will also send feedback back to Askimet and it will mark to comment as spam and remove it from the frontend).

The code for the usercontrol basicly just uses the datalayer to fetch all comments and then this is binded to a repeater.

private void BindData()
        {
            IRecordsReader rr = SqlHelper.ExecuteReader(
                string.Format(
                "select * from comment {0} order by created desc", Filter));

            rptComments.DataSource = rr;
            rptComments.DataBind();
        }

 

This is the first version of the comment moderation control, so there might be other features added in the next days.

Blog 4 Umbraco 2.0.9 – SkinBrowser datatype take 1

Wednesday, December 09, 2009 by Niels Hartvig

A week ago I blogged about the initial thoughts for a Skin browser in blog4umbraco (and in general) as well as looking at the server part. Today I've started the work in the datatype - ie. the place in blog4umbraco where you'll be able to fetch and change your current skin.

While nowhere near done it was an interesting experience into the very belly of the Umbraco core and an even better inspiration on how we can make this much easier in the future. That was one of my hopes for this calendar - that by eating our own dog food in an über agile (read: completely unplanned) project we'd play with the parts of Umbraco that we don't deal with normally. But let's start from the beginning, shall we!

What is custom datatypes anyway?

Why not start by looking at what a datatype is. It's the different types of edit options on content properties in Umbraco. While that might sound a little complex, you know them already; Upload, Richtext Editor, Ultimate Picker, Textbox multiple (and what's up with that silly name for something that just a textarea, Niels!), etc. In order words, datatypes are the "Type" you choose when adding properties to a Document-, Member- or Media Type.

While Umbraco ships with more than twenty datatypes, you may find that it's not sufficient and this is where the custom datatypes comes in: As with any other areas of Umbraco you can add your own.

The options

Datatypes are the most central part of Umbraco and can be a bit overwhelming as they handle editing, persistence, xml generation and configuration at their most extreme and the price for all this is of course a good bunch of interfaces that you need to implement. At the same time this was one of the very first things designed in Umbraco back in 2004, so - well, let's just skip over that part elegantly and say there's room for improvement - and improvement has been made!

Instead of learning a lot about how all these interfaces work, you can turn any ordinary user control into a custom datatype with implementing just one interface with a single property by using the existing "Usercontrol wrapper" datatype and the IUsercontrolDataEditor interface (found in the umbraco.editorControls.userControlGrapper namespace - notice the nice typo in the namespace. That's called digital patina and gets more and more charming as it age. It's definitely not a bug!). While this technique is really easy and sweet it doesn't fit our needs as we're trying to make a pretty generic datatype that can be used in other places that just the blog4umbraco package, so...

AbstractDataEditor is our choice!

The abstractDataEditor was added in Umbraco 4.0.1 to make it easier to build advanced custom datatypes. It makes it possible to use composite controls together with custom configurators all while not having to know about how everything is wired in Umbraco - just what we need! But the whole configuration part is really something that could need a lot of TLC as all the CRUD operations of config values is a manual process which is really silly and unnecessary complex. But this means that we can improve Umbraco and that's awesome :)

While this (and the above) is great topics for future umbraco.tv videos you can read more about making your own Abstract Data Editors on Tims awesome blog.

With the Abstract DataEditor in place I was able to make a nice (unpolished) way of configuring which package that the SkinBrowser should query on the package repository as well as a placeholder that'll take care of fetching new skins as well as install them:

Picture 21

The SkinBrowser configurator

Picture 22

How it looks right now when placed on a document type (currently a non-functional placeholder)

More on that very soon...

Blog 4 Umbraco 2.0.8 – Tackling comment spam

Tuesday, December 08, 2009 by Tim Geyssens

In todays chapter (notice that it's 2.0.8 , yesterdays should have been 2.0.7, small mistake by santa's magic elf) we'll be improving Blog 4 Umbraco to include some spam protection. We'll be checking the comments against the Akismet spam filtering service. But since Akismet isn't the only spam filtering service we'll be building a simple provider model to make it easy to add support for whatever service you want to use.

Before you can use Akismet you need to have a valid API Key ( You can get a free API key by registering for a user account here). And we'll also need to store this API Key, since Akismet will be set as the default on new Blog 4 Umbraco installations we'll just store this on the blog node. So I'll need to add a new property on the Blog document type.

image

After adding the new property I'll be able to set the API Key on the Blog document.

image 

Now I'm ready to start using Akismet. I'll first start by setting up a simple provider model. The way these spam filtering services work is that you feed them all the comment info and they return whether or not the comment is considered spam.

So I'll define an interface that has a Check method with all the comment info (useragent, ip, author, author email, author url and the actual comment).

public interface ISpamChecker
    {
        String ProviderName { get; set; }

        Boolean Check(int nodeid,
            string UserAgent, string UserIp, string Author,
            string AuthorEmail, string AuthorUrl, string Content);
    }

Next I'll add an abstract class that implements the new interface

public abstract class SpamChecker: ISpamChecker
    {
        #region ISpamChecker Members

        private string m_providername;
        public string ProviderName
        {
            get { return m_providername; }
            set { m_providername = value; }
        }

        public virtual bool Check(
            int nodeid, string UserAgent, string UserIp,
            string Author, string AuthorEmail, string AuthorUrl, string Content)
        {
            return false;
        }

        #endregion
    }

And then I'll add the actual Akismet spam checker class (that inherits from the abstract class and overrides the check method). There's allready an open source .net wrapper for the Akistmet service so I'll make use of that.

 

public class AkismetSpamChecker: SpamChecker   {      

       public AkismetSpamChecker()
       {
           this.ProviderName = "Akismet";
       }

       public override Boolean Check(int nodeid,
           string UserAgent, string UserIp, string Author,
           string AuthorEmail, string AuthorUrl, string Content)
       {

           umbraco.presentation.nodeFactory.Node blog =
               new umbraco.presentation.nodeFactory.Node(nodeid);

           while (blog.NodeTypeAlias != "Blog")
           {
               blog = blog.Parent;
           }

           if (blog.GetProperty("akismetAPIKey").Value != string.Empty)
           {               
               Akismet api = new Joel.Net.Akismet(
                   blog.GetProperty("akismetAPIKey").Value,
                   "http://" + HttpContext.Current.Request.ServerVariables["HTTP_HOST"] + blog.Url,
                   "Blog4Umbraco2");

               if (!api.VerifyKey())
               {
                   umbraco.BusinessLogic.Log.Add(
                       umbraco.BusinessLogic.LogTypes.Error,
                       -1,
                       "Akismet Key could not be verified, please check if you have a valid Akismet API Key");

                   return false;
               };

               AkismetComment comment = new AkismetComment();
               comment.UserAgent = UserAgent;
               comment.UserIp = UserIp;
               comment.CommentType = "comment";
               comment.CommentAuthor = Author;
               comment.CommentAuthorEmail = AuthorEmail;
               comment.CommentAuthorUrl = AuthorUrl;
               comment.CommentContent = Content;

               return api.CommentCheck(comment);
           }
           else
           {
               return false;
           }
       }

   }

 

So in the check method I'll first see if we have a valid API key (using the nodefactory to get it of the blog document), if that's ok I'll return the value of the CommentCheck function.

The final step is to actually call this check method when a new comment is submitted.

Since we want to make it possible to plug in your own spam checker I'll add a little config file.

<?xml version="1.0"?>
<SpamChecker assembly="/bin/Umlaut.Umb.Blog" type="Umlaut.Umb.Blog.Spam.AkismetSpamChecker">
</SpamChecker>

 

That contains the assembly and the type of the spam checker class that will be used (default we'll use the Akismet one).

By using some reflection we'll call the Check method on the correct Type (that's setup in the config file).

bool isspam = false;

           try
           {
               string assemblyFile =
                   HttpContext.Current.Server.MapPath(
                   String.Format("{0}/..{1}.dll",
                   GlobalSettings.Path,
                   Config.GetProviderAssembly()));

               Assembly checkerAssembly = Assembly.LoadFrom(assemblyFile);

               SpamChecker checker =
                   (SpamChecker)Activator.CreateInstance(
                   checkerAssembly.GetType(Config.GetProviderType()));

               isspam = checker.Check(parentId,
                   post.UserAgent, post.UserHostAddress,
                   name, email, website, comment);
           }
           catch (Exception ex) { }

And we'll update the insert statement from yesterdays chapter to store the value of isspam instead of always storing false.

That's it, our comments will now by checked by Akismet and if they are seen as spam they won't appear on the blog (since we only display the comments that aren't flagged as spam).

Blog 4 umbraco 2.0.5 – Comments

Monday, December 07, 2009 by Tim Geyssens

Today we'll make an improvement to blog 4 umbraco that shouldn't have any impact on the frontend of the blog but will make it much easier to handle comment spam and moderate comments. We'll move away from storing the comments as documents and store them in a database table instead. We'll fetch them with some xslt extensions (haven't heard of xslt extensions, be sure to check out the umbraco.tv chapter /documentation/videos/for-developers/xslt-extensions/introduction-to-xslt-extensions)

First

The first step is to create this new table, we'll need to store the post id, the actual comment (name, email, website, comment), the timestamp and we'll also add a spam field.

CREATE TABLE [Comment](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [blogid] [int] NOT NULL,
    [postid] [int] NOT NULL,
    [name] [nvarchar](250) NULL,
    [email] [nvarchar](250) NULL,
    [website] [nvarchar](250) NULL,
    [comment] [text] NULL,
    [spam] [bit] NULL,
    [created] [datetime] NULL,
CONSTRAINT [PK_Comment] PRIMARY KEY CLUSTERED
(
    [id] ASC
)

(this is the sql server create script, we'll also include a vistadb and mysql create script in the installer)

Storing comments

Instead of creating a comment document with the umbraco api we'll update the method to insert a record in the new table using the umbraco datalayer (to make sure this can be executed on sql server, vistadb and mysql)

ISqlHelper SqlHelper = DataLayerHelper.CreateSqlHelper(umbraco.GlobalSettings.DbDSN);
            SqlHelper.ExecuteNonQuery(
                @"insert into Comment(blogid,postid,name,email,website,comment,spam,created)
                    values(@blogid,@postid,@name,@email,@website,@comment,@spam,@created)",
                 SqlHelper.CreateParameter("@blogid", blogid),
                SqlHelper.CreateParameter("@postid", blogpost.Id),
                SqlHelper.CreateParameter("@name", name),
                SqlHelper.CreateParameter("@email", email),
                SqlHelper.CreateParameter("@website", website),
                SqlHelper.CreateParameter("@comment", comment),
                SqlHelper.CreateParameter("@spam", false),
                SqlHelper.CreateParameter("@created", DateTime.Now));

Showing comments

For showing the comments we'll add some new methods to our blog xslt extensions. Basicly I want to select all comments or select the comment for a specific post. So I'll need a GetComments() method and a GetCommentsForBlog(int id) method. Both will return some xml (XPathNodeIterator) that will look like this:

<comments>

<comment id="2" postid="1206" created="7/12/2009 16:22:28">

<name>Tim Geyssens</name>

<email>myemail@domain.com</email>

<website>http://www.umbraco.org</website>

<message>This should be stored in the database</message>

</comment>

</comments>

We'll also use the umbraco datalayer to execute these queries and we'll add a method that creates the comment xml from a RecordsReader.

public static XPathNodeIterator GetCommentsForPost(int id)
      {

          ISqlHelper SqlHelper = DataLayerHelper.CreateSqlHelper(umbraco.GlobalSettings.DbDSN);
          IRecordsReader rr = SqlHelper.ExecuteReader(
              "select * from comment where postid = @postid and spam != 1",
               SqlHelper.CreateParameter("@postid", id));

          return CommentsToXml(rr);
      }

 

private static XPathNodeIterator CommentsToXml(IRecordsReader rr)
        {
            XmlDocument xd = new XmlDocument();

            XmlNode x = umbraco.xmlHelper.addTextNode(xd, "comments", "");

            while (rr.Read())
            {
                XmlNode c = xd.CreateElement("comment");

                c.Attributes.Append(umbraco.xmlHelper.addAttribute(xd, "id", rr.GetInt("id").ToString()));
                c.Attributes.Append(umbraco.xmlHelper.addAttribute(xd, "postid", rr.GetInt("postid").ToString()));
                c.Attributes.Append(umbraco.xmlHelper.addAttribute(xd, "created", rr.GetDateTime("created").ToString()));

                c.AppendChild(umbraco.xmlHelper.addCDataNode(xd, "name", rr.GetString("name")));
                c.AppendChild(umbraco.xmlHelper.addCDataNode(xd, "email", rr.GetString("email")));
                c.AppendChild(umbraco.xmlHelper.addCDataNode(xd, "website", rr.GetString("website")));
                c.AppendChild(umbraco.xmlHelper.addCDataNode(xd, "message", rr.GetString("comment")));

                x.AppendChild(c);
            }

            xd.AppendChild(x);

            return xd.CreateNavigator().Select(".");
        }

 

With the new xslt extensions in place we'll just need to update our xslt to fetch the comments from these.

So this is how the list comments xslt will look after the update:

<h3 id="comments">
<xsl:value-of select="count(BlogLibrary:GetCommentsForPost($currentPage/@id)//comment)"/> comment(s)  for  &#8220;<xsl:value-of select="$currentPage/@nodeName"/>&#8221;</h3>

<ol class="commentlist">
<xsl:for-each select="BlogLibrary:GetCommentsForPost($currentPage/@id)//comment">

<li class="alt" id="comment-{@id}">
<div class="commentcontent">
    <div class="commentgravatar" style="float:right;margin-right: 5px;">
        <img width="40px" height="40px" src="{BlogLibrary:getGravatar(./email, 40, '')}" alt="Gravatar of {./name}"/>
    </div>
    <cite>  <xsl:value-of select="./name"/> </cite> Says: <br />
    <small class="commentmetadata"><xsl:value-of select="umbraco.library:LongDate(@created)"/> </small>
    <xsl:value-of select="umbraco.library:ReplaceLineBreaks(./message)" disable-output-escaping="yes"/>
</div>

</li>
</xsl:for-each>
</ol>

That's it, the blog comments are now stored/fetched from a table instead of using documents.

Blog 4 umbraco 2.0.4 – Rss-feeds

Friday, December 04, 2009 by Tim Geyssens

Today we'll look at improving the blog rss-feed(s), the magic words are xslt, alternative templates and some url rewriting .Currently the blog4umbraco package comes with a single rss-feed that just lists the xth latest blog posts. We'll be improving that so as an end result we'll have:

  • Latest posts rss feed
  • Latest posts rss feed for each tag
  • Comments rss feed
  • Comments rss feed for each post

Basicly the rss feed is an alternative template that's applied to the blog homepage(by adding the template alias 'rss' to the url) . And that template contains a single xslt macro that outputs the rss-feed in the correct format (the rss feed is one of the templates you can start your xslt with).

image

A small update that I'll tackle first it to update the SiteURL variable from a static value to a dynamic one by fetching the current host from the HTTP_HOST server variable.

<xsl:variable name="SiteURL" select="concat(' http://',string(umbraco.library:RequestServerVariables('HTTP_HOST')))"/>

Latest posts rss feed for each tag

In order to have an rss feed for each tag, we'll just have to update the code that selects the blogposts and only show the blogposts that contain the supplied tag. If there isn't a tag supplied (we'll use the request param tag, so /rss.aspx?tag=xmas) we still display all blogposts. So we'll first check if the request param tag is available, if it isn't we select all blogposts (like it should allready do) and if there is a tag supplied we'll filter the blog posts to only select the ones containing that tag.

<xsl:choose>
        <xsl:when test="string-length(umbraco.library:Request('tag')) &gt; 0">
            <xsl:apply-templates select="$currentPage//node [@nodeTypeAlias = 'BlogPost' and contains(Exslt.ExsltStrings:lowercase(./data [@alias='tags']), Exslt.ExsltStrings:lowercase(umbraco.library:Request('tag')))]">
                      <xsl:sort select="@createDate" order="descending" />
                    </xsl:apply-templates>
        </xsl:when>
        <xsl:otherwise>
            <xsl:apply-templates select="$currentPage//node [@nodeTypeAlias = 'BlogPost']">
                      <xsl:sort select="@createDate" order="descending" />
                    </xsl:apply-templates>
        </xsl:otherwise>
    </xsl:choose>

We'll make this have a nicer url by adding a url rewriting rule to the /config/UrlRewriting.config file. So we'll go from /rss?tag=xmas to /rss/tags/xmas.

<add name="rsstagrewrite"
    virtualUrl="^~/blog/rss/tags/(.*).aspx"
    rewriteUrlParameter="ExcludeFromClientQueryString"
    destinationUrl="~/blog/rss.aspx?tag=$1"
    ignoreCase="true" />

Comments rss feed

For the comments rss feed we'll also be able to re-use most of the main xslt we'll just need to know if we need to output a comments feed instead of a blog post feed (since we have to select different documents and these have a different structure). So I'll add a parameter to the blog rss macro called 'iscommentfeed'.

image

And I'll also create a new template called 'CommentRss'. This will be used in the same way as the Rss template (as an alternative template). The only difference between the 2 will be the value of the iscommentfeed parameter.

So I'll first update the blog rss macro to include the iscommentfeed variable

<xsl:variable name="iscommentfeed" select="//macro/iscommentfeed" />

And then prior to selecting the BlogPosts I'll check the value of the iscommentfeed variable. In case the value is 1 we'll need to select the comments instead of the posts.

<xsl:when test="$iscommentfeed = '1'">

            <xsl:apply-templates select="$currentPage//node [@nodeTypeAlias = 'BlogPostComment']">
                      <xsl:sort select="@createDate" order="descending" />
                    </xsl:apply-templates>

        </xsl:when>

I'll also have to update the xslt code that outputs the rss items. Since the post and comments will have a different url and a differen structure (content of a post is stored in the bodyText property, content of a comment in the comment property).

<xsl:variable name="link">
        <xsl:choose>
            <xsl:when test="@nodeTypeAlias = 'BlogPostComment'">
                <xsl:value-of select="concat(umbraco.library:NiceUrl(./../@id),'#comment-',@id)"/>
            </xsl:when>
            <xsl:otherwise>
                 <xsl:value-of select="umbraco.library:NiceUrl(@id)"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:variable>
    <xsl:variable name="content">
        <xsl:choose>
            <xsl:when test="@nodeTypeAlias = 'BlogPostComment'">
                 <xsl:value-of select="umbraco.library:ReplaceLineBreaks(data [@alias = 'comment'])"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="./data [@alias='bodyText']"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:variable>

Comments rss feed for each post

For making a comments rss feed for each post I won't have to change anything to the xslt. Since I select all the comments found below the currentPage ($currentPage//node [@nodeTypeAlias = 'BlogPostComment']).

So when calling the commentsrss template on the main blog page (blog/commentrss.aspx), we'll list all comments but when calling the template on a specific post ( blog/2009/12/3/xmaspost/commentrss.aspx) we'll only get the comments for that post.

Final touches

The last thing we'll do is update the xslt file that's responsible for outputting the rss feed link.

In case we are viewing the posts of a certain tag we'll need to add a link to the rss feed for that tag (/rss/tags/xmas.aspx).

<xsl:if test="string-length(umbraco.library:Request('filterby')) &gt; 0">
    <link href="{umbraco.library:Replace(umbraco.library:NiceUrl($currentPage/ancestor-or-self::node [@nodeTypeAlias = 'Blog']/@id),'.aspx',concat('/rss/tags/',umbraco.library:Request('filterby'),'.aspx'))}" rel="alternate" type="application/rss+xml" title="RSS Feed for tag {umbraco.library:Request('filterby')}" />
</xsl:if>

And we'll also need to show a link to the comments rss feed (wich is an alternative template of the blog called commentrss)

<link href="{umbraco.library:Replace(umbraco.library:NiceUrl($currentPage/ancestor-or-self::node [@nodeTypeAlias = 'Blog']/@id),'.aspx','/commentrss.aspx')}" rel="alternate" type="application/rss+xml" title="Comments RSS Feed" />

And if we are on a blog post  (we can check that with the nodetypealias) we'll also add a link to the comments feed for that specific blog post.

<xsl:if test="$currentPage/@nodeTypeAlias = 'BlogPost'">
    <link href="{umbraco.library:Replace(umbraco.library:NiceUrl($currentPage/@id),'.aspx','/commentrss.aspx')}" rel="alternate" type="application/rss+xml" title="Comments RSS Feed for {$currentPage/@nodeName}" />
</xsl:if>

The result

When on the main blog page, we'll have the main rss feed and the comments rss feed

image

On a post we'll also have the comments feed for that post

image

And when viewing the posts for a certain tag …

image

Blog 4 umbraco 2.0.3 – Ajax Comment Form

Thursday, December 03, 2009 by Per Ploug Hansen

While Niels is tinkering with the client part of the skinning, I thought I would go back to web developement basics and do some old-fashion Html and javascript.

The current blog comment form is a bit dated, and lacks some polish. I decided to rewrite it, to first of all get some cleaner html, but also to add the following details:

  • Nice clean validation with jquery.validation
  • ajax form posting
  • Gravatar preview "as you type"
  • Compatibility for screen-readers

The plan is to:

  1. Create the server-side logic that creates the comment
  2. Connect that logic to the client, using /base
  3. Do simpel form markup, no runat="server" attributes
  4. Write some simpel jquery to post values to /base
  5. prettify the form
  6. Make it work without javascript

The server-side logic:

For this I created a simple static method with a single parameter, the ID of the blog post. It creates a comment and fills in the different properties: email, name, comment etc.

The way it receives input is through the HttpContext request collection, those who remember Asp 3.0 classic will recognise this approach, so no view-state hell. I've added the entire method below. It contains a couple of comments to guide you. The main points are:

  1. Get values from HttpContext request collection
  2. Check they are valid
  3. Test the blog post exists and it's the right content type
  4. Create the document and fill in the properties
  5. Save and publish
  6. Return the ID of the page created

public static int CreateComment(int parentId)
{

//here we find form values posted to the current page
    HttpRequest post = HttpContext.Current.Request;
    string email = post["email"];
    string comment = post["comment"];
    string name = post["name"];
    string website = post["website"];


    //if all values are there + valid email.. we start to create the comment
    if (!string.IsNullOrEmpty(email) && isValidEmail(email) && !string.IsNullOrEmpty(comment) && !string.IsNullOrEmpty(name))
    {

        Document blogpost = new Document(parentId);

        //if parent is actually a blogpost
        if(blogpost != null && blogpost.ContentType.Alias == "BlogPost"){
            DocumentType dt = DocumentType.GetByAlias("BlogPostComment");
            Document d = Document.MakeNew("RE: " + blogpost.Text + " by: " + name, dt, new umbraco.BusinessLogic.User(0), blogpost.Id);
            d.getProperty("comment").Value = comment;
            d.getProperty("email").Value = email;
            d.getProperty("name").Value = name;
            d.getProperty("website").Value = website;
            d.Save();
            d.Publish(new umbraco.BusinessLogic.User(0));

            umbraco.library.UpdateDocumentCache(d.Id);
            return d.Id;
        }
    }


    //if nothing gets created, we return zero
    return 0;
}

Connecting the serverside logic to the client

Now that we have some code that can create the comment, we want to make it accessible directly from the browser. For that we use the built in /base, which in short works as an automatic proxy between server-side code and the browser by creating urls that can execute this server side code.

The connection happens in the file /config/restExtensions.config

In here we map the dll Umlaut.Umb.Blog.dll in a <ext> element, add a nice alias, and then add the method CreateComment to the manifest as well:

<ext assembly="/bin/Umlaut.Umb.Blog" type="Umlaut.Umb.Blog.Library.Base" alias="Blog4Umbraco">
    <permission method="CreateComment" returnXml="false" allowAll="true" />
</ext>

this means that we can now invoke the method by going to the url /base/Blog4Umbraco/CreateComment/[pageId].aspx we will use this later when jquery will post the form.

Form markup

The great about doing the form without any asp.net controls is that you rediscover how simple and great html actually is. Install the blog package from: http://nightly.umbraco.org/Blog4Umbraco/2.0.3/ and view the /usercontrols/ajaxcommentform.ascx to see the full markup.

The below sample is the markup for a single field:

<p class="commentField emailField">
    <label for="tb_email" class="fieldLabel">
        <%= Umlaut.Umb.Blog.BlogLibrary.Dictionary("#Email","Email address") %>:
    </label>
    <input type="text" id="tb_email" name="email" class="input-text required email" />
</p>

Things to notice: We have dictionary support for labels (first parameter is the key, and the second is the value to return if the key doesn't exist), and we use jquery.validation for validating the form on the client. We do this by adding the classes "required" and "email" to this field. Which ensures that the field is filled out and is a correct email.

Post values to /base url with jQuery

Finally, the core functionality! When the form has been filled out we want to post it with ajax to the /base url, which will handle the comment creation. We do this with jQuery.Post

var url = "/base/Blog4Umbraco/CreateComment/<umbraco:Item field="pageID" runat="server"/>.aspx";

jQuery.post(url, { name: jQuery("#tb_name").val(), email: jQuery("#tb_email").val(), website: jQuery("#tb_website").val(), comment: jQuery("#ta_comment").val() },
                   function(data){
                     jQuery("#commentPosted").show();
                   }
                   });

First we build a url variable. As you ca see it points to /base/Blog4Umbraco/CreateComment/ and we then insert the current page Id on the server side. jQuery then posts a collection of values (email,name,etc) to the /base url. and displays some feedback.

Presto, we have an ajax form.

Prettify

While we are at it, we'll also add a gravatar preview, so when you enter your email, you will see your gravatar image to the right:

image

This is also done with jquery and /base:

jQuery("#tb_email").blur(function(){
                var email = jQuery("#tb_email").val();
                if(email != ""){
                    var url = "/base/Blog4Umbraco/GetGravatarImage/" + email + "/80.aspx";
                    jQuery.get(url, function(data){
                        if(data != ""){
                             jQuery("#gravatar").css( "background-image","url(" + data + ")" ).show();
                        }else{
                            jQuery("#gravatar").hide();
                        }
                    });
                }
          });

Again, we send simple request to a /base method, this time with 2 parameters, email and image size. The call returns a url to the gravatar image associated with the email.

Make it work without javascript

The great thing about having the form as an ajax form is that automated comment spam doesn't get through. However, neither does people using screenreaders. To ensure that screenreaders can use the form, we need to ensure that it works with javascript turned off. Luckily, we already have the serverside code that expects a collection of values in the Request collection. And when javascript is turned off, the form will post back to it's own url, due to the standard asp.net form. This means that we can execute the /base serverside logic on the page load event in the AjaxCommentForm.ascx like this:

protected void Page_Load(object sender, EventArgs e)
        {
            if (Page.IsPostBack)
            {
                Library.Base.CreateComment(umbraco.presentation.nodeFactory.Node.GetCurrent().Id);
            }
        }

Notice it is the exact same method, it uses the request collection so it works no matter if its executed when a form is post to a /base url, or if the form is post to the page with the macro on.

More

There has just been posted 2 videos to umbraco.tv about umbraco /base and a video walkthrough of the code explained above. So to get even more info on how to do ajax and umbraco, go to:

http://umbraco.tv/documentation/videos/for-developers/base-and-ajax-development

Also, the code is on codeplex: http://blog4umbraco.codeplex.com/ and as a nightly build: http://nightly.umbraco.org/Blog4Umbraco/2.0.3/

Blog 4 Umbraco 2.0.2 – skinning

Wednesday, December 02, 2009 by Niels Hartvig

My challenge today was to come up with a way to provide easier skinning for the blog4umbraco package. Today there's several challenges if you want to get up to speed fast with the current blog4umbraco package:

  • The default skin is old
  • There are layout quirks (such as the comment form doesn't align - yikes!)
  • Alternative skins for blog4umbraco are scattered and there's no conventions
  • Changing a skin requires good knowledge of Umbraco terms such as doctypes, templates and macros. Not easy to get started

The problems above is not unique to blog4umbraco, but a general thing with Umbraco as we like to see ourselves as a framework. This - however - shouldn't prevent us from making it easier to get quickly up to speed for newcomers. And as most people know, once you got something that you can relate to, it's more motivating to dive in.

Bring in the skin

The solution is to create a convention for skins that in the current project benefits blog4umbraco, but over time could benefit other projects such as Warren Buckleys Creative Website Wizard, Runway and the hot new Business Website Starter Pack.

As I'm a fan of keeping things simple and to the point and as we're talking simple skinning (not fancy theming) I decided to keep skins CSS+images only. If the markup is cool, the possibilities with CSS alone is incredible and for more fancy stuff we have the package format to take care of that. So without further ado, let me introduce the new Skin format for Umbraco packages:

What is a skin?

Skins for Umbraco is a zip file containing CSS + images as well as a manifest, a thumbnail and a preview image.

The structure of the zip must be:

  • /thumbnail.png (a 100x100 pixel thumbnail in png format)
  • /preview.png (a 500xYYY pixel preview in png format)
  • /skin.xml (a manifest file containing meta data about you and your skin. See example skin.xml and grab the XSD for Visual Studio intellisense)
  • /css/style.css (your css file. Must be named 'style.css')
  • /css/images/* (images for your css)

User experience

The idea is to host skins in the package repository and make them relate to a specific project. That project can include a new datatype (Skin Browser) which gets configured with some help text as well as a URI that acts as the identifier to fetch skins from the repository. To use skinning in a package all you need to do (once you've got your project approved in the package repo by the evil Umbraco HQ) is to place the Skin Browser data type on the root page of your package content:

umbraco

The skin browser will show you the current skin used and will store the reference to the css file (ie. /css/pixel/style.css). This can easily be used in templates by using the recursive option when inserting an Umbraco field: <umbraco:Item runat="server" id="skin" Field="css" recursive="true" />

When clicking the "Browse skins from Umbraco Package Server" it'll query the repository for a list of skins that matches the project:

chooseSkin

When clicking on the "Use this skin" link, it'll download the skin, extract it and update the css reference (the value of the "Skin Browser" property). When you publish the page you'll then use the new skin.

Nice Balsamiq Mockups - is this vapor?

Well, ehm. The Christmas Calendar manifest say that we can't use more than an hour a day. I've spend three in total (which will make it up for the coming Saturday and Sunday) and managed to make the concept, mockups and formats. But not the datatype - that'll have to wait for one of the coming days. But I did manage to build the server part as well as the submit skin functionality which made me positively surprised of the development speed I gain from Umbraco (nice plug, aye ;-) - but bear with me, I almost don't do implementations anymore).

On our package repository - which runs Umbraco of course - I created a "skins" document type which will be the placeholder for a project (such as "blog4umbraco") as well as a "skin" document type that holds all the metadata:

Picture 15

Using XSLT it was really easy to make a feed that the coming data type can use to fetch the different skins (see the XSLT here) and using alternative templates I can now fetch the list of skins by calling the URL of the project in the repository combined with the alias of my listing template "getskinsasxml":

http://packages.umbraco.org/skins/blog4umbraco/getskinsasxml

Uploading a new skin

I also managed to make a nice little usercontrol that lets you upload your skin (the zip file) and then extract all the meta data and create a new skin as a content object. Using notifications in Umbraco it'll automatically notify moderators to review the submitted skin before publishing it (and thus, making it publicly available in the feed). Again I used alternative templates to make it easy to know which project to associate the uploaded item for. I simply append "uploadskin" to the url and then I know that the current page is the correct skin:

http://packages.umbraco.org/skins/blog4umbraco/uploadskin

One important thing when using alternative templates for something like this that you're responsible for verifying that the alternative template is used on the appropriate type (as alternative templates bypasses the template rules on a doctype). To do this I added a simple check in the Page Load event where I use the nodefactory to verify that the current page indeed has a document type of "skins" (ie. our project placeholder type):

if (Node.GetCurrent().NodeTypeAlias.ToLower() != "skins")
{
    throw new Exception("Can only upload skins to skin repositories");
}

So now we got the skinning infrastructure in place. All we need to do next is building the custom data type using the AbstractDataEditor which makes it easy to build a configurable custom data type as opposed to just using the User Control Wrapper data type which makes it super easy to build a custom data type, but doesn't support configuration.

We also need to look at the markup for the blog4umbraco templates to see if it's as good as it should be. If anyone wants to help with that or help making skins - let us know!

Merry Christmas :)


Brilliant umbraco hosting provided by FAB-IT