uWebshop 1.8.0.1 released + Upgrade packages from previous versions!

Earlier we launched uWebshop 1.8 with quite some nice new functionality.
As usual we try to release an update package from previous version as soon as possible.

Today we release a single update package from uWebshop 1.6.0.2 or uWebshop 1.7  to 1.8.0.1 as well as an update package from 1.8.0.0 to 1.8.0.1

As usual downloads can be found on the uWebshop our.umbraco page
(at the bottom)

WARNING: If you are not yet on 1.6.0.2 please use the previous update packages to get to 1.6.0.2 first!

New in version 1.8.0.1 (27 april 2012)

  • Tested with Umbraco 4.7.2
  • Changes to the default CustomerData control to allow customer to set their own password
  • Validation on SSWS_OrderOverview.ascx if stock isn’t empty
  • New setting: disableStockAndOrderdUpdates. This disables any updates to the catalog after a customer confirms it’s order.
  • Fixt an issue with stock
  • Various code optimalisations & Bug fixes

Not required manual updates to be done for 1.6.0.2 and 1.7.0.x and 1.8.0.0 users

Stock Validation

If you want to make use of the Stock Validation to disable people form submitting the order if there is not enough stock open the SSWS_OrderOverview.ascx file and add this validator line:

<asp:CustomValidator id="valItemsOutOfStock" runat="server" />

Manual updates to be done for 1.6.0.2 and 1.7.0.x users

Property Types

To update to this release you have to add some property types manually:

on the sswsPaymentProvider document type you can add the following properties on each shopAlias/Language tab:

Amount property
Name: #Amount
Alias: amount_ShopAlias (example: amount_NL or amount_SHOP)
Type: Textstring

VAT property
Name: #Tax
Alias:  taxPercentage_ShopAlias (example: taxPercentage_NL or taxPercentage_SHOP)
Type: SSWS – VAT Picker

on the sswsShippingProvider document type you can add the following property on each shopAlias/Language tab:

VAT property
Name: #Tax
Alias:  taxPercentage_ShopAlias (example: taxPercentage_NL or taxPercentage_SHOP)
Type: SSWS – VAT Picker

Scripts

We updated are .Base class quite a bit to allow the new text and imageId be added to each orderline. This requires new javascript. Use the code below to update your files accordingly:

ssws.js

/* UWEBSHOP CLASS */

if (typeof SuperSimpleWebshop === 'undefined') { var SuperSimpleWebshop = {}; }

(function () {

  /* UWEBSHOP PUBLIC METHODS */

  SuperSimpleWebshop.addUpdateOrderLine = function (shopAlias,pricingId, action, quantity, variants, text, imageId, success, error) {
    var params = [shopAlias,pricingId,action,quantity,variants, text, imageId], formData = null;
    return ssws_service.callBase('AddUpdateOrderLine', params, formData, success, error);
  };

  SuperSimpleWebshop.GetOrderForCurrentCustomer = function (shopAlias, success, error) {
    var params = [shopAlias], formData = null;
    return ssws_service.callBase('GetOrderForCurrentCustomer', params, formData, success, error);
  };

  SuperSimpleWebshop.getDictionaryItem = function (shopAlias,key, success, error) {
    var params = [shopAlias,key], formData = null;
    return ssws_service.callBase('GetDictionaryItem', params, formData, success, error);
  };

  SuperSimpleWebshop.GetJSONForCategory = function (shopAlias,CategoryId, success, error) {
    var params = [shopAlias,CategoryId], formData = null;
    return ssws_service.callBase('GetJSONForCategory', params, formData, success, error);
  };

  SuperSimpleWebshop.GetJSONForProduct = function (shopAlias,ProductId, success, error) {
    var params = [shopAlias,ProductId], formData = null;
    return ssws_service.callBase('GetJSONForProduct', params, formData, success, error);
  };

  SuperSimpleWebshop.GetJSONForPricing = function (shopAlias,PricingId, success, error) {
    var params = [shopAlias,PricingId], formData = null;
    return ssws_service.callBase('GetJSONForPricing', params, formData, success, error);
  };

  /* UWEBSHOP PRIVATE SERVICE OBJECT */

  var SuperSimpleWebshopService = function () {
    var superSimpleWebshopService = this;

    superSimpleWebshopService.callBase = function (methodName, args, data, success, error, dataType) {
      jQuery.ajax({
        type: 'POST',
        url: superSimpleWebshopService.createUrl(methodName, args),
        data: data,
        async: true,
        success: function (data, status, xmlHttpRequest) {
          if (success) {
            success(data);
          }
        },
        error: function(xmlHttpRequest, status, errorThrown) {
          if(error){
            error(data);
          }
        },
        cache: false,
        contentType: 'application/json; charset=utf-8',
        dataType: 'json'
      });
    };

    superSimpleWebshopService.createUrl = function (method, args) {
      var baseUrl = '/Base/SuperSimpleWebshop/' + method;
      if (args) {
        for (var i = 0; i &lt; args.length; i++) {
          baseUrl += '/' + args[i];
        }
      }

      return baseUrl + '.aspx';
    };
  };
  var ssws_service = new SuperSimpleWebshopService();

})();

