我陷入了一点发展烦恼。我创建了一个扩展Sitecore创作界面的应用程序。在Sitecore中创建新的内容项之前,该应用程序会查询一些内部服务,并向内容作者询问一些其他问题。我已经在(Sitecore.Shell.Applications.Templates.CreateTemplate.CreateTemplateForm)上为应用程序建模。
我遇到的问题是,一旦创建了项目,我的WizardForm就会重新加载以加载新创建的项目。我想要的是向导在关闭模式对话框后进入“最终”页面并重新加载主UI。新的OOTB模板向导的工作原理。我知道,如果我将项目创建代码注释掉,则UI会按预期运行。看起来像一个项目的创建会在UI响应的背景中生成一些事件,并使用新创建的项目重新加载我的模式对话框。(我曾尝试以下解决方案http://sdn.sitecore.net/Forum/ShowPost.aspx?postid=29092,http://sdn.sitecore.net/Forum/ShowPost.aspx?postid=29968,然而,这确实似乎无法为我解决)。
原始代码似乎禁用了这样的事件:
this.CreateTemplatePicker.DisableEvents();
TemplateItem templateItem = Client.ContentDatabase.Templates.CreateTemplate(this.TemplateName.Value, selectionItem);
this.CreateTemplatePicker.EnableEvents();
我尝试了以下方法:
Client.Site.Notifications.Disabled = true;
var item = container.Add(ItemUtil.ProposeValidItemName(this.Title.Value), Settings.ProductImageTemplateID);
Client.Site.Notifications.Disabled = false;
和奥尔索
Item item;
using (new EventDisabler())
{
item = container.Add(ItemUtil.ProposeValidItemName(this.Title.Value), Settings.ProductImageTemplateID);
}
全部具有相同的结果。我一进入创建项目的页面,便会重新加载向导模式对话框。使用小提琴手,我可以看到重新加载Windows的命令已发送到客户端。我只是无法弄清楚如何告诉Sitecore UI忽略事件,或者首先防止事件发生。下面发送到UI的第一个命令告诉页面加载内容编辑器,而这正是我试图阻止的事情。
{"commands":[
{"command":"SetLocation","value":"/sitecore/shell/sitecore/content/Applications/Content%20Editor.aspx?fo=%7b186F686E-A8FF-4303-B59F-4D284A5A0196%7d&db=master&id=%7B186F686E-A8FF-4303-B59F-4D284A5A0196%7D&la=en&vs=1"},
{"command":"SetDialogValue","value":"{186F686E-A8FF-4303-B59F-4D284A5A0196}"},
{"command":"SetStyle","value":"none","id":"Constraints","name":"display"},
{"command":"SetStyle","value":"","id":"LastPage","name":"display"},
{"command":"SetAttribute","value":true,"id":"NextButton","name":"disabled"},
{"command":"SetOuterHtml","value":"<button id=\"CancelButton\" class=\"scButton\" TabIndex=\"0\" onclick=\"javascript:return scForm.postEvent(this,event)\" onkeydown=\"javascript:scForm.handleKey(this, event, null, '32')\">Finish</button>","id":"CancelButton"},
{"command":"Focus","value":"CancelButton","scrollintoview":"0"},{"command":"Eval","value":"scUpdateWizardControls();"},
{"command":"SetAttribute","value":true,"id":"BackButton","name":"disabled"},{"command":"Eval","value":"scAlignWizardButtons()"}
]}
关于我的Sitecore环境的一些信息:
Sitecore started
Sitecore.NET 7.0. (rev. 130810)
C:\Inetpub\wwwroot\sc71\Website\bin\Sitecore.Client.dll (Sitecore CMS, Sitecore Client Application, 7.0 rev. 130810)
C:\Inetpub\wwwroot\sc71\Website\bin\Sitecore.Kernel.dll (Sitecore CMS, Sitecore CMS Kernel Library, 7.0 rev. 130810)
C:\Inetpub\wwwroot\sc71\Website\bin\Sitecore.Nexus.dll (Sitecore.Nexus)
Operating system Microsoft Windows NT 6.2.9200.0
Microsoft.NET version 4.0.30319.18051
Process id: 8040
Windows identity used by the process: NT AUTHORITY\NETWORK SERVICE. Impersonation: False
Managed pipeline mode: Integrated
最后,该问题仅影响可装桶的物品。无需禁用事件或其他任何东西,那是一条红鲱鱼。但是,就我而言,我正在使用存储桶和可存储项目,因此需要对其进行修复。
令人反感的代码结束于Sitecore.Buckets.Commands.AddFromTemplateCommand()
。感谢Sitecore支持工程师深入研究此问题。一个对我有用的建议的解决方法如下。这已经报告给Sitecore开发团队,我想它将在Sitecore的未来版本中的某个阶段得到解决。当前(在撰写本文时)的版本Sitecore.NET 7.0. (rev. 130810)
会受到影响。
您将需要用自己的替代现有的实现(请参见下面的代码)。要替换现有的实现,请/App_Config/Includes/Sitecore.Buckets.config
在处覆盖以下配置文件/sitecore/databases/database[@id="master"]
。我最终创建了一个看起来像这样的配置补丁文件。
配置:
<?xml version="1.0"?>
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
<sitecore>
<databases>
<database id="master" singleInstance="true" type="Sitecore.Data.Database, Sitecore.Kernel">
<Engines.DataEngine.Commands.AddFromTemplatePrototype>
<obj patch:instead="obj[@type='Sitecore.Buckets.Commands.AddFromTemplateCommand, Sitecore.Buckets']"
type="Sitecore.Support.Buckets.Commands.AddFromTemplateCommand, MyAssembly"/>
</Engines.DataEngine.Commands.AddFromTemplatePrototype>
</database>
</databases>
</sitecore>
</configuration>
代码:
using Sitecore.Data.Items;
using Sitecore.Text;
using Sitecore.Web.UI.Sheer;
using System;
using System.Web;
namespace Sitecore.Support.Buckets.Commands
{
public class AddFromTemplateCommand : Sitecore.Buckets.Commands.AddFromTemplateCommand
{
protected override Sitecore.Data.Engines.DataCommands.AddFromTemplateCommand CreateInstance()
{
return new AddFromTemplateCommand();
}
protected override void SetLocation(Data.Items.Item item)
{
if ((HttpContext.Current != null) && (Context.ClientPage != null))
{
// This condition is set to go around an issue when a bucket item is created from within a custom wizard app.
// Replace the specified path with your own one.
if (Sitecore.Context.RawUrl != null && !Sitecore.Context.RawUrl.Contains("/sitecore/shell/Applications/Issues/Create Product Bucket.aspx"))
{
UrlString str = new UrlString(Sitecore.Buckets.Util.Constants.ContentEditorRawUrlAddress);
str.Add(Sitecore.Buckets.Util.Constants.OpenItemEditorQueryStringKeyName, item.ID.ToString());
item.Uri.AddToUrlString(str);
UIUtil.AddContentDatabaseParameter(str);
SheerResponse.SetLocation(str.ToString());
}
}
}
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句