AstonJ
(AstonJ)
2021 年 2 月 14 日午前 7:16
1
ページをリフレッシュしたり、新しいページに移動したりするときは機能しているようですが、無限スクロールで新しいアイテムが読み込まれるページを下にスクロールしたときは機能しないようです。以下のコードでタグリンクを変更しようとしています。
<script type="text/discourse-plugin" version="0.8">
api.onPageChange(() =>{
var tags = document.getElementsByClassName("discourse-tag");
for (i = 0; i < tags.length; i++) {
var tag = tags[i];
var url = tag.href;
var newUrl = "https://site.com" + url;
tag.href = newUrl;
}
});
</script>
api.onPageChange 以外のものを使う必要があるでしょうか、あるいは追加で何か使う必要があるでしょうか?
「いいね!」 1
はい、それでは動作しません。ルート変更時のみ発火する仕組みです。DOM 選択ではなく、実際にそのタグをレンダリングするコード自体をオーバーライドする必要があります。
「いいね!」 9
AstonJ
(AstonJ)
2021 年 2 月 14 日午後 10:05
3
ロバート、ありがとうございます!シンプルな方法で済むと期待していたのですが
プラグインガイドを最後に読んだのはだいぶ前ですが、記憶では以下のような手順だったと思います。
rails g plugin NAME
変更したいファイルを見つける
そのファイルをプラグイン内の同じディレクトリにコピー
変更を加える
しかし、この方法ではうまくいきません。
直接このファイル(29 行目)を編集すると目的の効果が得られます:
import User from "discourse/models/user";
import { escapeExpression } from "discourse/lib/utilities";
import getURL from "discourse-common/lib/get-url";
import { helperContext } from "discourse-common/lib/helpers";
let _renderer = defaultRenderTag;
export function replaceTagRenderer(fn) {
_renderer = fn;
}
export function defaultRenderTag(tag, params) {
// This file is in lib but it's used as a helper
let siteSettings = helperContext().siteSettings;
params = params || {};
const visibleName = escapeExpression(tag);
tag = visibleName.toLowerCase();
const classes = ["discourse-tag"];
const tagName = params.tagName || "a";
This file has been truncated. show original
ただし、以下の場所にファイルを複製しても影響がありません:
plugins/my-plugin/app/assets/javascripts/discourse/app/lib/render-tag.js
何が間違っているのか、何かご存知でしょうか?もしかしてガイドを読んだ後に変更があったのでしょうか?(このような小さな変更を行うには、単にファイルをオーバーライドするだけで済むと思っていたのですが)。
「いいね!」 1
プラグインは不要です。これはクライアントサイドです。テーマコンポーネントを使用してください。
「いいね!」 7
AstonJ
(AstonJ)
2021 年 2 月 15 日午後 3:52
5
ありがとうございます!面白いことに、昨夜 Tag Icons のカスタマイズを始めて、見事に動作させることができました!
ただ、好奇心から伺いたいのですが、上記で説明したプラグインのファイル上書き手法も機能するはずだったのでしょうか?(もしそうなら、私がどこを間違えていたか見当がつきますか?)
「いいね!」 1