ssws-script.js

// UWEBSHOP EXAMPLE SCRIPTS

$(document).ready(function () {

    $.fn.GetJSONForCategory = function (CategoryId, shopAlias) {
        SuperSimpleWebshop.GetJSONForCategory(CategoryId, shopAlias,
      function (data) {
          alert(data.Title);
      },
      function (data) {
          alert('Error' + data.status);
      });
    };

    $.fn.GetJSONForProduct = function (ProductId, shopAlias) {
        SuperSimpleWebshop.GetJSONForProduct(ProductId, shopAlias,
      function (data) {
          alert(data.Title);
      },
      function (data) {
          alert('Error' + data.status);
      });
    };

    $.fn.GetOrderForCurrentCustomer = function (shopAlias) {
        SuperSimpleWebshop.GetOrderForCurrentCustomer(shopAlias,
      function (data) {
          return data;
      },
      function (data) {
          alert('Error' + data.status);
      });
    };

    $.fn.UpdateMiniBasket = function (shopAlias) {
        SuperSimpleWebshop.GetOrderForCurrentCustomer(shopAlias,
      function (data) {
          $('#minibasket dl dd').text(data.TotalAmountWithTax);
          $('#minibasket dl dd').effect("bounce", { times: 3 }, 300);
      },
      function (data) {
          alert('Error' + data.status);
      });
    };

    $.fn.GetJSONForPricing = function (PricingId, shopAlias) {
        SuperSimpleWebshop.GetJSONForPricing(PricingId, shopAlias,
      function (data) {
          alert(data.Title);
      },
      function (data) {
          alert('Error' + data.status);
      });
    };

    $.fn.AddUpdateOrderline = function (shopAlias, id, action, quantity, variants, text, imageId, obj, originalClass) {
        SuperSimpleWebshop.addUpdateOrderLine(shopAlias, id, action, quantity, variants, text, imageId,
      function (data) {
          if (obj) {
              $(obj).attr('class', originalClass);
          }
          $.fn.UpdateMiniBasket(shopAlias);
      },
      function (data) {
          if (obj) {
              $(obj).attr('class', originalClass);
          }
          $.fn.UpdateMiniBasket(shopAlias);
      });
    };

    // shopdirect links
    $('.shopdirect a').click(function (event) {
        // stop href from firing
        event.preventDefault();
        var currentObject = $(this);
        var originalClass = $(this).attr('class');
        var shopAlias = $('body').attr('id');
        var pricingID = $(this).attr('id');
        $(this).attr('class', 'loader');
        $.fn.AddUpdateOrderline(shopAlias, pricingID, 'add', 1, '0', '0', '0', currentObject, originalClass);
    });

    // productpage to basket links
    $('.pricingblock > form > input[type=submit]').click(function (event) {
        // stop href from firing
        event.preventDefault();
        var items = '';
        $(this).parent().find('select[name*=variant] option:selected').each(function (i) {
            if (!$(this).attr("disabled")) {
                items += $(this).val() + ',';
            }
        });

        var currentObject = $(this);
        var originalClass = $(this).attr('class');
        var originalText = $(this).val();
        var shopAlias = $('body').attr('id');
        var pricingID = $(this).parent().find('input[name=product]').val();
        var action = $(this).parent().find('input[name=action]').val();
        var quantity = $(this).parent().find('input[name=quantity]').val();
        var variants = items.substring(0, items.length - 1);
        var text = '0';
        var imageId = '0';

        if ($(this).parent().find('input[name=text]').length) {
            if ($(this).parent().find('input[name=text]').val().length) {
                text = $(this).parent().find('input[name=text]').val();
            }
        }

        if ($(this).parent().find('input[name=imageId]').length) {
            if ($(this).parent().find('input[name=imageId]').val().length) {
                imageId = $(this).parent().find('input[name=imageId]').val();
            }
        }

        if (variants == '')
            variants = '0';

        $(this).attr('class', 'loader');
        $.fn.AddUpdateOrderline(shopAlias, pricingID, action, quantity, variants, text, imageId, currentObject, originalClass);
        $(this).effect("pulsate", { times: 1 }, 400);
    });

    // this function must be below any add or update function to prevent mixups
    $('.button').click(function (event) {
        var currentButton = $(this);
        var originalClass = $(this).attr('class');

        $(this).attr('class', 'loader');

        setTimeout(function () { $(currentButton).attr('class', originalClass) }, 500);
    });

    //equalize height of product blocks for demo skin
    $.fn.equalHeight = function (group) {
        var tallest = 0;
        group.each(function () {
            var thisHeight = $(this).height();
            if (thisHeight > tallest) {
                tallest = thisHeight;
            }
        });
        group.height(tallest);
    };

    //equalize height of product blocks for demo skin
    if ($('ul.itemgrid li.productblock').length) {
        $.fn.equalHeight($("ul.itemgrid li.productblock"));
    };

    //equalize height of pricing blocks for demo skin
    if ($('li.pricingblock').length) {
        $.fn.equalHeight($("li.pricingblock"));
    };

});

