我有一个由MediaWiki提供支持的公司Wiki。我编写了一些代码来添加页面锁定功能,这样当用户编辑页面时,他们会在页面上获得15分钟的锁定,他们可以在到期之前随时续订。
如果用户编辑页面,然后单击“保存”,然后单击浏览器的后退按钮返回编辑表单,一切看起来都正常,用户认为一切正常,但这里是踢球者:它不会创建页面上的新锁。告诉用户在页面上有锁定的消息,但我认为这仅仅是因为它是页面的缓存版本;消息中的过期时间是从他们编辑的第一个时间锁定到期的时间,不是使用后退按钮。
我尝试将HTML meta
标记添加到head
标记内的页面以使缓存无效/不缓存编辑页面,但这不起作用,因为MediaWiki PHP页面生成器会覆盖此
现在我有一个非常草率的修复;我使用JavaScript模拟按下浏览器前进按钮,例如在编辑页面上向前移动历史记录。如果不存在较新的历史记录项(例如,他们点击了实际的“编辑”按钮而不是使用浏览器后退按钮)它只是什么都不做,但如果他们通过后退按钮访问编辑页面,它会简要显示页面大约一秒钟,直到JavaScript加载,然后重定向到历史记录(在按下后退按钮之前将它们放回原处)。是的,这是有效的,但在我看来,这是一个非常糟糕的解决方案,因为它不是非常无缝/用户友好,可能会让用户感到困惑或让他们认为浏览器出了问题。
更好的解决方案是强制用户重新提交表单,从而打开编辑页面的“新鲜”版本,我实际上不确定为什么它还没有这样做。我的意思是,当用户通过浏览器后退按钮访问编辑页面时,我希望它显示“确认表单重新提交”错误页面。例如谷歌Chrome:
我认为这会通过强制重新提交表单来解决问题,我相信这会创建实际的页锁。如果我错了,请纠正我。
我认为页面锁定代码不是很相关,因为问题的原因只是后退按钮将它们带到页面的缓存版本而不是“新”版本,但是如果你不这么认为,随便问一下。只是让我知道要发布的代码部分,我将添加它们。
答案 0 :(得分:1)
找一些能给你OuputPage的钩子(我不熟悉它们,但可能是OutputPageBeforeHTML?)并在编辑页面上调用OuputPage::enableClientCache(false)
。
答案 1 :(得分:0)
我认为@devpro评论与您的问题有关,但其含义应该颠倒过来。 Mediawiki 已经具有阻止用户在稍后点击“刷新”或“返回”按钮时看到“重新提交”警告的机制 - 在提交表单后,它将用户(通过302重定向)重定向到该页面编辑。
这样,如果用户决定在编辑后立即刷新页面,或者如果他发布了表单,则导航到另一个页面并按下“返回”按钮 - 他将不再重新提交表单。
几乎不可能改变这种行为(它深深埋藏在Mediawiki核心中),但事件是否有可能 - 你不应该这样做,直到你想让你的编辑完全混淆。
后端没有解决方案,因为表单页面是从浏览器缓存加载的,但你仍然可以使用js来防止这种情况,而Mediawiki JS界面可以帮助解决这个问题:
创建将JS脚本添加到“查看”操作的扩展程序,使其跟踪变量wgPostEdit
(see more),该变量仅在保存页面后才会填充。设置此变量后 - 使用this trick在用户尝试导航时显示警告。