アイコンがすべての場所で変更されないのはなぜですか?

このスクリプトを使用して、サイト全体のアイコンを正常に変更できました。これにより、Solved プラグインの「解決済み」チェックアイコンが「親指を立てる」アイコンに変更されます。


ただし、サイト内のすべての場所で変更されるわけではありません。例えば、通知リスト内では変更されません。

image
~
以下は、変更が正常に機能するサイト内の他の場所での表示例です。

image

通知を含むいくつかのアイコンは、異なる名前を使用しているため特別な処理が必要です。この場合、notification.solved.accepted_notification を探してください(これらの逸脱したアイコン名はすべて、https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse-common/lib/icon-library.js.es6replacements セクションに記載されています)。

再度のご報告で申し訳ありませんが、投稿コントロールのアイコンが変更されない理由をご存知でしょうか?


私が使用しているコードは以下の通りです:

その特定のアイコンの場所と状態に対して変更しようとしていますか?まだアイコンをグローバルに変更しようとしている場合、最初に投稿されたコードは正しいままです。

api.replaceIcon('far-check-square', 'thumbs-up')
api.replaceIcon('check-square', 'thumbs-up')

「Kudos」の隣のチェックマークアイコンはデフォルトではないため、どこかに競合するコードがある可能性がありますか?

具体的にはその分野において、Kris が前述したように、コードは非常に特定である必要がある場合があります。アイコンを変更するために追加したコードはすべてこちらです:

クリスが言及した通り、一部のアイコンのみ特別扱いが必要です。通知はその一つなので、notification.solved.accepted_notification を使用する必要がありました。投稿コントロール内の解決済みアイコンの場合は、汎用的なアイコン名を使用しているため、replaceIcon メソッドを使用する際のみ、それをグローバルに変更できます。

より詳細に制御したい場合は、solved プラグインで定義されている addPostMenuButton 関数をオーバーライドする必要があります。以下を試してみてください:

<script type="text/discourse-plugin" version="0.8"> 
  const { iconNode } = require("discourse-common/lib/icon-library");
  api.addPostMenuButton("solved", attrs => {
    const currentUser = api.getCurrentUser();
    const canAccept = attrs.can_accept_answer;
    const canUnaccept = attrs.can_unaccept_answer;
    const accepted = attrs.accepted_answer;
    const isOp = currentUser && currentUser.id === attrs.topicCreatedById;
    const position =
      !accepted && canAccept && !isOp ? "second-last-hidden" : "first";

    if (canAccept) {
      return {
        action: "acceptAnswer",
        icon: "far-check-square",
        className: "unaccepted",
        title: "solved.accept_answer",
        label: "solved.solution",
        position
      };
    } else if (canUnaccept && accepted) {
      const title = canUnaccept
        ? "solved.unaccept_answer"
        : "solved.accepted_answer";
      return {
        action: "unacceptAnswer",
        icon: "thumbs-up",          // ここで変更
        title,
        className: "accepted fade-out",
        position,
        label: "solved.solution"
      };
    } else if (!canAccept && accepted) {
      return {
        className: "hidden",
        disabled: "true",
        position,
        beforeButton(h) {
          return h(
            "span.accepted-text",
            {
              title: I18n.t("solved.accepted_description")
            },
            [
              h("span", iconNode("thumbs-up")),       // ここで変更
              h("span.accepted-label", I18n.t("solved.solution"))
            ]
          );
        }
      };
    }
  });
</script>

これは機能しますが、奇妙なことにこのスクリプトにより、管理者アカウントを持つ自分だけが解決済み返信付きのトピックを見ることができ、他のユーザーは見ることができません。

おや、変ですね!なぜか管理者以外のユーザーでだけ失敗する理由がわかりません…いずれにせよ、スクリプトに不足していた部分を追加して更新しました。

もう壊れてはいませんが、アイコンの変更は管理者には表示され、非管理者にはまだ解決済み/チェックアイコンが表示されたままです:


管理者:

ああ、スクリプトを更新しました。