生のテンプレートにカスタム変更を加える

現在、トピック一覧ページでは、各トピックの主要な参加者のアバターと、ユーザープロフィールページへのリンクが表示されています。これはここで確認できます。


ユーザーがサインインしていない場合、このリンクはクリック可能になりません。そうでなければログインページへのリダイレクトが発生するためです。

問題は、SEOコンサルタントがこれを問題であると判断し、プロフィールページへのリンクをGoogleに一切表示させたくないということです。

トピック投稿などにも同様の問題がありますが、これらはすべてウィジェット内にあり、api.reopenWidge()などで比較的簡単に解決できました。

トピック一覧ページではそうはいきません。ここでは、raw-templates/list/posters-column.hbrの内容を変更する必要があります!

試したことを以下に説明します。もし答えをご存知であれば、最後にスキップしてください。

まず、初心者向けガイドの指示に従ってウィジェットをマウントしようとしました。

    <td>
        {{#each posters as |poster|}}
            {{#if poster.moreCount}}
                <a class="posters-more-count">{{poster.moreCount}}</a>
            {{else}}
              {{mount-widget widget="custom-list-avatar"}}
            {{/if}}
        {{/each}}
    </td>

これは全く何も効果がないように見えました。最終的に、誰かがdata-template-nameの値で.raw拡張子を使用しているテーマを見つけました。そのため、ガイドは単に時代遅れであると推測しました。生のテンプレートについては何も言及されていませんでした!.rawを使用すると、上記の変更はレンダリングされますが、カスタムウィジェットはロードされませんでした。

これは奇妙です。なぜなら、list/posters-columntopic-list-item.hbrによってのみ参照されており、これも生のテンプレートであり、そのガイドで使用されているテンプレートの1つだからです。しかし…また時代遅れなのでしょうか?生のテンプレートにはウィジェットをマウントできないとどこかで読んだので、これは決して機能しなかったようです。

次に、パーティアルを発見し、それらを使用しようとしました。それらの部分が生のテンプレートではなくなったので、もっとうまくいくかもしれないと思いました。

<script type="text/x-handlebars" data-template-name="components/custom-avatar">
    <a href="{{poster.user.path}}" data-user-card="{{poster.user.username}}" class="{{poster.extraClasses}}">{{avatar poster avatarTemplatePath="user.avatar_template" usernamePath="user.username" namePath="user.name" imageSize="small"}}</a>
</script>

<script type="text/x-handlebars" data-template-name="list/posters-column.raw">
    <td class='posters topic-list-data'>
        {{#each posters as |poster|}}
            {{#if poster.moreCount}}
                <a class="posters-more-count">{{poster.moreCount}}</a>
            {{else}}
                {{partial 'components/custom-avatar'}}
            {{/if}}
        {{/each}}
    </td>
</script>

残念ながら、生のテンプレートでもパーティアルを使用できないようです。そのため、そのアプローチも却下されました。

次に、このスレッドを見つけました。これは私が求めているものを含んでいるように見えました。そのアプローチに基づいて、list/topic-list-itemlist/posters-columnを呼び出す)がtopic-list-itemコンポーネントによって使用されていることを知って、以下のようになりました。

<script type="text/x-handlebars" data-template-name="list/posters-column.raw">
    <td class='posters topic-list-data'>
        {{#each posters as |poster|}}
            {{#if poster.moreCount}}
                <a class="posters-more-count">{{poster.moreCount}}</a>
            {{else}}
                {{#if hideFromAnonUser}}
                    <div data-user-card="{{poster.user.username}}" class="{{poster.extraClasses}}">{{avatar poster avatarTemplatePath="user.avatar_template" usernamePath="user.username" namePath="user.name" imageSize="small"}}</div>
                {{else}}
                    <a href="{{poster.user.path}}" data-user-card="{{poster.user.username}}" class="{{poster.extraClasses}}">{{avatar poster avatarTemplatePath="user.avatar_template" usernamePath="user.username" namePath="user.name" imageSize="small"}}</a>
                {{/if}}
            {{/if}}
        {{/each}}
    </td>
</script>

<script type="text/discourse-plugin" version="1.1.0">
    const settings = Discourse.SiteSettings;
    const user = api.getCurrentUser();
    const hideFromAnonUser = settings.hide_user_profiles_from_public && !user;
    const topicListItemComponent = require('discourse/components/topic-list-item').default;
    topicListItemComponent.reopen({
        hideFromAnonUser: function() {
            return hideFromAnonUser
        }.property()
    });
</script>

残念ながら、hideFromAnonUserは生のテンプレートからは決して見えません。おそらくhideFromAnonUserは、hideFromAnonUserキーに割り当てられた関数の中から計算する必要があるのでしょうか?どちらにしても関係ないようです。最初の3つのconst代入をコメントアウトして、単にFalseを返すように設定したり、その中にconsole.log()呼び出しを追加して返しても、関数が何も実行されていないことがわかります。

この時点で、私は途方に暮れています。これまでにこのような作業をしたことがないので、手に負えないと感じています。何か見落としているかもしれませんが、多くの情報が誤解を招くものか、時代遅れであるか、あるいは私が間違った場所を見ているか、単に何かを誤解しているかのようです。

トピック一覧ページのアバターの<a></a>タグを<div></div>タグに置き換えるにはどうすればよいですか?ありがとうございます。

「いいね!」 1

こんにちは @boltronics さん :wave:

これは list/posters-column テンプレートを上書きします。おそらく topic-list-item テンプレートを上書きするよりも良いでしょう。

<script type="text/x-handlebars" data-template-name="list/posters-column.hbr">
  <td class='posters topic-list-data'>
  {{#if currentUser}}
    {{#each posters as |poster|}}
      {{#if poster.moreCount}}
        <a class="posters-more-count">{{poster.moreCount}}</a>
      {{else}}
        <a href="{{poster.user.path}}" data-user-card="{{poster.user.username}}" class="{{poster.extraClasses}}">{{avatar poster avatarTemplatePath="user.avatar_template" usernamePath="user.username" namePath="user.name" imageSize="small"}}</a>
      {{/if}}
    {{/each}}
  {{else}}
    {{#each posters as |poster|}}
      <div data-user-card="{{poster.user.username}}" class="{{poster.extraClasses}}">{{avatar poster avatarTemplatePath="user.avatar_template" usernamePath="user.username" namePath="user.name" imageSize="small"}}</div>
    {{/each}}
  {{/if}}
  </td>
</script>

また、CSS も追加する必要があります。これは a をターゲットにしていますが、匿名ユーザーの場合は div にしたいからです。

デスクトップ / CSS

html.anon {
  .topic-list {
    .posters {
      width: 146px;
      > div {
        float: left;
        margin-right: 4px;
        &:last-of-type {
          margin-right: 0;
        }
      }
      div:first-child .avatar.latest:not(.single) {
        box-shadow: 0 0 3px 1px rgba(var(--tertiary-rgb), 0.35);
        border: 1px solid rgba(var(--tertiary-rgb), 0.5);
        position: relative;
        left: -2px;
      }
    }
  }
}
「いいね!」 7

生のテンプレート(およびウィジェット!)システムはまもなく廃止されることに注意する価値がありますが、もちろんそれはあなたの当面の問題を解決しません。

Glimmerコンポーネントがそれらに取って代わる可能性が高いため、リファクタリングの準備をしておくことをお勧めします。その際、さらに多くのツールが利用可能になる可能性があります。

「いいね!」 6

@Don 素晴らしいです。テストしたところ、問題が完全に解決されました。

問題に別の方法で対処しているため、少しずるをしていることになります(currentUser 変数がそこからアクセス可能であることに気づきませんでした)が、結果には文句は言えません。:smile:

@merefield さん、今後のリファクタリングについて指摘していただきありがとうございます。潜在的な後退を監視するために、環境を監視するテストを設定します。

皆さん、ありがとう。

「いいね!」 3

お役に立てて嬉しいです。ただし、上記の投稿にいくつか修正を加えました。:slightly_smiling_face:

posters-more-count はプライベートメッセージのトピックリストに表示されるため、匿名ユーザーには不要です。テンプレートとCSSからも削除しました。

「いいね!」 3

ドン、ありがとう。当初はそうかもしれないと思っていましたが、確認のために調査していませんでした。知れてよかったです。

「いいね!」 1

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.