9

我对 Tridion 还很陌生,我必须实现允许内容编辑器创建组件并为其分配多个日期范围(可用日期)的功能。这些将需要从代理查询以提供搜索功能。

最初,这只需要一个开始和结束日期,因此被实现为单独的元数据字段。

我建议在架构的“可用日期”元数据字段中使用嵌入式架构,以允许分配多个开始和结束日期。

但是,由于该字段现在允许多个值,因此数据在代理中存储为“KEY_STRING_VALUE”列中的逗号分隔值,而不是“KEY_DATE_VALUE”列中的日期值,因为它只允许单个开始值和结束值。

例如。
KEY_NAME | KEY_STRING_VALUE
结束日期 | 2012-04-30T13:41:00、2012-06-30T13:41:00
开始日期 | 2012-04-21T13:41:00, 2012-06-01T13:41:00

这现在导致我的代理查询出现问题,因为我不能再使用简单的查询逻辑来检索基于日期进行搜索所需的项目。

在我开始编写 C# 逻辑来解析这些逗号分隔的日期并根据这些日期进行搜索之前,我想知道是否有人过去有类似的要求/经验并以不同的方式实现了这一点,以减少所需的代码解析量和使用代理查询来完成搜索。

我正在 Tridion 2009 上开发它,但使用 5.3 Broker(出于遗留原因),因此查询当前看起来像这样(对于单个开始/结束日期):

query.SetCustomMetaQuery((KEY_NAME='end_date' AND KEY_DATE_VALUE>'" + startDateStr + "') AND (ITEM_ID IN(SELECT ITEM_ID FROM CUSTOM_META WHERE KEY_NAME='start_date' AND KEY_DATE_VALUE<'" + endDateStr + "')))";

任何帮助是极大的赞赏。

4

2 回答 2

10

只是想回来并详细说明如果其他人面临同样的情况,我最终是如何解决这个问题的。

我向客户提出了设定数量的字段(如 Miguel 所建议的那样),但客户对这种级别的限制不满意。

因此,我最终实现了包含开始和结束日期的可嵌入模式,它提供了最大的灵活性。但是,Broker API 的限制意味着我必须直接访问 Broker DB - 这并不理想,但客户端已同意获取所需功能的方法。显然,如果将来进行任何升级,则需要重新考虑这一点。

所有日期和可用期间的处理都是在 C# 中完成的,这意味着该解决方案的性能实际上相当不错。

我确实发现导致一些问题的一件事是,如果您有多个使用嵌入式架构的字段值(即在这种情况下,多个开始和结束日期),则元数据存储在CUSTOM_META表的KEY_STRING_VALUE列中. 但是,如果您在字段中只有一个值(即一个开始和结束日期),那么这些值将作为日期存储在KEY_DATE_VALUE列中,就像您只使用单个字段而不是可嵌入模式一样。对于 Tridion 来说,这似乎是一种明智的做法,但它在编写查询和解析代码时会稍微复杂一些!

于 2012-04-30T13:34:34.490 回答
3

这是一个复杂的场景,因为您必须遍历所有 DCP 并解析这些字符串以确定是否匹配搜索条件

有一种方法可以将元数据(逗号分隔)转换为代理中的单个值,但字段的名称需要不同 Range1、Range2、....、RangeN 您可以使用部署程序扩展来执行此操作更改包的 XML 结构并将每个字符串转换为不同的值(1,2,..,n)。如果您不熟悉部署程序扩展并且不能 100% 解决您的方案,则此扩展可能需要一些时间。

这样做的问题是您仍然必须应用几个条件来检索这些值,并且您必须设置一个限制(与可以根据需要添加任意值的用户相比)

样本:

query.SetCustomMetaQuery((KEY_NAME='end_date1'
query.SetCustomMetaQuery((KEY_NAME='end_date2'
query.SetCustomMetaQuery((KEY_NAME='end_date3'
query.SetCustomMetaQuery((KEY_NAME='end_date4'

实现这一目标的最快和最简单的方法可能是使用多值字段,使用不同的字段。我知道这不是最通用的场景,并且存在业务需求影响,但可以简化开发。

我之前的评论是在仅使用 Broker API 的上下文中,但如果它是您架构的一部分,您可以利用搜索引擎。您可以索引代理数据库并处理数据。使用搜索引擎 API,您可以提取组件/组件模板的 id,并使用代理 API 来检索正确的信息

于 2012-04-25T15:31:38.097 回答