0

我被一些开发烦恼困住了。我已经创建了一个应用程序来扩展 Sitecore 创作界面。在 Sitecore 中创建新内容项之前,该应用程序会查询一些内部服务并询问内容作者的一些额外问题。我已经在 (Sitecore.Shell.Applications.Templates.CreateTemplate.CreateTemplateForm) 上为应用程序建模。

我遇到的问题是,一旦创建了一个项目,我的 WizardForm 就会重新加载以加载新创建的项目。我想要的是向导进入“最终”页面并在模式对话框关闭后重新加载主 UI。新的 OOTB 模板向导的工作原理。我知道,如果我将我的项目创建代码注释掉,那么 UI 的行为将符合预期。看起来项目的创建会在 UI 响应的背景中生成一些事件,并使用新创建的项目重新加载我的模式对话框。(我尝试了以下解决方案http://sdn.sitecore.net/Forum/ShowPost.aspx?postid=29092http://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;

和 OLSO

        Item item;
        using (new EventDisabler())
        {
            item = container.Add(ItemUtil.ProposeValidItemName(this.Title.Value), Settings.ProductImageTemplateID);
        }

所有的结果都是一样的。一旦我到达创建项目的页面,向导模式对话框就会重新加载。使用提琴手我可以看到重新加载窗口的命令已发送到客户端。我只是不知道如何告诉 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, &#39;32&#39;)\">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
4

1 回答 1

0

最后,问题只影响了可存储的项目。无需禁用事件或任何东西,这是一个红鲱鱼。但是,就我而言,我正在使用存储桶和可存储的物品,所以我需要修复它。

有问题的代码以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());
                }
            }
        }
    }
}
于 2013-09-26T12:22:49.713 回答