2

我正在实施默认的 Sitecore-uCommerce SEO 友好 URL 机制,但遇到了问题。

我查看了 uCommerce 的 ItemResolver 处理器,但我仍然不明白 uCommerce 如何设置 Sitecore 上下文项。似乎它为 Sitecore.Context.Item 使用了 uCommerce 项目的 Guid。不知何故,情况并非如此,但我没有看到真正的 Sitecore 项目被设置为上下文项目。并且 uCommerce 项目上没有布局细节。还是我错了?

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;
}

然后它使

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

我希望它是一个带有显示产品详细信息的渲染的特定 Sitecore 项目。URL 属于类型

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

如果您能解释一下 uCommerce 如何获取真正的 Sitecore 项目并将其设置为 Context.Item,我想这对我来说就足够了。

4

1 回答 1

1

你走对了。

他们将上下文项移动到其他项。我不喜欢他们如何处理 url,我需要其他 ProductResolver。

Ucommerce 在他自己的数据库中有产品,他们创建了一个 dataProvider 来将产品引入 Sitecore。

Ucommerce 产品位于 /sitecore/uCommerce/Products 下的 Sitecore。

商店、类别和子类别位于 /sitecore/uCommerce/Store 下。

请检查此链接以清楚了解 ucommerce 如何处理 url:

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

我也有和你一样的问题,我创建了一个自定义 ItemResolver。

我在 httpRequestBegin 管道上以这种方式定义了处理器。

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

我在 Sitecore 中创建了一个新模板名称 ProductPage,我创建了一个名为 Product 类型的 ProductPage 的新项目

我的要求是有这样的网址:/Shoes/Running/NIKEAIRZOOMPEGASUS33

当您浏览到 /category/subcategory/productid 我的 productResolver 被触发。

我检查类别、子类别和产品是否存在。

如果它们存在,我设置当前类别和当前产品。

SiteContext.Current.CatalogContext.CurrentProduct=current_product; //您需要检查产品是否在当前类别中

我将我的上下文项设置为产品项

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;
}
于 2016-07-14T11:53:40.693 回答