Update the SSWS-CustomerData macro

Open the SSWS-CustomerData macro and click the “Browse properties” button.
This will add the new parameters to this macro.

Extra manual changes if you are updating from 1.6.0.2

If you are updating from a 1.6.0.2 release and want to make use of the ‘accept terms and conditions’ validation on the customer data module you have to add the following fields to the SSWS_CustomerData.ascx usercontrol:

<asp:CheckBox ID="chkAcceptTerms" runat="server" />
<asp:CustomValidator id="valAcceptTerms" runat="server" />

There are also two dictionary items corresponding with these two fields:

  1. AcceptTermsAndConditions
    This dictionary item is used to display the accept terms and conditions label next to the checkbox. You can use HTML code in there to generate a link to the terms and conditions page of your webshop.
  2. AcceptTermsAndConditionsError
    This dictionary item is used to display the error when a customer does not check the accept terms and conditions checkbox.

Web.config update

If you want to make use of the new URL’s without ID’s and fully configurable as introduced in uWebshop 1.7 you have to add the following two lines to the <appsettings> section of the web.config:

<add key="sswsCategoryUrl" value="categoryUrl" />
<add key="sswsProductUrl" value="productUrl" />

Please let us know if something is not clear, or something is not working after the update!

uWebshop 1.8 Released

Only a month ago we released version 1.7 of uWebshop, and since then we added quite some nice improvements! Today marks the release of uWebshop 1.8!

As usual you can download the new version from the uWebshop our.umbraco page.

