We’ve all done it, you’ve run into a problem while developing which you bash at for a few hours and before you know it, you’ve lost the day, not got anywhere and feel completely frustrated. What’s more, is it’s usually something so screamingly obvious and/or simple that you just know you’ll find the answer on Google.
Rather than pulling your hair out for hours on end, there’s a rather simple rule-of-thumb that you should follow:
Spend no more than 15-30 minutes trying to fix the issue yourself (don’t forget to check Google for the answer!). If you’ve not found the answer after 30 minutes, “ask a friend” and walk away.
If you’re able to bash at it for 30 minutes without feeling you’re getting any closer, you’re probably looking at it from the wrong direction and having someone else’s perspective on the problem will probably answer it within seconds. By walking away from the problem you’re also taking away the pressure and you’ll often find the solution comes to you.
Another advantage of putting a time limit on the issue is it avoids you losing the day and should also mean you’ve explored Google and the lists so when you ask your “friend”, it should stop you getting that annoying lmgtfy response when asking for help (it’s a similar concept to the “wait 1 minute before sending” facility within Outlook).
So the next time you realise something’s taking longer than you think it should, start the timer!
I thought seeing as uCommerce is now an actual product I would start to overview an install/configuration of uCommerce assuming no prior knowledge of uCommerce. Firstly, let me start of by saying that once you've got your head around uCommerce and some of it's complexities, you'll find it a fantastic product that makes creating a new ecommerce website as easy as setting up a standard Umbraco website. It is still missing a few features, but you can easily work around these with a bit of custom XSLT/C#.
Ok, back to setting up your first uCommerce website. I've grouped these into what I feel are logical sections but if I've missed something, please let me know.
1. Install the uCommerce PackageIf you've not already done so, go to the uCommerce Download page and download the uCommerce package (at time of writing, I'm using 1.0.4.2) and then download the uCommerce Store package (currently 1.0.1.2).
Install the uCommerce package as you do any other package in Umbraco. Once installed you'll be able to install the store package.
Assuming all your permissions on your Umbraco install are correct, refresh your browser and you should have a new section "Commerce". If they're not right, you'll be told to add a few web.config settings.
2. Wire up the catalogThis is the step that I didn’t “do” when we first got started and it turns out it’s one of the most important steps as it joins the uCommerce catalog to the front end.
A “Product Definition” is uCommerce’s concept of document types, it allows you to add additional information to the product. If you’re using the uCommerce starter store, you’ll get a couple of product definitions out of the box –software and support. At the moment, you can't add additional properties through the uCommerce back end (i.e. if you wanted to add additional information such as Meta Keywords/Descriptions etc -I'll cover how we got around this in a later post) but there are a number of default the category/product properties (I've put their XML reference in brackets where relevant):
uCommerce Category PropertiesThe default XML looks like this:
<category parentCategoryId="" parentCategoryName="" index="0" id="67" name="Software" displayName="Software" displayOnSite="True" description="" image="" /> uCommerce Product PropertiesThe default XML looks like this (the variants are not standard but are there because they're setup as part of the store package):
<product index="0" sku="100-000-001" displayName="uCommerce 1.0 RTM" shortDescription="uCommerce is a full featured e-commerce platform with content management features powered by Umbraco. Everything you need to build a killer e-commerce solution for your clients!" longDescription="uCommerce is fully integrated with the content management system Umbraco, which provides not only the frontend renderendering enabling you to create beautifully designed stores, but also the back office capabilities where you configure and cuztomize the store to your liking.

uCommerce_ foundations provide the basis for an e-commerce solution. Each foundation addresses a specific need for providing a full e-commerce solution to your clients. foundations in the box include a Catalog Foundation, a Transactions Foundation, and an Analytics Foundation.

Each of the foundations within uCommerce_ are fully configurable right in Umbraco. No need to switch between a multitude of tools to manage your stores. It's all available as you would expect in one convenient location." thumbnailImage="1097" primaryImage="1097" allowOrdering="True" isVariant="False" displayOnSite="True" hasVariants="True" price="3495.0000" currency="EUR"> <variants> <product index="0" sku="100-000-001" displayName="Developer Edition" shortDescription="" longDescription="" thumbnailImage="0" primaryImage="0" allowOrdering="False" isVariant="True" displayOnSite="False" hasVariants="False" variantSku="001" price="0.0000" currency="EUR" Downloadable="on" License="Dev" /> <product index="1" sku="100-000-001" displayName="30 Days Evaluation" shortDescription="" longDescription="" thumbnailImage="0" primaryImage="0" allowOrdering="False" isVariant="True" displayOnSite="False" hasVariants="False" variantSku="002" price="3495.0000" currency="EUR" Downloadable="on" License="Eval" /> <product index="2" sku="100-000-001" displayName="Go-Live" shortDescription="" longDescription="" thumbnailImage="0" primaryImage="0" allowOrdering="False" isVariant="True" displayOnSite="False" hasVariants="False" variantSku="003" price="3495.0000" currency="EUR" Downloadable="on" License="Live" /> </variants> </product>Adding additional product properties is simple.
Now, you may be thinking that using that set of data types is a little limiting for something like "Size" or "Colour" and you might want to display something a little more flexible to the user -such as a drop down list. This is easy enough:
Note: At the moment, the enum values cannot be re-ordered through the UI so make sure you add them in the order you want them in the editor!
5. Load Your CatalogOnce you've finished creating your various product types, it's time to create your catalog. Creating categories and products within uCommerce is as simple as creating pages in Umbraco. Using the same right click menu concept you can create nested categories as deep as your catalog requires. You can add products and categories at any level by choosing either the "Category" or "Product" radio button and choosing your product type.
6. You're Done!Assuming you've followed the steps above, you should now have a (fairly basic) store setup. Go to your site's homepage and click the "uCommerce" menu item and voila, your categories and products should be listed.
Not getting the categories you were expecting? Perform the helpful xsl “copy-of” trick within either the "RootCategories[XSLT].xslt" file or "Category[XSLT].xslt" file:
<pre><xsl:copy-of select="$categories" /></pre>and then have a look at the output:
<errors><error>No product catalog group found supporting the current URL.</error></errors>If you're getting the above error, currently (and this may be a misunderstanding/changed later) you have to have the catalog and catalogue group names the same –in the example site, they’re both “uCommerce”.
As I think the concept store offered with Software/Support isn't particularly real-world, I'm going to work on creating a basic store that you can use to better understand uCommerce and it's intricacies.
Check back soon as I'll be posting an overview of the checkout process, the various XSLT files and integrating payment gateways into uCommerce (initially SagePay, PayPoint, WorldPay and PayPal).
Ever needed to take a large list and split it into smaller subsets of data for processing? Well this is the Extension Method for you. Tonight we had to split a small dataset (500 items) into even smaller sets of 10 so the provider’s web service wouldn’t timeout.
Seeing as I was going to miss out on my evening, I thought I’d see if I could do it a little differently using Linq and this is what I came up with:
/// <summary> /// Simple method to chunk a source IEnumerable into smaller (more manageable) lists /// </summary> /// <param name="source">The large IEnumerable to split</param> /// <param name="chunkSize">The maximum number of items each subset should contain</param> /// <returns>An IEnumerable of the original source IEnumerable in bite size chunks</returns> public static IEnumerable<IEnumerable<TSource>> ChunkData<TSource>(this IEnumerable<TSource> source, int chunkSize) { for (int i = 0; i < source.Count(); i += chunkSize) yield return source.Skip(i).Take(chunkSize); }It should extend any IEnumerable and allow you to split it into smaller chunks which you can then process to your heart’s content.
Here’s a quick example of it in use:
var list = new List<string>() { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5", "Item 6", "Item 7", "Item 8", "Item 9", "Item 10" }; Console.WriteLine("Original list is {0} items", list.Count); var chunked = list.ChunkData(3); Console.WriteLine("Returned the data in {0} subsets", chunked.Count()); int i = 1; foreach (var subset in chunked) { Console.WriteLine("{0} items are in subset #{1}", subset.Count(), i++); int si = 1; foreach (var s in subset) Console.WriteLine("\t\tItem #{0}: {1}", si++, s); }And this will output
Original list is 10 items Returned the data in 4 subsets 3 items are in subset #1 Item #1: Item 1 Item #2: Item 2 Item #3: Item 3 3 items are in subset #2 Item #1: Item 4 Item #2: Item 5 Item #3: Item 6 3 items are in subset #3 Item #1: Item 7 Item #2: Item 8 Item #3: Item 9 1 items are in subset #4 Item #1: Item 102 lines of code to do all that work -Neat
Note: This information is also posted on the Umbraco Wiki
See also: ismailmayat.wordpress.com/.../
Note: RespositoryAttribute is used to identify a distinct configuration for your unique package/assembly it can be any value you wish but try to avoid conflicts.
By specifiying watch=true in the XmlConfigurator attribute you can modify the logging config during development and it will be automatically reloaded without causing an application restart.
A simple configuration file could be as follows:
<?xml version="1.0" encoding="utf-8" ?> <log4net> <appender name="R" type="log4net.Appender.RollingFileAppender"> <file value="${TEMP}/myPackage.log" /> <appendToFile value="true" /> <maximumFileSize value="1000KB" /> <maxSizeRollBackups value="2" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%level %thread %logger - %message%newline" /> </layout> </appender> <root> <level value="DEBUG" /> <appender-ref ref="R" /> </root> </log4net>The above logs to a file in your system tmp directory - The file is rotated once it reaches 1 MB and the last two versions are maintained. Log4net can log to XML files, databases, email etc and you can define different loggers for different classes and different log targets for different levels of logging. See log4net Manual - Configuration for more details.
In your package classes add a logger declaration, for example:
using System; using umbraco.BusinessLogic; using log4net; using System.Reflection; namespace Umb.Log4Net { public class Class1 : ApplicationBase { private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); public Class1() { log.Debug("application starting up"); } } }Note: When releasing Umbraco packages you may want to set your logging levels to NONE or FATAL to stop DEBUG information being logged.
I recently blogged a screencast which demonstrated integration of Microsoft Workflow foundation into Umbraco. Happily, response was positive and I've had a few questions about when it will be available as a package.
To set expectations, the short answer is that it won't.
The implementation I put together works well for a client of mine as well as my own site, but the effort involved in documenting and polishing it so that it could be released as a package isn't insignificant.
On top of that my prototype is based on workflow foundation 3 and MS have now released version 4. There is no backward compatibility and the new version is for .net 4. When you start to throw past present and future versions of Umbraco into the equation you start to come up with silly exponential sums when working out how many versions would need to be maintained.
So, no package I'm afraid.
However: If you'd like to implement workflow in Umbraco and would like to sponsor the project it could happen. Feel free to get in touch and we can talk it through.
During the discussion after my talk at Barcamp Brighton 4, several people wanted a place where they could publically swap ideas, in the hope that someone would pick them up and develop them. This came from Danny Hope’s experience where he described a CSS comment stripping service on his Flickr, and David Stone then built it for him.
As a developer, I like short projects I can build for a fun break from client work, and it looks like I’m not alone in that.
As a starting place for people to talk about ideas, I’ve opened this Google Group – http://groups.google.com/group/thoughtpipe – where people can start talking about their ideas. Please join up and put your oar in.
The inspiration for my small projects was the 5K App competition, organised by John Montgomery and you can read about what I did here in my 5K app posts.
I’ll put some ideas in to the group in the next day or so to try to kick things off. If it sounds interesting to you, please subscribe and join in.