Sitecore - 对规则引擎字段类型的动态操作
Sitecore - Dynamic actions on the Rules engine field type
我们在模板上有一个规则字段类型,我们希望设置为规则引擎的操作,以将数据源更改为规则字段所在项目的子项之一。
我已尝试创建自定义宏,但无法从内部获取我们正在修改的项目的 ID。
/sitecore/templates/System/Rules/Action
模板的"Text:"字段只接受硬编码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]
有没有办法从宏内部获取规则字段所在的项目?或者我是否需要一些极端的东西,比如扩展规则字段类型?
你能做到吗?是的,但不幸的是,它真的很脏,可能需要一些额外的时间来开发和测试。
问题
当您决定创建自定义宏时,首先要注意的是,当您的宏 运行 时,您将没有项目上下文,而您的站点上下文将是 shell
.换句话说:
Sitecore.Context.Site
: shell
Sitecore.Context.Item
: null
这意味着您将无法确定您的上下文项实际上是什么,甚至无法确定它所属的站点。
更糟糕的是,请注意您的上下文数据库将 core
。换句话说:
Sitecore.Context.Database
: core
这意味着您将需要一个自定义处理器来解析上下文数据库、站点和项目,然后将项目存储在 Session
中供您使用。
解决方案概念
您需要做两件事才能使其正常工作:
- 创建一个将为您解析和存储 "context" 项目的自定义处理器
- 创建一个支持替代
root
参数的自定义树宏,该参数接受 Sitecore 查询
内容编辑器解决方案
如果您想在内容编辑器中完成这项工作,您将必须在显示项目字段时接入 运行 的管道。我对此做了一些研究,我认为您将最轻松地添加到 <getContentEditorFields>
管道。
这里的想法是,当内容作者导航到内容编辑器中的项目时,此管道将 运行 获取要显示的所有字段。虽然此管道正在 运行ning,但您的处理器正在抓取该项目并将其存储在 Session 中以供您在宏中使用。
请注意,我还没有对此进行测试,但这个概念应该可行。然而,此解决方案的最大缺陷是它无法在体验编辑器中运行。
体验编辑器解决方案
根据 OP 中的描述,我认为此解决方案不适合您,但我将其包括在内以防万一。
如果您知道您的内容作者只会将此规则用于个性化或来自体验编辑器的类似内容,您可以利用体验编辑器的内容创作流程来解决您的上下文。
这里的想法是,当内容作者在体验编辑器中导航到该页面时,典型的 Sitecore 管道是 运行,您可以使用它们,特别是 <httpRequestProcessed>
管道,从 sc_itemid
查询字符串参数解析和存储上下文项。
请注意,我没有测试上面的内容,我已经从它的 original source 中改编了这个解决方案。逻辑是合理的,但最大的缺陷是这在内容编辑器中不起作用。
结论
现实情况是,要使您的内容作者不必向下遍历到树中的上下文项,需要执行大量工作。我知道这对他们的体验会更好,并且可以帮助执行某些限制,例如所选项目必须是child/descendant,但成本很高。
如果您确实需要实现这样的功能,我的建议是将 child/descendant-check 合并到您的 condition/action 中。如果所选项目不是 child/descendant,那么您将中止规则,记录错误并向用户显示错误弹出窗口。它不是相同的用户体验,但不需要肮脏的黑客和大量的时间来完成。
我们在模板上有一个规则字段类型,我们希望设置为规则引擎的操作,以将数据源更改为规则字段所在项目的子项之一。
我已尝试创建自定义宏,但无法从内部获取我们正在修改的项目的 ID。
/sitecore/templates/System/Rules/Action
模板的"Text:"字段只接受硬编码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]
有没有办法从宏内部获取规则字段所在的项目?或者我是否需要一些极端的东西,比如扩展规则字段类型?
你能做到吗?是的,但不幸的是,它真的很脏,可能需要一些额外的时间来开发和测试。
问题
当您决定创建自定义宏时,首先要注意的是,当您的宏 运行 时,您将没有项目上下文,而您的站点上下文将是 shell
.换句话说:
Sitecore.Context.Site
:shell
Sitecore.Context.Item
:null
这意味着您将无法确定您的上下文项实际上是什么,甚至无法确定它所属的站点。
更糟糕的是,请注意您的上下文数据库将 core
。换句话说:
Sitecore.Context.Database
:core
这意味着您将需要一个自定义处理器来解析上下文数据库、站点和项目,然后将项目存储在 Session
中供您使用。
解决方案概念
您需要做两件事才能使其正常工作:
- 创建一个将为您解析和存储 "context" 项目的自定义处理器
- 创建一个支持替代
root
参数的自定义树宏,该参数接受 Sitecore 查询
内容编辑器解决方案
如果您想在内容编辑器中完成这项工作,您将必须在显示项目字段时接入 运行 的管道。我对此做了一些研究,我认为您将最轻松地添加到 <getContentEditorFields>
管道。
这里的想法是,当内容作者导航到内容编辑器中的项目时,此管道将 运行 获取要显示的所有字段。虽然此管道正在 运行ning,但您的处理器正在抓取该项目并将其存储在 Session 中以供您在宏中使用。
请注意,我还没有对此进行测试,但这个概念应该可行。然而,此解决方案的最大缺陷是它无法在体验编辑器中运行。
体验编辑器解决方案
根据 OP 中的描述,我认为此解决方案不适合您,但我将其包括在内以防万一。
如果您知道您的内容作者只会将此规则用于个性化或来自体验编辑器的类似内容,您可以利用体验编辑器的内容创作流程来解决您的上下文。
这里的想法是,当内容作者在体验编辑器中导航到该页面时,典型的 Sitecore 管道是 运行,您可以使用它们,特别是 <httpRequestProcessed>
管道,从 sc_itemid
查询字符串参数解析和存储上下文项。
请注意,我没有测试上面的内容,我已经从它的 original source 中改编了这个解决方案。逻辑是合理的,但最大的缺陷是这在内容编辑器中不起作用。
结论
现实情况是,要使您的内容作者不必向下遍历到树中的上下文项,需要执行大量工作。我知道这对他们的体验会更好,并且可以帮助执行某些限制,例如所选项目必须是child/descendant,但成本很高。
如果您确实需要实现这样的功能,我的建议是将 child/descendant-check 合并到您的 condition/action 中。如果所选项目不是 child/descendant,那么您将中止规则,记录错误并向用户显示错误弹出窗口。它不是相同的用户体验,但不需要肮脏的黑客和大量的时间来完成。