2011-07-29 79 views
3

我已经根据Data Definition Cookbook中的内容创建了一些简单的命令,其中用户交互是右键单击项目 - >插入 - > MyCommand,然后是一个简单的对话框,显示“您是否真的想要这样做” 。那很棒。如何使用Sitecore ShowControlPopup与用户进行对话交互?

现在我想要一个允许我在对话框中与用户进行更多交互的命令。我需要添加几个单选按钮列表,以便用户可以选择选项,然后使用按钮来运行该命令。我想我需要为此使用ShowControlPopup。我创建了一个控件(ascx)来定义弹出窗口的样子(并发布了一个测试版本,以查看它在Sitecore中的基本控件)。不过,我不确定ShowControlPopup的参数究竟是什么。

第一个paratered被称为“Id” - 我在这里放什么ID?使用弹出控件的项目的ID?

第二个参数被称为“where” - 我猜这是弹出窗口的URL。内容项目是否需要存在,还是仅仅是一个虚拟URL?

第三个参数叫做“controlId” - 我在这里放什么样的ID?我已经尝试过我的控件的id,它定义了弹出窗口,但是我收到一个错误,提示无法找到控件。

当用户在对话框中选择了他们的选项并单击“确定”时,处理该事件的是什么?命令类的Run方法或弹出控件的代码隐藏中的事件处理程序?

这是我的代码到目前为止。如果尝试创建控件时出现错误,说明无法找到带有ID的项目。我刚刚猜测弹出控件想要了解的项目。

protected void Run(Sitecore.Web.UI.Sheer.ClientPipelineArgs args) 
{ 
if (args.IsPostBack) 
{ 
    if (args.HasResult) 
    { // normally code here would run when the dialog box is completed by the user. Is that so in this case? 

    } 
} 
else 
{ 
    Sitecore.Context.ClientPage.ClientResponse.ShowControlPopup("F3684C4C-D9EF-4796-A471-5B05553119B6", 
       "http://mysite/dummy.aspx", 
       "B8D503D0-AEBE-43AE-B924-C3849F03E90D"); 

    args.WaitForPostBack(); 
} 
} 

干杯,

詹姆斯。

Sitecore的6.2转091012/Win7的32位/ IIS7 /的SQLExpress 2008(仅限本地开发)

+0

纯粹的UI只是完全无证......是我一直抱怨到Sitecore的几次,但我还没有看到任何更新。如果你还没有这样做,我建议为此打开一个支持请求。 – Bryan

+0

我发现实现Sheer组件的最简单方法是找到一个接近你想要的对话框,然后使用反射器来复制和修改你需要的。例如,在物理文件中搜索“设置发布”以查找发布限制对话框。打开XML文件并查找“Codebeside”类。然后是从功能区挖掘命令并复制拨打电话的方式。 – dmgdotnet

+0

感谢Bryan&dmgdotnet。我用Sitecore打开了一个支持案例。我会发布他们提供的任何有用的答案。我会看看Sitecore的代码,但我不确定我现在有空。我可能只是创建一些不同的命令来处理可能出现的不同场景。 –

回答

4

只是为了记录在案,Sitecore的支持带回来一些答案

1) “ID” 是的ID弹出的项目是

2)“Where”是相对于“Id”的位置。例如上方,下方,右下面

3)“控件ID”是被弹出从Sitecore的

实例使用ShowPopupControl是主菜单和上下文菜单项目的ID。

此外,SheerUI仍然没有文档,我被告知只需在Sitecore代码库中查找示例。我们可以看看Sitecore的代码真是太棒了,但是一个小方向会很棒。即使doco只是简单地说“为了使用ShowPopupControl,UI例子x可以在dll中的y类中找到”。

命令& popup的生命可以用弹出窗口中的代码隐藏或命令本身完成。这取决于最终的args.WaitForPostBack(),它也可以是'args.WaitForPostBack(true)or 'args.WaitForPostBack(false)

最后,我去了ShowModalDialog(),因为这实际上是我想要的,而不是用户可以点击的弹出框。

所以我的代码最终看上去像这样

protected void Run(Sitecore.Web.UI.Sheer.ClientPipelineArgs args) 
{ 
    if (args.IsPostBack) 
    { 
     ;// we never come here becuase we have set waitforpostback to false. all processing is handled by the popup control 
    } 
    else 
    { 
     Sitecore.Text.UrlString popUpUrl = new Sitecore.Text.UrlString("/sitecore/content/MYSITE/MyControlPageItem.aspx"); 
     popUpUrl.Append("id", args.Parameters["id"]); 
     popUpUrl.Append("database", args.Parameters["database"]); 
     popUpUrl.Append("language", args.Parameters["language"]); 
     Sitecore.Context.ClientPage.ClientResponse.ShowModalDialog(popUpUrl.ToString(),"400", "600", "", true); 

     args.WaitForPostBack(false); // if this is true this command will wait for the modal dialog created above to close 
             // at which time the Run method will check for postback & args 
    } 
}