【问题标题】:Update Kentico document field regardless of versioning无论版本如何,都更新 Kentico 文档字段
【发布时间】:2017-01-05 15:25:53
【问题描述】:

我的一种基本页面类型中有一个字段,我需要从外部数据馈送以编程方式更新它,以便将其包含在我的智能搜索索引中。

文档是版本化的,但我想更新此字段的发布值,而不管签出状态如何,并且显然避免在签入文档时进行任何形式的覆盖。

该字段不会出现在编辑器表单上 - 或者理想情况下,将有条件地显示给全局管理员。

似乎使用 API 更新文档而不执行 CheckOut 会静默失败。但是,如果我在结帐页面上执行Checkout/Update/CheckIn,我认为作者会丢失他们的工作吗?

有什么方法可以通过 Kentico 数据模型和 API 处理这个“无版本”字段?

【问题讨论】:

    标签: kentico


    【解决方案1】:

    我认为没有办法更新已签出的页面。您可以直接更新页面类型表,但正如您所提到的,当他们签入时它将被覆盖。您可以更新版本历史记录,我相信对签出的当前数据进行更改,但同样,我认为这会如果用户取消,就会丢失。

    我能想到的解决您的问题的唯一方法是创建另一个表,将您想要的值映射到页面。然后你就不用担心页面被签出,你只需要抓取documentID什么的。由于该值不会显示给编辑器,因此您只有一个在此表上进行查找的字段。

    【讨论】:

    • 我已经尝试过了,但我需要智能搜索索引中的数据。我尝试通过 CMS.DocumentEngine.DocumentEvents.GetContent.Execute 处理程序添加自定义字段,但智能搜索查询似乎与添加的字段不匹配。
    • 那么可能需要创建一个自定义搜索索引。可能是最简单的解决方案。
    • 我在搜索中使用了文档中的大量字段,我不确定这是否能解决我遇到的查询解析问题,但可能值得一试。
    【解决方案2】:

    首选且正确的方法是使用 API,但正如您所说,如果用户已经签出某些内容并正在处理它,或者它在工作流程中但尚未发布,则会导致问题。

    如果您要更新的字段是特定于页面类型的,那么我可以特别想到一件事,那就是直接进入数据库到页面类型的数据库字段并对该字段执行更新。

    注意:除非您明确知道自己在做什么并对其进行了全面测试,否则不建议这样做

    直接访问数据库的缺点是这不会更新当前版本,因为您正在使用签入/签出和工作流程。您还需要更新已签出的当前版本,这意味着您需要:

    1. 转到cms_documents 表中的文档本身并获取您正在使用的文档。
    2. 然后使用字段DocumentCheckedOutVersionHistoryIDDocumentPublishedVersionHistoryID' you can get the version history IDs of the document from theCMS_VersionHistory` 表。
    3. 然后您可以对CMS_VersionHistory 和您的自定义页面类型字段执行更新。
    4. 然后,您需要查看CMS_WorkflowHistory 表,了解该文档是否在工作流程中以及在哪个步骤中。
    5. 完成该工作流程历史记录步骤后,使用VersionHistoryID 字段返回CMS_VersionHistory 表并使用您的数据更新该记录。

    同样,这不是一个优雅的解决方案,因为您使用的是签入/签出和工作流程,但经过一些反复试验和测试后,您应该能够弄清楚。

    更新
    您还可以添加自定义表或其他一些链接数据库表,这将允许您创建全局处理程序。链接表将是您通过 API 和其他调用执行更新的地方,无需版本控制或工作流程。然后,当用户更新特定页面类型时,您可以检查链接表的上次更新时间,并在更新该特定页面时更新您需要的字段(当然是通过节点和文档 ID)。

    【讨论】:

    • 谢谢。这是对数据库的大量挖掘(并且需要根据我所看到的内容更新一些 XML 字段),但到目前为止似乎是唯一的解决方案。似乎 Kentico 需要考虑未版本化字段的概念。
    • 你会如何处理@techphoria414?它是否指定了对象中的每个字段?刚刚有了另一个想法,请查看更新。
    • 啊,我看到 Zach 已经在我发布的更新行中提出了一些建议。
    • 是的,可能会回到我原来的自定义表格方法,我想我已经解决了让我远离它的索引问题。
    • 这是一个非常好的想法@techphoria414,如果您还没有,请在 Kentico Ideas 板上提交该想法ideas.kentico.com
    【解决方案3】:

    很遗憾,您必须使用 API 签入和签出。查看示例here

    此外,您可能需要发布它以反映实时网站上的更改。

    【讨论】:

    • 如果作者已经签出了内容怎么办?
    • 什么都不会发生,因为执行将停止 @ if (!page.IsCheckedOut) 行
    • 这根本没有解决我的问题。我知道如何结帐,但无论如何我都需要更新此字段。
    • 如果已签出,您可以尝试签入,但不确定是否可以在其他用户签出时进行。
    • 直接 sql 查询到数据库无论如何都可以工作,但是不推荐这种方法。
    猜你喜欢
    • 2010-11-10
    • 2020-08-10
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 2015-04-12
    • 2016-09-15
    相关资源
    最近更新 更多