【问题标题】:How to prevent same page editing collision in Wagtail CMS?如何防止 Wagtail CMS 中的同一页面编辑冲突?
【发布时间】:2019-06-21 09:42:41
【问题描述】:

我们有一个包含多个编辑器的 Wagtail 网站,我想知道如何防止 Wagtail CMS 中的同一页面编辑冲突?

我知道 Wagtail 有一个内置页面锁定 source,但它会为所有人锁定页面并阻止所有编辑。

能够锁定或解锁此页面(及其下方的任何页面)以进行编辑,防止用户对其进行任何进一步的编辑。

我发现 https://github.com/wagtail/wagtail/issues/448 似乎正在解决我的问题,但它已关闭未解决。

我很想知道

  1. 如何防止两个或多个编辑者使用 Wagtail CMS 同时编辑同一页面?

或者如果 1. 太复杂而无法实现

  1. 如何检测页面编辑冲突并在 Wagtail UI 中警告编辑者他们可能正在编辑同一页面?

【问题讨论】:

  • 目前的锁机制有什么问题?因为如果你想防止多个编辑者编辑同一个页面,那么它是完成这项工作的完美工具。是不是限制太多(因为它也锁定了所有子页面)?难道是手动操作?还是您仍然需要一些编辑器才能编辑锁定的页面?
  • 当前锁定机制为所有人锁定页面。它旨在让版主(编辑默认无权使用锁)表达“这是页面的最终版本,请勿触摸它”。通过使用页面锁定,我将包括我自己在内的所有人锁定在页面编辑之外。我必须解锁页面才能进行编辑,如果页面已解锁,任何人都可以同时编辑该页面,这会导致编辑冲突。
  • 哦,对了。我实际上误解了当前的锁定机制抱歉。
  • 注意这种行为在 Wagtail 2.8 中发生了变化:docs.wagtail.io/en/stable/releases/… "页面锁定功能已经过修改,因此锁定页面的编辑器被赋予了对它的独占编辑访问权限,而不是变成只读的大家。新的报告菜单允许管理员/版主级别的用户查看当前锁定的页面,并在需要时解锁它们。”

标签: wagtail


【解决方案1】:

为了在编辑前发出警告或完全阻止编辑,我认为你最好的选择是before_edit_page hook(但要小心,它同时运行在GETPOST 请求上),因为它不是目前可以使用custom page permissions

这仍然给我们留下了一个更大的问题,如何检测用户正在编辑页面?没有任何内置的,不幸的是,我认为没有一个简单的解决方案。以下是一些想法:

钩子:使用before_edit_pageafter_edit_page 钩子设置某种标志,我们称之为软锁。然而这很快就失败了,如果用户关闭页面而不保存任何更改(after_edit_page 永远不会被调用并且软锁标志永远不会被删除)怎么办?可以实现超时,但在有人编辑页面时它仍然可能超时(但只是需要很长时间),或者仍然会浪费一些时间,因为他们需要等待超时发生。

Ping: 注入一些 JavaScript(通过 insert_editor_js hook),它将使用当前用户和页面 ID ping 自定义端点。这可以使用比挂钩和超时选项更精细的频率。

手动创建一些自定义软锁定/软解锁动作(通过register_page_listing_buttons and register_page_listing_more_buttons hooks)手动使用。

编辑:有一个新的有趣的包,Wagtail-Websockets,它可能会解决这个问题。

【讨论】:

  • 建立一个通用的页面编辑锁定机制是困难的,因为它取决于编辑器在编辑器使用它时对页面的意图。这可能是 Wagtail 没有此功能的原因。感谢您提供所有这些选项。
  • @mojeto,我添加了一个指向新的开源包的链接,该包也试图解决页面锁定问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-31
  • 1970-01-01
  • 2012-05-18
  • 1970-01-01
相关资源
最近更新 更多