sitecoresitecore-ucommerce

Implementing SEO friendly URLs in Sitecore-uCommerce


I am implementing a default Sitecore-uCommerce SEO friendly URLs mechanics and I run into issues.

I looked into ItemResolver processor of uCommerce and I still do not understand how uCommerce sets the Sitecore Context Item. It seems like it uses an uCommerce Item's Guid for Sitecore.Context.Item. Somehow it is not the case, but I do not see the real Sitecore Item to be set as Context item. And uCommerce items do not have the layout details on them. Or am I wrong?

private ID FindSitecoreIdForProduct(int productId)
{
    IRepository<Product> repository = ObjectFactory.Instance.Resolve<IRepository<Product>>();
    Product product = repository.Get(productId);
    if (product != null)
    {
        return new ID(product.Guid);
    }
    return ID.Null;
}

Then it makes

ID iD = this.FindSitecoreIdForProduct(productId);
if (iD == ID.Null)
{
    return;
}
Context.Item = Context.Database.GetItem(iD);

I would like it to be a specific Sitecore Item with a rendering showing the product details. The URLs are of type

http://sitename.com/productdetailpage/productname/c-25/p-125

If you could just explain me how uCommerce gets to the real Sitecore Item and sets it as a Context.Item, I guess it will be enough for me.


Solution

  • You are on the right way.

    They move the context item to other item. I didn't like how they deal with url, and I need other ProductResolver.

    Ucommerce have products in his own db, and they created a dataProvider to bring products into Sitecore.

    The Ucommerce products are located in Sitecore under /sitecore/uCommerce/Products .

    The shops,category and subcategory are located under /sitecore/uCommerce/Store.

    Please check this link to have a clean idea how ucommerce is dealing with url:

    http://docs.ucommerce.net/ucommerce/v7.0/sitecore/working-with-nice-urls-in-sitecore.html

    I also have the same issue like you and I created a custom ItemResolver.

    I defined processor in this way on httpRequestBegin pipeline.

    <processor type="NameSpace.ProductResolver, Assembly" patch:instead="processor[@type='UCommerce.Sitecore.Pipelines.ItemResolver, UCommerce.Sitecore']"/>
    

    I created in Sitecore a new template name ProductPage, I create a new item named Product of type ProductPage

    My requirements was to have url like : /Shoes/Running/NIKEAIRZOOMPEGASUS33

    When you browse to /category/subcategory/productid my productResolver is triggered.

    I check if category,subcategory and product exist.

    If they exist I set the current category and current product.

    SiteContext.Current.CatalogContext.CurrentProduct=current_product; //you need to check if product is in current category

    I set my Context Item to be the Product item

    var pathList = args.LocalPath.Split(new[] { '/' },   StringSplitOptions.RemoveEmptyEntries).ToList();
    
    
    var currentProduct= GetCurrentProduct(pathList);  
    // in above function I am getting the current product, checking if is correct category and subcategory
    if (currentProduct != null)
    {
        SiteContext.Current.CatalogContext.CurrentProduct = currentProduct;
                Sitecore.Context.Item = productItem;
    }