2016-03-08 51 views
2

我有任务在网站上更改smth时获取内容的网址。它就像CRUD操作日志记录(在我的情况下,我将这个URL记录到其他系统进一步处理)。它应该在版本6和更高版本上工作。Sitecore LinkManager GetItemUrl。为什么它如此棘手?

当我开始看起来很简单订阅事件然后拿项目和生成它的网址。我订阅了两个事件发布:itemprocessing(因为只有这里的项目还没有从网页数据库中删除),发布:itemProcessed(用于添加和更新)。

此事件给我时间项目的对象,因此它似乎变得网址一样,

var options = LinkManager.GetDefaultUrlOptions(); 
options.AlwaysIncludeServerUrl = true; 
options.SiteResolving = true; 
var url = LinkManager.GetItemUrl(item, options); 

在这里,我的问题开始很简单。首先,我需要拥有正确的网址和网站上生成的相同方式,但这里的网址返回给我的是“http://domain/sitecore/content/Home.aspx”。

所以我增加了新的方法,以找到正确的网站,从网站定义

private List<KeyValuePair<string, SiteContext>> GetSites() 
{ 
      return SiteManager.GetSites() 
       .Where(
        s => 
         !string.IsNullOrEmpty(s.Properties["rootPath"]) && 
         !string.IsNullOrEmpty(s.Properties["startItem"])) 
       .Select(
        d => new KeyValuePair<string, SiteContext>($"{d.Properties["rootPath"]}{d.Properties["startItem"]}", 
         new SiteContext(new SiteInfo(d.Properties)))) 
       .ToList(); 
} 

public virtual SiteContext GetSiteContext(Item item) 
{ 

      var site = _sites.LastOrDefault(s => item.Paths.FullPath.ToLower().StartsWith(s.Key.ToLower())); 
      return site.Value; 
} 

options.Site = GetSiteContext(Item item); 
不解决

同样的问题,因为Sitecore的返回“http://127.0.0.1/en.aspx

然后我继续阅读并理解该网站定义应有targetHostName(它实际上是有道理的,因为一个网站可以有多个域),但是当我添加targetHostName现在它返回我其他链接“:// targetHostName/en。 aspx“so http | https is missing。第二个问题是,它返回我EN.aspx这意味着这个页面可以访问扔http://targetHostName/en.aspxhttp://targetHostName

现在我有以下的网站定义

<sites> 
     <site name="shell" virtualFolder="/sitecore/shell" physicalFolder="/sitecore/shell" rootPath="/sitecore/content" startItem="/home" language="en" database="core" domain="sitecore" loginPage="/sitecore/login" content="master" contentStartItem="/Home" enableWorkflow="true" enableAnalytics="false" analyticsDefinitions="content" xmlControlPage="/sitecore/shell/default.aspx" browserTitle="Sitecore" htmlCacheSize="2MB" registryCacheSize="3MB" viewStateCacheSize="200KB" xslCacheSize="5MB" /> 
     <site name="login" virtualFolder="/sitecore/login" physicalFolder="/sitecore/login" enableAnalytics="false" database="core" domain="sitecore" disableXmlControls="true" /> 
     <site name="admin" virtualFolder="/sitecore/admin" physicalFolder="/sitecore/admin" enableAnalytics="false" enableWorkflow="true" domain="sitecore" loginPage="/sitecore/admin/login.aspx" /> 
     <site name="service" virtualFolder="/sitecore/service" physicalFolder="/sitecore/service" /> 
     <site name="modules_shell" virtualFolder="/sitecore modules/shell" physicalFolder="/sitecore modules/shell" rootPath="/sitecore/content" startItem="/home" language="en" database="core" domain="sitecore" content="master" enableAnalytics="false" enableWorkflow="true" /> 
     <site name="modules_website" virtualFolder="/sitecore modules/web" physicalFolder="/sitecore modules/web" rootPath="/sitecore/content" startItem="/home" language="en" database="web" domain="extranet" allowDebug="true" cacheHtml="true" /> 
     <site name="website" hostName="sitecore6.target|sitecore6.local" targetHostName="sitecore6.target" schema="http" virtualFolder="/" physicalFolder="/" rootPath="/sitecore/content" startItem="/home" database="web" domain="extranet" allowDebug="true" cacheHtml="true" htmlCacheSize="10MB" registryCacheSize="0" viewStateCacheSize="0" xslCacheSize="5MB" filteredItemsCacheSize="2MB" enablePreview="true" enableWebEdit="true" enableDebugger="true" disableClientData="false" /> 
     <site name="scheduler" enableAnalytics="false" domain="sitecore" /> 
     <site name="system" enableAnalytics="false" domain="sitecore" /> 
     <site name="publisher" domain="sitecore" enableAnalytics="false" enableWorkflow="true" /> 
    </sites> 

和链路管理器设置

<linkManager defaultProvider="sitecore"> 
     <providers> 
     <clear /> 
     <add name="sitecore" type="Sitecore.Links.LinkProvider, Sitecore.Kernel" addAspxExtension="true" alwaysIncludeServerUrl="false" encodeNames="true" languageEmbedding="asNeeded" languageLocation="filePath" lowercaseUrls="false" shortenUrls="true" useDisplayName="false" /> 
     </providers> 
    </linkManager> 

回答

6

由于您生成链接的位置,问题正在发生。当您将AlwaysIncludeServerUrl选项设置为true时,Sitecore将使用当前的Sitecore.Context.Site信息计算出服务器Url。

设置HTTP或HTTPS部分,你需要叫scheme属性添加到您的网站的定义 - 我认为你有一个错字,你有一个叫schema

<sites> 
    <site name="website" hostName="sitecore6.target|sitecore6.local" targetHostName="sitecore6.target" scheme="http" virtualFolder="/" physicalFolder="/" rootPath="/sitecore/content" startItem="/home" database="web" domain="extranet" allowDebug="true" cacheHtml="true" htmlCacheSize="10MB" registryCacheSize="0" viewStateCacheSize="0" xslCacheSize="5MB" filteredItemsCacheSize="2MB" enablePreview="true" enableWebEdit="true" enableDebugger="true" disableClientData="false" /> 
</sites> 

期间发布事件,Context.Site将是shell网站。所以它不会为你的website定义拾取targetHostName

给力的是,你需要使用一个SiteContextSwitcher

var website = Sitecore.Configuration.Factory.GetSite("website"); 
using (new SiteContextSwitcher(website)) 
{ 
    var options = LinkManager.GetDefaultUrlOptions(); 
    options.AlwaysIncludeServerUrl = true; 
    options.SiteResolving = true; 
    var url = LinkManager.GetItemUrl(item, options); 
} 

然后地址将使用生成的网站targetHostName,应该生成你是如何期待。

最后一个注释 - 最佳做法是通过包含文件修补新的网站定义,而不是编辑主要的Sitecore配置。看看你的包含文件夹,那里应该有一个SiteDefinition.config.example文件。它会告诉你如何去做。

+0

没有。 http://127.0.0.1/en.aspx –

+2

我会接受这个答案,因为它是一个更优雅的方式来设置网站。我切换到sitecore 8,现在它工作,所以可能在版本6有bug –