【问题标题】:Sitecore - how to show templates under specific folder, inside insert options context menuSitecore - 如何在特定文件夹下显示模板,在插入选项上下文菜单中
【发布时间】:2018-02-27 20:27:37
【问题描述】:

假设用户本身能够添加新的分支模板。

在主页项目上,插入选项必须由该分支模板文件夹内的项目组成。

在 sitecore 中,插入选项只能设置到特定项目。当我选择一个文件夹作为插入选项时,sitecore 会显示该文件夹项(这是完全正常的)。

我需要做一些事情,比如在特定文件夹中动态显示项目,或者设置插入选项浏览对话框的起始路径。

这有可能吗?

【问题讨论】:

    标签: sitecore content-editor


    【解决方案1】:

    博文:https://sitecorealekseyshevchenko.wordpress.com/2017/09/19/dynamic-insert-options/

    创建“动态插入选项”模板,其中包含唯一的字段“起始路径”类型为“Droptree”,源值为“ {3C1715FE-6A13-4FCF-845F-DE308BA9741D}' - '/sitecore/templates' 项的 ID。

    然后将“Dynamic Insert Option”模板添加到模板的“Base template”字段中的模板列表中,该模板应具有动态插入选项。

    使用此类配置修补“uiGetMasters”处理器:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
      <sitecore>
        <processors>
          <uiGetMasters>
            <processor mode="on"
                       type="DynamicInsertOption.Processors.GetDynamicInsertOption, DynamicInsertOption"
                       patch:before="processor[@type='Sitecore.Pipelines.GetMasters.CheckSecurity, Sitecore.Kernel']" />
          </uiGetMasters>
        </processors>
      </sitecore>
    </configuration>
    

    实现 GetDynamicInsertOption 处理器:

    namespace DynamicInsertOption.Processors
    {
        using Sitecore.Data.Items;
        using Sitecore.Diagnostics;
        using Sitecore.Pipelines.GetMasters;
    
        public class GetDynamicInsertOption
        {
            public void Process(GetMastersArgs args)
            {
                Assert.ArgumentNotNull(args, "args");
    
                var startingPath = args.Item["Starting Path"];
    
                if (!string.IsNullOrEmpty(startingPath))
                {
                    for (int i = args.Masters.Count - 1; i > -1; i--) { args.Masters.RemoveAt(i); }
    
                    var startingFolder = args.Item.Database.GetItem(startingPath);
    
                    foreach (Item master in startingFolder.Children) { args.Masters.Add(master); }
                }
            }
        }
    }
    

    结果见下图:

    【讨论】:

    • 它就像一个魅力,谢谢。但是foreach (var master in args.Masters) { args.Masters.Remove(master); } 行抛出了一个错误collection is modified 所以我用for循环替换了它for (int i = args.Masters.Count - 1; i &gt; -1; i--) { args.Masters.RemoveAt(i); }
    • 感谢您在答案中包含信息,博客文章链接似乎已失效。
    【解决方案2】:

    您可以使用Sitecore Insert Options Rules 代替Sitecore Insert Options

    找到/sitecore/system/Settings/Rules/Insert Options/Rules 项目并使用Insert Options Rule 模板在该节点下创建新项目。现在编辑规则并将其设置为:

    where the item is the Home item or one of its descendants
        and where the parent template is Folder
    add YOUR_TEMPLATE insert option
    

    您可以使用许多其他条件,如果您的要求需要,规则可以更加复杂。

    您可以在这里阅读更多内容:Sitecore Insert Options Rules

    【讨论】:

    • 这与我的问题无关。问题是“添加 YOUR_TEMPLATE 插入选项”必须静态设置为特定对象,我正在寻找动态解决方案。
    • 我想我没有正确理解您的要求。您能否尝试以更广泛的方式描述它或举一些您需要的示例?
    • 我不想将静态项目设置为插入选项,而是分配一个文件夹并将该文件夹下的子项目显示为插入选项。因为会有增删,所以插入选项要动态变化。
    • @Batu 检查我的解决方案。它可以选择一个文件夹并将该文件夹下的子项显示为插入选项。
    • @AlekseyShevchenko 是的,我看到你的解决方案是直接的,现在就应用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多