What is new?

  • Completed our changes to move to the Umbraco 4.7 API
    After some initial changes over the last versions, we now completed the transition to the Umbraco 4.7 API. Umbraco 4.7.x is the best version of Umbraco as yet, and therefore also the best version to build your shop on.
  • Set custom text and/or image per order line
    One of the most requested features, now finally available in uWebshop!You can now set a text and/or an image Id to any order line! You can let your customers upload an image, and use the Id retuned to create/update the order line and let them add a text to the image as well.
    Razor & XSLT files are updated to make use of the text feature and we did some updates to the jQuery examples to make this work with AJAX.
  • Taxpercentage for shipping costs
    You could already set the shipping costs per shipping provider in uWebshop, now it plays nice with VAT
  • Payment providers can have costs
    As has always been so with shipping providers, it’s now possible tot add an amount (+ VAT) to a payment provider. With this option you can for example let users who want to pay by invoice pay a little extra.
  • Input all prices including VAT
    Previous version of uWebshop only allowed you to input the amounts excluding VAT, then set the VAT for them. With just a checkbox check you can now input all amounts including VAT.
  • JSON AddOrUpdateOrderline now returns the full OrderInfo in JSON
    Previously the JSON returned when you updated the basket using jQuery was only a small part of the order information.
    From now on you’ll get everything that is in the order returned.
  • Dictionary both in English and Dutch by default
    Since about half of our customers in based in the Netherlands we got quite some requests to include a Dutch dictionary by default.
    With uWebshop 1.8 we’re happy to announce it’s finally available!

With the announcement of Umbraco 4.8 with the best of  uComponents integrated, in Niels Hartvig’s Keynote at the Dutch Umbraco Festival. We will work towards releasing a version that makes use of those features when released.

We als did a presentation at the festival about uWebshop: you can watch it here
The powerpoint used can be downloaded here

We’d like to hear your feedback below!

uWebshop 1.7 released!

Today marks the launch of the new uWebshop 1.7.0.0 release!
We already informed you about this new version in our previous blog post, but now you are able to download the full installer*!

You can download the new version from the uWebshop our.umbraco page!

We’ve put a lot of our clients wishes in this new version, and added even some extra’s!
Before release we have already upgraded 5 working shops to make sure all goes well.

Let us explain the new features and functionality to you:

  • Ability to define a template per category or product node in the catalog.
    You can now set a different template on each category or product node, just as with any umbraco page. If there isn’t a template set it will fallback tot the template set on the category node in the content tree.
  • Reworked URL functionality: Now fully configurable and more SEO friendly!
    The shop URL’s are now fully configurable and don’t contain any id’s.
    You can easily configure the way the URL’s are made friendly using the “sswsCategoryUrl” and “sswsProductUrl” keys in the web.config.
    Use the propertytype alias from the category or product node to create the URL you want. uWebshop will automatically parse them with the right multilingual value! You can also use any URLfriendly character. Split the URL values with a comma if you want to use multiple properties: <add key=”sswsCategoryUrl” value=”number,-,categoryUrl” />
  • Razor extensions in own dll instead of combined with xslt extensions
    You could already use our XSLT extensions to build your razor code files, but now we’ve put them in their own dll.
  • Razor extensions return objects
    The new razor extensions return objects instead of xml
  • Some new API functionality to use with the Razor scripts
    Easier to use API functions for use in Razor.
  • Examples Razor scripts
    We’ve created a new set of example Razor files to build your shop with.
    The are not configured on the installation by default, but you can set the macro’s to use the new razor files instead of XSLT.
  • Updated XSLT extentions to work with the new URL functionality
  • Accept Terms & Conditions checkbox on customerdatapage
    We’ve got a lot of requests for this one, so we added a accept terms and conditions checkbox by default on the customer data page. It has to be accepted before customers can continue shopping. It is using the “AcceptTermsAndConditions” and “AcceptTermsAndConditionsError” dictionary items, so you can also place links in there. If you don’t want to use this feature, just remove the field from the ascx file.
  • Overrule shipping providers checkbox on shipping provider node
    You can set an “overrule” check on each shipping provider. When uWebshop loads the shipping providers for the order, it checks if there is any overrule provider. If that is true, then it will only show the overrule providers. If no overrule provider is found, but there is weight item in the order, only the weight providers will be shown. If there is no weight item in the order, then all ‘normal’ shipping providers will be shown.
  • Placed various payment provider dll’s in the package instead of different installation packages
    By default the following payment provider dll files are copied to your bin directory:
    - eWay Hosted
    - eWay Shared
    - MultiSafePay
    - Ogone
    - PayPal
    - SagePay
    Only PayPal is fully configured. In an upcoming blogpost you will read how to make use of the other providers with very little configuration!
  • Various code optimalisations & Bug fixes

