我在sitecore中有以下项目结构:
可以通过网址访问项目:
此项为用户和用户呈现标签,可以单击标签并切换到其他标签。 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错误,一些空引用。
答案 0 :(得分:1)
另一种选择是使用基于jQuery / JavaScript的选项卡插件(类似jQuery UI Tabs)。在“根”项中添加选项卡控件,该控件呈现所需的HTML标记(以匹配Javascript选项卡插件的规范)。
Tab控件应该查看它的数据源值,或者如果没有设置,则使用特定模板迭代它自己的子项。您需要确定最适合放置的位置。有时它位于一个全局共享文件夹中,有时它直接位于内容项下面(如果此页面有子导航编号,则将其放在文件夹中)...两者都有优点和缺点,但它归结为设计选择根据要求和偏好。
您的网址会略有变化,您将使用哈希而不是特定路径,但最终结果将是相同的。你可以在我链接的标签页上看到一个很好的例子。
所以页面的其余部分完全相同。此外,这样做的一个优点是没有页面重新加载以显示内容。
请记住使用页面编辑器设计组件时,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://johnnewcombe.net/blog/sitecore-part-2
你也应该谷歌...
另一种选择 - 我不太喜欢 - 将是Alias的使用。您可以拥有一个包含多个Alias的单个页面,然后您可以使用基于请求URL的Sitecore个性化来确定您的选项卡组件指向哪个数据源。