无法将默认设置设为 markdown 模式

您好,我发现即使我将“default_composition_mode”设置为 Markdown 模式,我的论坛用户在开始新主题时仍然会显示富文本编辑器。论坛版本是“Discourse v3.5.0.beta9-dev — Commits · discourse/discourse · GitHub — Ember v5.12.0”。

每次应用更改时,我都会收到提示“您想将此更改应用到历史记录吗?这将更改 15 位现有用户的偏好设置”,然后我点击“是”。即便如此,用户仍然显示富文本编辑器。这是一个已知错误吗?

编辑 - 注意:我遇到的这个问题是针对那些从未尝试过切换富文本/Markdown 编辑器模式的用户。在我周末升级后设置了默认组合模式后,他们今天刚登录。我还通过主题 CSS 隐藏了切换选项。

2 个赞

在此基础上,我们有一个插件使用“wrap_open”BBCode 标记,富文本编辑器尚不支持。因此,我们需要确保暂时保留在 Markdown 模式下。

我使用 Claude Sonnet 生成了以下代码来确保这一点。我很乐意收到关于如何改进它的任何反馈(尤其是如果它有任何错误 :sweat_smile:)。如果这对其他论坛管理员有帮助,也请分享。代码放在主题设置 > JS (/admin/customize/themes/2/common/js/edit) 中:

import {
  apiInitializer
} from "discourse/lib/api";

export default apiInitializer((api) => {
  // 强制将用户的编辑器切换到 markdown 模式
  function switchToMarkdownMode() {
    const currentUser = api.getCurrentUser();

    // 如果编辑器已打开,用户应该已登录
    if (!currentUser) {
      console.error('未找到用户');
      return;
    }

    // 从此处获取此选项
    // https://github.com/discourse/discourse/blob/f0fc5646dc9bd29b0e814faea490e34800e9b322/app/assets/javascripts/discourse/app/models/user.js#L262C1-L266C4
    const currentMode = currentUser.get('user_option.composition_mode');

    if (currentMode !== 0) {
      // 仅在未处于 markdown 模式时切换
      // 示例用法:https://github.com/discourse/discourse/blob/87476ce2c18fb8f856dda7ff03804ed5fbb0ff38/app/assets/javascripts/discourse/app/services/user-tips.js#L127
      currentUser.set('user_option.composition_mode', 0);

      // 将用户偏好设置保存到服务器
      currentUser.save(['composition_mode']).then(() => {
        console.log('已成功切换到 markdown 模式');
      }).catch((error) => {
        console.error('更新组合模式失败:', error);
      });

      // 立即切换当前编辑器界面
      setTimeout(() => {
        const toggleButton = document.querySelector('.composer-toggle-switch[data-rich-editor]');
        if (toggleButton) {
          const isRichTextActive = toggleButton.getAttribute('aria-checked') === 'true';
          if (isRichTextActive) {
            toggleButton.click();
            console.log('已将当前编辑器切换到 markdown 模式');
          }
        }
      }, 100); // 短暂延迟以确保编辑器完全渲染
    } else {
      console.log('已处于 markdown 模式,无需更改');
    }
  }

  api.onAppEvent('composer:opened', () => {
    switchToMarkdownMode();
  });
});

这通常是一种糟糕的做法,依赖于此类事情的时序是很脆弱的。

让我把这个分开,我们当然希望允许管理员将默认值设置为 markdown 模式。

这里最小的可重现步骤是什么?

2 个赞

我明天会尝试重现这个问题并着手修复,但不确定为什么会发生这种情况,因为管理员默认会设置所有用户选项值(如果您在提示中使用现有的用户选项),而这正是我们控制切换开关的全部依据。

2 个赞

感谢您的快速回复!:slightly_smiling_face: 我不确定如何为此创建一个最小化的重现。如果您能分享相关步骤,我很乐意分享我论坛上的任何额外信息。

2 个赞

我今天尝试重现此问题,但没有成功。不过我有一个问题——您更改此设置后,用户是否刷新了浏览器?如果他们没有刷新,我们在浏览器中仍然有他们旧的用户偏好设置数据(在 ember 中),所以新的偏好设置还不会被使用。

为了让它按预期工作,我做了以下操作:

  • 检查用户 A 的编辑器是否已切换到富文本模式
  • 以管理员身份,我将默认设置更改为 markdown 模式并应用于所有用户
  • 以用户 A 的身份,重新加载页面并重新打开编辑器,看到它处于 markdown 模式