* the update package will follow a.s.a.p

What is the uWebshop team working on?

With currently over 40 sites running uWebshop, we frequently get questions about our development progress and other things we are working on. What will be next? Do we  already work on uWebshop for Umbraco 5? Will you continue to build for Umbraco 4? Can you please build the shop for us?!?

uWebshop 5

As you could have noticed from the previous blogpost bij Sebastiaan we are indeed working on an uWebshop version for Umbraco 5: uWebshop 5.

While we can’t give you an exact date when this version will be finished, we can promise a working demo and in-depth tech session at the Dutch Umbraco Festival 2012. So be sure to be there!

uWebshop 1.7 for Umbraco 4.7

While a part of the team is working hard to develop uWebshop5, we also actively develop the uWebshop package for Umbraco 4.7. The new uWebshop 1.7 version, to be released soon, will contain quite some nice updates:

  • Ability to define a template per category or product node in the catalog.
  • Reworked URL functionality. Now without node Id’s.
  • Category and product url’s configurable in the web.config (sswsCategoryUrl & sswsProductUrl).
  • Razor extentions in own dll and returning objects instead of combined with xslt extentions.
  • Razor extentions return objects
  • Some new API functionality to use with the Razor scripts
  • Examples Razor scripts
  • Updated XSLT extentions to work with the new URL functionality
  • Accept Terms & Conditions checkbox on customerdatapage
  • Overrule shipping providers checkbox that will only show those shipping providers if they match with an order (they overrule weight)
  • Various code optimalisations & Bug fixes

This version is already being actively used in a few live shops and will be available soon in the Umbraco Deli.

New uWebshop website coming soon!

With uWebshop being a company on it’s own since this year, we also needed to update our website to reflect these changes. Our new website will contain more information about our product for both developers as end customers and there will be a WIKI to find all the information you need. We are also building integration with other services to centralize the customer support.

uWebshop training & certifications

While uWebshop is developed with both shop owners as shop developers in mind, we do regularly get requests from companies that want us to train their developers, or shop owners, how to work with uWebshop as good as possible.

For those who are interested we do offer training & certifications at your company or in the uWebshop office in Leiden. Get in touch for fees and possibilities.

Let us build your shop!

If you are developing a shop, but need some extra hands, some customizations, or a shop completely build from scratch in the highest quality, we are more then welcome to help you with that! We will also help shop-owners (to-be) with choosing the right uWebshop partner to get their shop developed.

Creating content nodes in Umbraco v5 from code

While building the new version of uWebshop for Umbraco 5, we had the need to create content items from code so that the shop can be set up for you.

A method to do this in the 5.0.0 release will be shown in this blog post, but remember: in the near future (read: the next few weeks) the Umbraco team will be making a much easier API to do this. If you’re reading this and really want to create content nodes right now then you ARE the “one percent”If you love diving into the “rough” API, then you’re in the right place, but if you can wait a little longer then by all means: please do wait.

Alex Norcliffe has repeatedly assured me that this is not the way forward and for most package builders this should not be the API to use. That said, if you are itching to get started (like we are, we want to get uWebshop for v5 out as soon as possible) then by all means, read further and be sure to take the code samples and remix them in whatever way you want to!

There’s a few things we need to do to create content nodes, the two things that we’ll be required to know to start with are:

  1. The ID of the parent under which the node will be created
  2. The alias of the document type that the new node should get (this means you will need to have an existing document type. programmatically creating document types will be covered in a future blog post)
