如何在一个地方管理多个页面的演示文稿详细信息

时间:2014-10-06 08:27:21

标签: sitecore sitecore7.2

我在sitecore中有以下项目结构:

  • 根(标签1)
    • 标签2
    • 标签3
    • 标签4
    < / UL>

    可以通过网址访问项目:

    • /根
      • /根/制表2
      • /根/标签-3
      • /根/标签-4-

    此项为用户和用户呈现标签,可以单击标签并切换到其他标签。 On / root第一个选项卡处于活动状态。

    项目有一些占位符:页眉,页脚,内容,旁边和标签。

    除“tab”占位符外,所有这些项都必须为所有占位符呈现相同的控件。 Tab占位符可以有不同的控件,因此您将在每个选项卡上看到不同的内容。

    这方面的简单解决方案是要求客户编辑所有这些项目的控件。例如,如果他想要在标签上方添加图像,他必须在所有项目上添加此图像:Root,Tab 2,Tab 3,Tab 4。

    但我需要另外一个解决方案,因此客户可以在一个地方编辑控件。但是每个标签可以有单独的控件。

    更新:

    我将使用ajax请求切换标签,但常规GET请求应该适用于此标签,标签的网址应如上所述。 当然,我可以在_Standard Values上为模板指定初始控件集,但是当编辑器在页面编辑器中更改内容时,这应该反映在所有选项卡上。

    到目前为止,我提出了以下解决方案(但在页面编辑器中进行了编辑,但不是对所有选项卡都有效,而是根目录):

    我在管道内创建了处理器(之后:Sitecore.Pipelines.InsertRenderings.Processors.GetItem):

    public class SetRootTabAsContextItem : InsertRenderingsProcessor
    {
        /// <summary>
        /// Processes the specified args.
        /// </summary>
        /// <param name="args">The argumentss.</param>
        public override void Process(InsertRenderingsArgs args)
        {
            Assert.ArgumentNotNull(args, "args");
    
            var contextItem = Context.Item;
            if (contextItem.IsInsideRootTab())
            {
                args.ContextItem = Context.Item.GetRootTabItem();
            }
        }
    }
    

    我还为所有标签创建了其他占位符:tab_1,tab_2,tab_3。 在制表符占位符内部有子布局,其中包含所有这些额外的占位符,但只显示应在特定选项卡上显示的占位符。

    因此,现在所有选项卡的演示文稿详细信息都在根选项卡上配置。感谢这个处理器,我从根选项卡创建的控件在所有选项卡上呈现。

    但遗憾的是,页面编辑器仅在root选项卡上工作。当我在非root选项卡上尝试从页面编辑器添加控件时,我收到javascrip错误,一些空引用。

3 个答案:

答案 0 :(得分:1)

另一种选择是使用基于jQuery / JavaScript的选项卡插件(类似jQuery UI Tabs)。在“根”项中添加选项卡控件,该控件呈现所需的HTML标记(以匹配Javascript选项卡插件的规范)。

Tab控件应该查看它的数据源值,或者如果没有设置,则使用特定模板迭代它自己的子项。您需要确定最适合放置的位置。有时它位于一个全局共享文件夹中,有时它直接位于内容项下面(如果此页面有子导航编号,则将其放在文件夹中)...两者都有优点和缺点,但它归结为设计选择根据要求和偏好。

您的网址会略有变化,您将使用哈希而不是特定路径,但最终结果将是相同的。你可以在我链接的标签页上看到一个很好的例子。

  • /根
  • / root#tab-2
  • / root#tab-3
  • /根#制表4

所以页面的其余部分完全相同。此外,这样做的一个优点是没有页面重新加载以显示内容。

请记住使用页面编辑器设计组件时,Javascript有时会使用附加标记Sitecore注入,但您可以Detect Page Mode in Javascript

修改

就个人而言,除非选项卡中存在大量数据,否则我不会为AJAX加载而烦恼,但那是你的召唤。

另一种方法是在ItemResolver之后插入一个处理器,它检查当前请求是否用于Tab模板。如果是这样,请将Context.Item设置为父级。然后,您可以使用某些Javascript切换到正确的选项卡,以提取当前URL的最后部分(应该与您的选项卡ID相同)。如果您使用正确的控件并正确设置项目,那么PageEditor也应该有效。

如果您需要AJAX加载标签数据,这很棘手,因为请求标签网址会重定向用户(本质上)。您可以在AJAX调用中传递一个额外的参数,例如?request = ajax或检查请求类型。处理器可以跳过它的逻辑并返回选项卡内容。这当然不适用于PageEditor,因此您需要在子布局中添加一些逻辑到check if the Page is in editing mode,这将使用AJAX回归到NOT。

答案 1 :(得分:0)

可以通过从一个模板继承所有选项卡(tab-1,tab-2,tab-3)来解决它:tab。然后,您可以为选项卡模板的 __标准值设置演示文稿。然后,您将能够仅更改选项卡项上所需的控件。

答案 2 :(得分:0)

我的第一个选择是使用Components来实现这一目标。 页眉,页脚,内容和旁边可以是共享相同数据源的组件,选项卡可以是添加到页面的组件。

有关组件的一些帖子:

http://www.nonlinearcreations.com.br/Digital/how-we-think/articles/2014/03/4-patterns-Sitecore-component-development.aspx

http://johnnewcombe.net/blog/sitecore-part-2

你也应该谷歌...

另一种选择 - 我不太喜欢 - 将是Alias的使用。您可以拥有一个包含多个Alias的单个页面,然后您可以使用基于请求URL的Sitecore个性化来确定您的选项卡组件指向哪个数据源。