如果在第 3 步中没有重新加载,我仍然会看到富文本模式。

1 个赞

感谢你的跟进,Martin。我周日已经将模式设置为 Markdown。然后我在周一使用一个测试账户登录,该账户位于一个单独的浏览器配置文件中,但收到了富文本编辑器。

另外,如果这有帮助的话,每次我将“default_composition_mode”设置为“Markdown”时,我都会收到警告:“您想将此更改应用到历史记录吗?这将更改 61 个现有用户的偏好设置。” 我明白第一次应该出现这个提示,但它每次都为一些用户提示,这似乎是一个 bug。

为了进一步测试,我还登录了另一个已有 10 个月未登录的测试账户。它默认也设置为富文本模式。

1 个赞

这确实很奇怪……你的网站总共有多少用户?我想知道它是否卡在了更新所有用户以应用站点设置更改的步骤,因为我注意到UI中没有任何指示表明工作仍在进行中。

这取决于有多少用户在此期间通过切换更改了它。在我本地测试中,它似乎运行正常。

1 个赞

根据我们的 /about 页面,我们有 20,000 名会员。

我将澄清步骤如下:

  1. 访问 /admin/site_settings/category/all_results?filter=default_composition_mode
  2. 将 default_composition_mode 设置为 Markdown 模式。即使它已经在 Markdown 模式下,您也可以打开下拉菜单并选择 Markdown 选项。
  3. 获取有关 XX 用户数量的警告。接受它。
  4. 等待十分钟,然后重新加载页面。
  5. 将 default_composition_mode 设置为 Markdown 模式(与步骤 2 相同)。
  6. 再次获取有关相同数量用户的警告。

正如您所提到的,我也不知道需要多长时间(超过 10 分钟?)才能更新历史用户偏好设置。而且,我认为在那段时间里,并不是所有用户都会将他们的偏好设置改回来。我可能在这里遗漏了什么。

1 个赞

好的,这听起来确实不会有那么多人在这段时间内进行切换 :thinking: 你能录制一个屏幕录像来展示正在发生的情况吗?

我还建议你查看 Chrome 开发者工具中的“网络”选项卡。保存设置后,你应该会看到类似以下的两个请求(第一个请求用于显示 XX 用户提示,第二个请求用于实际保存设置并执行回填):

image

第二个请求的状态码需要是 200,如果不是 200 并且你离开了页面,那么现有用户将不会被回填。

感谢您提供额外信息。两个请求如下图所示。两者都很快。

视频录制在此云端硬盘链接。我设置了选项,接受了警告对话框,等待了一会儿,重新加载了页面,然后再次设置。之后我再次收到了警告对话框。

1 个赞

好的,情节越来越复杂了……当你已经选择了 Markdown 格式,但又再次选择 Markdown 并且它提示保存时:

这种情况不应该发生……这里存在一个 bug,它将列表项的值(0)视为与设置值(’0’)不同。所以我认为这里的保存没有任何作用。我可以修复这个 bug,但你能否执行以下操作:

  • 将设置更改为“富文本”
  • 保存它,但选择“否,仅应用后续更改”
  • 改回“Markdown”
  • 保存它,并选择“是”以追溯应用

然后看看这是否能解决你遇到的问题。

1 个赞

谢谢告知。我用一个旧的测试账户登录了,似乎运行正常:它在第一次运行时就启用了 Markdown 模式 :slightly_smiling_face:

有没有办法通过使用数据浏览器等方式来双重检查所有用户是否都已启用 Markdown 模式?

2 个赞

很高兴听到这解决了问题!

是的,绝对可以,你可以运行一个类似以下的查询:

SELECT composition_mode, COUNT(composition_mode) FROM user_options GROUP BY composition_mode;

值在这里:

2 个赞

谢谢,我们所有的用户现在都已启用 Markdown 模式 :partying_face:

3 个赞

@martin 我已将此主题从支持移至 bug,并将关闭它,假设您已修复该 bug。如果您没有修复,可以重新打开吗?

1 个赞

它已由 FIX: Don't show setting save/cancel buttons when selecting the current value by OsamaSayegh · Pull Request #34552 · discourse/discourse · GitHub 修复。

5 个赞