For this proof of concept, a simple controller was created in the umbraco website. For this, we used the Umbraco Jupiter As Visual Studio Solution template. Following the instructions, we got a fully functional Visual Studio solution.
Then it was just a simple matter of creating a folder called Controllers in the Umbraco.Web project and we could start adding some code.
Let’s start with a tiny controller that gives us a context to work with by asking for a IHiveManager in the constructo of our controller.

using System.Linq;
using System.Web.Mvc;
using Umbraco.Cms.Web.Model.BackOffice.Editors;
using Umbraco.Framework.Context;
using Umbraco.Hive;

namespace Umbraco.Web.Controllers
{
    public class InitContentController : Controller
    {
        public IHiveManager Hive { get; set; }

        public InitContentController(IHiveManager hiveManager)
        {
            Hive = hiveManager;
        }

        public ActionResult Index()
        {
            return Content("Done");
        }
    }
}

Building the solution and going to http://localhost:5050/InitContent will just show “Done” on the screen. Perfect, we’re done! (with showing text on the screen, that is).

For now let’s pass in some variables to the controller so we have all the prerequisites available:

public ActionResult Index(string documentTypeAlias, string nodeName, string parentId)
{
   return Content("Done");
}

So we can now call it like so: http://localhost:5050/InitContent?documentTypeAlias=category&nodeName=New%20Node&parentId=881111c2870f49958df19ff3010388ea

The parentId comes from an existing content node, you can find the id on the properties tab in Umbraco’s back office.

Later, we’ll also add a way to add a node to the root of the Content so that even if there is no content at all you can still add a new “Home” node for the empty site. So what is exactly required right now to create nodes? 2 more things:

  1. A DocumentTypeEditorModel
  2. A FrameworkContext

The latter one already lives in the HiveManager, so it’s just a matter of assigning it to a variable:

public class InitContentController : Controller
{
    public DocumentTypeEditorModel DocumentTypeEditorModel { get; set; }
    public IFrameworkContext FrameworkContext { get; set; }
    public IHiveManager Hive { get; set; }

    public InitContentController(IHiveManager hiveManager)
    {
        Hive = hiveManager;
        FrameworkContext = hiveManager.FrameworkContext;
    }
}

As you can see, we already defined the DocumentTypeEditorModel but haven’t filled it yet, this is because we need to know for what documentType we’re going to have to get it.

We use the following method to get it from the provided alias (documentTypeAlias=category):

public ActionResult Index(string documentTypeAlias, string nodeName, string parentId)
{
    DocumentTypeEditorModel = GetDocumentType(documentTypeAlias);

    return Content("Done");
}

private DocumentTypeEditorModel GetDocumentType(string documentTypeAlias)
{
    EntitySchema categorySchema;
    using (var uow = Hive.OpenReader())
    {
        categorySchema = uow.Repositories.Schemas.GetAll().Single(x => x.Alias == documentTypeAlias);
    }

    return FrameworkContext.TypeMappers.Map(categorySchema);
}

After looking through the DevDataSet package for which the source is available in Umbraco source code, we learned how to set up new content items.

After cleaning it up, we can up with the following code and were pretty confident that it should work (hint: it didn’t work entirely):

public ActionResult Index(string documentTypeAlias, string nodeName, string parentId)
{
    DocumentTypeEditorModel = GetDocumentType(documentTypeAlias);

    var parentHiveId = string.IsNullOrEmpty(parentId) ? FixedHiveIds.ContentVirtualRoot : new HiveId(new Guid(parentId));

    var contentNode = new ContentEditorModel
                            {
                                Name = nodeName,
                                DocumentTypeId = DocumentTypeEditorModel.Id,
                                DocumentTypeAlias = documentTypeAlias,
                                ParentId = parentHiveId
                            };

    var contentRepository = new List { contentNode };

    using (var writer = Hive.OpenWriter())
    {
        var mappedCollection = FrameworkContext.TypeMappers.Map<IEnumerable<ContentEditorModel>, IEnumerable<Revision<TypedEntity>>>(contentRepository).ToArray();
        mappedCollection.ForEach(x => x.MetaData.StatusType = FixedStatusTypes.Published);

        writer.Repositories.Revisions.AddOrUpdate(mappedCollection);
        writer.Complete();
    }

    return Content("Done");
}

