以编程方式更改电子商务产品当前使用的网址

时间:2018-03-28 13:15:33

标签: c# sitefinity

Heyo,

我们经常使用相同的名称创建产品(在电子商务模块中)(例如:Red T-Shirt与SKU 123,另一个Red T-Shirt与SKU 4500),这会产生网址产品是相同的(例如:"/red-t-shirt"

您可能知道的问题是,您不能拥有两个具有相同网址的产品(或相同的其他网址) - 这会导致每当您尝试使用时抛出异常保存其中一个具有相同名称的产品(并在Sitefinity UI中显示为未定义的错误)。

创建这些产品后,我希望搜索具有相同网址的其他产品,以便将其网址更改为其他内容(例如,新的Red T-Shirt将获得"/red-t-shirt"自动,旧的将改变为别的东西)

我也想对其他网址做同样的事情。 目前我正在使用SQL,但我想用C#代替。这就是我的SQL看起来 - 我只是不知道它如何转换为C#。

-- Change URLs in sf_url_data, the 'additional URLs'
SELECT *
FROM dbo.sf_url_data
WHERE 
    (url LIKE '%/red-t-shirt%') 
AND 
    (content_id IN
        (SELECT id
        FROM dbo.sf_ec_product
        WHERE (sku <> 4500))) -- 4500 is the new PLU that we want to keep as /red-t-shirt

--
-- Change URLs in sf_ec_product, the default URL
SELECT *
FROM dbo.sf_ec_product
WHERE 
    (id IN
        (SELECT content_id
        FROM dbo.sf_url_data
        WHERE (url LIKE '%/red-t-shirt%')))

注意我必须先更改其他网址,因为我使用sf_ec_product的实际网址对其他网址进行选择(请参阅子查询)。

编辑:我正在寻找应该(我假设)使用Sitefinity CatalogManager类的解决方案,如下所述:https://docs.sitefinity.com/for-developers-modify-products

1 个答案:

答案 0 :(得分:1)

找到答案。这个工作。

CatalogManager catalogManager = CatalogManager.GetManager();

// Get the old unused product
Product oldProduct = catalogManager.GetProduct(oldProduct.Sku, ContentLifecycleStatus.Live);

// Set the english and french URLs to something new
oldProduct.UrlName.SetString(enCulture, "new-english-url");
oldProduct.UrlName.SetString(frCulture, "new-french-url");

// Delete associated non-default URLs
List<ProductUrlData> urls = oldProduct.Urls.Where(u => !u.IsDefault).ToList();
if (urls.Count > 1)
{
    oldProduct.Urls.ClearUrls(true);
    for (int i = urls.Count - 1; i >= 0; i--)
    {
        catalogManager.Provider.Delete(urls[i]);
    }
}

// Recompile the URLs and save changes
catalogManager.Provider.RecompileItemUrls(oldProduct);
catalogManager.SaveChanges();