Sitecore - 规则引擎字段类型上的动态操作

时间:2016-07-04 08:45:30

标签: sitecore sitecore8 rule-engine sitecore-mvc

我们在模板上有一个规则字段类型,我们希望设置为规则引擎的操作,以将数据源更改为规则字段所在项目的子项之一。

我尝试创建自定义宏但无法获取我们从内部修改的项目的ID。

"文字:" /sitecore/templates/System/Rules/Action模板的字段仅接受硬编码的root路径:

set data source to [DataSource,Tree,root=/sitecore/content/data/item1/item1a/&setRootAsSearchRoot=true,Item] 

我们希望能够将其设置为动态的内容,例如:

set data source to [DataSource,Tree,root=query:./*&setRootAsSearchRoot=true,Item]

有没有办法从宏内部获取规则字段所在的项目?或者我是否需要像扩展规则字段类型那样极端的东西?

1 个答案:

答案 0 :(得分:3)

你能做到吗?是的,但不幸的是它会非常脏,可能需要一些额外的时间来开发和测试。

问题

每当您决定创建自定义宏时,首先要注意的是,当您运行宏时,您将没有项目上下文,并且您的站点上下文将是shell。换句话说:

  • Sitecore.Context.Siteshell
  • Sitecore.Context.Itemnull

这意味着您将无法确定您的上下文项目实际是什么,甚至无法确定它所属的站点。

更糟糕的是,请注意您的上下文数据库将是core。换句话说:

  • Sitecore.Context.Databasecore

这意味着您将需要一个自定义处理器来解析上下文数据库,站点和项目,然后将项目存储在Session中供您使用。

解决方案概念

你需要做两件事才能让它发挥作用:

  1. 创建一个自定义处理器,为您解析和存储“上下文”项目
  2. 创建一个自定义树宏,该宏支持接受Sitecore查询的备用root参数
  3. 内容编辑器解决方案

    如果要在内容编辑器中进行此操作,则必须使用在显示项目字段时运行的管道。我对此进行了一些研究,我认为您将最容易添加到<getContentEditorFields>管道。

    这里的想法是,当内容作者导航到内容编辑器中的项目时,将运行此管道以获取要显示的所有字段。当此管道正在运行时,您的处理器将抓取该项并将其存储在Session中,以供您在宏中使用。

    请注意,我没有测试过这个,但这个概念应该有效。然而,这个解决方案的最大缺陷是它在体验编辑器中不起作用。

    体验编辑解决方案

    根据OP中的描述,我认为此解决方案不适合您,但我已将其包含在内以防万一。

    如果您知道您的内容作者只会使用此规则进行个性化或类似于体验编辑器中的规则,您可以使用体验编辑器的内容创作流程来解决您的上下文。

    这里的想法是,当内容作者在体验编辑器中导航到该页面时,会运行典型的Sitecore管道,您可以使用它们,特别是<httpRequestProcessed>管道来解析和存储上下文item,来自sc_itemid查询字符串参数。

    请注意,我没有对上述内容进行测试,并且我已经从original source调整了此解决方案。逻辑是合理的,但最大的缺陷是内容编辑器不起作用。

    <强>结论

    现实情况是,为了保护您的内容作者不必遍历树中的Context Item,需要执行大量工作。我知道这对他们的体验会更好,并且可以帮助实施某些限制,例如:所选项目必须是子/后代,但成本相当高。

    如果您确实需要这样的实现,我的建议是将孩子/后代检查纳入您的条件/行动。如果所选项目不是子项/后代,那么您将中止该规则,记录错误并向用户显示错误弹出窗口。它不是同一个用户体验,但它不需要肮脏的黑客和大量的工作时间。