After running this a few times we had nodes showing up, wahoo! But hmmm, “Unnamed”? We did send a name into it: Name = nodeName. Curious.

Well, after talking to Matt Brailsford it turns out that it’s not that easy. Yet.

Let me reiterate: this will becoming easier in a few weeks, but for now we will need to add a name property instead of trying to set the Name like this.

No problem, lets create an extra SetProperty method that will later on also help us give a value to the properties on our document:

private ContentProperty SetProperty(string propertyAlias, object propertyValue)
{
    var docTypeProperty = DocumentTypeEditorModel.Properties.Single(x => x.Alias == propertyAlias);

    //NOTE: If the Umbraco API changes (an extra overload is added to new ContentProperty), this might break
    var dictionary = propertyValue as IDictionary ?? new Dictionary { { "Value", propertyValue } };

    var property = new ContentProperty(docTypeProperty.Id, docTypeProperty, dictionary)
                        {
                            Alias = propertyAlias,
                            TabId = DocumentTypeEditorModel.DefinedTabs.Single(x => x.Alias == FixedGroupDefinitions.GeneralGroup.Alias).Id
                        };

    return property;
}

Alright, putting it together, our Index method we can now add the name property to the ContentEditorModel:

var nameProperty = SetProperty(NodeNameAttributeDefinition.AliasValue, new Dictionary { { "Name", nodeName } });

var properties = new HashSet { nameProperty };

var contentNode = new ContentEditorModel
                        {
                            DocumentTypeId = DocumentTypeEditorModel.Id,
                            DocumentTypeAlias = documentTypeAlias,
                            ParentId = parentHiveId,
                            Properties = new HashSet(properties)
                        };

And after running the newly built controller we had a fully functional new node set up in Umbraco v5: Victory!

The final thing is to fill the properties on the nodes with some values, for now it’s just some hardcoded values, but we’ll refactor that out later:

var nameProperty = SetProperty(NodeNameAttributeDefinition.AliasValue, new Dictionary { { "Name", nodeName } });

var shortDescriptionProperty = SetProperty("ShortDescription", "bla");
var fullDescriptionProperty = SetProperty("FullDescription", 15);

var properties = new HashSet { nameProperty, shortDescriptionProperty, fullDescriptionProperty };

And there we have it: the ability to create whatever we want! You may have noticed that if the parentId variable is empty, the parent Id is set to the ContentVirtualRoot, that is how the “My first category” node was created.

The full class is available in the following gist: https://gist.github.com/1817726

And just to drive the point home: you WILL be able to do this in a few lines of code in the future, but if you’re an early adopter then you now have options.

uWebshop 1.6.0.1 update packages released!

While building and testing the 1.6.0 release for updating uWebshop 1.5.1.1 shops to this new version, we came around two small bugs. No real showstoppers, but ugly enough to need a fix. Please keep on sending issues to us, lust like @TomMaton did! Thanks Tom!

New in version 1.6.0.1 (30 jan 2011):

  • Fixed case senstive issue in the shop URL’s
  • Fixed country dropdown on unpublished shopalias node

Packages released today:

  • uWebshop 1.6.0.1 full installation package
  • uWebshop 1.6.0 to uWebshop 1.6.0.1 upgrade package
  • uWebshop 1.5.1.1 to uWebshop 1.6.0.1 upgrade package

You can download the packages at our our.umbraco page.

We are still looking for a new member to join our team!

We’re hiring: Umbraco v5 Package Developer for the uWebshop package!

Yes you read that right! the uWebshop company is hiring!

For our office in Leiden (The Netherlands) we are looking for an full time Umbraco 5 Package Developer to help us develop the uWebshop solution for Umbraco 5! We are already started of course, but we have huge plans and can use some extra input!

But wait… Umbraco 5 isn’t even released yet!?! How can somebody be suited for this job?

Simple! If you are an Umbraco enthusiast with C# knowledge, preferably some MVC3 knowledge and think you have what it takes, get in touch!

A day in our office is working with other Umbraco enthusiasts, keeping up-to-date with the latest Umbraco news and developments, contribute to the Umbraco community by helping others on the our.umbraco forums and, most important: develop the uWebshop package (the SCRUM way)! Being a good foosball player will help you get trough the day in one piece as well…

We have some details up on our website, if you don’t completely comply with them, but really think you are perfect just let us know anyway!

Did we mention that your Codegarden 12 ticket is already waiting for you!
Oh… and you don’t need to hide those CG Bingo photos from us ;)

uWebshop 1.6.0 released

To add an event to celebrate at the Dutch Umbraco User-Group drink tonight we released uWebshop 1.6.0 for Umbraco!

Download: http://our.umbraco.org/projects/website-utilities/uwebshop

For now we only released the new installation package, but the update package will follow soon!

There are some ‘breaking’ changes to you XSLT’s.
We removed the customer data from the custom orderdata xml. Just use the order ID to get the Umbraco order node and get those properties from there.
For SEO reasons we also use the product number in the product url if available, otherwise the NodeId will be used.

New in version 1.6.0 (19 jan 2012):

  • Ability to rename the ShopAlias node (don’t forget to change the urlRewriting.config as well!).
  • SEO: URL rewring for products will now use the ProductNumber instead of the NodeID if available.
  • Shipping providers can now set shippingcosts and methods from an external shippping provider API (sswsShipping.config).
  • BREAKING: customer & shipping data removed from the OrderInfo XSLT functions. Use umbraco node instead.
  • Width, Height & lenght properties on pricing for shipping API.
  • Expired orders don’t give a YSOD anymore.
  • OrderInfo in Umbraco backend is read from Document instead of Node.
  • Sorting the uWebshop section works now.
  • Define the lifetime of incomplete orders on the settings node.
  • Various code optimalisations & Bug fixes.

We hope you all enjoy this new release!

Download: http://our.umbraco.org/projects/website-utilities/uwebshop

uWebshop 1.5.1.1 released

As we try to release a new, improved uWebshop version each month, we couldn’t disappoint you this month, so here is a fresh uWebshop version!

Download: http://our.umbraco.org/projects/website-utilities/uwebshop

This release is only a dll update plus an improved Google Analytics e-commerce XSLT.
Next release will bring some extensions to the way shipping provider work.

Soon there will also be awesome news about our plans for 2012…

There is a full package and an update package for you running uWebshop 1.5.1 available on our Umbraco page: http://our.umbraco.org/projects/website-utilities/uwebshop
ALWAYS backup before applying an update!

New in version 1.5.1.1 (22 nov 2011):

  • The default customerdata controls now uses whatever MemberType you fill in as a default membertype in web.config
  • Before ordestatus changed & after orderstatuschanged events
  • Category and product url’s now use the rules set in umbracoSettings.config
  • Fixed an issue where removing sales wouldn’t update the cache
  • More & better loging for shipping provider and payment provider issues. Use Umbraco Logging tools to see them!
  • Added extra dot decimal separated values to the order xml
  • Various code optimalisations

Did you  know we are a Spindoctor Behavioral Targeting technology partner:

Spindoctor Behavioral Targeting for Umbraco allows you to profile and segment your visitors. Target your content and increase usability and conversion.

More info at: http://www.spindoctorhq.com/partners/

uWebshop facts and features

uWebshop comes with a very complete set of features for a very low price.
This document is here to help you understand a bit more what uWebshop is all about and what it can do for you and your clients. If you have question after reading this document please ask them on the uWebshop forum or contact us via our website.

Read more to get in-depth with the latest and greatest of uWebshop!
You can also download this uWebshop information document as PDFwith all the information + some extra!

Continue reading