テーマモディファイア:簡単な紹介

テーマがより野心的になるにつれて、それらがコアのサーバーサイド動作を操作できるようにする方法を探してきました。プラグインと同等の制御レベルが与えられることはありませんが、テーマが操作できるいくつかの定義済みのフックを提供できます。

テーマモディファイアの導入 :partying_face:

これらは、テーマの about.json ファイルの modifiers キーを使用して指定されます。

100%最新のモディファイアのリストについては、theme_modifier_set.rb の末尾にあるデータベーススキーマを確認してください。ただし、これまでの簡単な要約を以下に示します。

  • serialize_topic_excerpts boolean (デフォルト false) - トピックリストをシリアル化する際に常に抜粋を含める

  • csp_extensions string配列 - CSPにディレクティブを追加します。古い「extend_content_security_policy」テーマ設定メソッドと同じように機能します。ただし、単純な \u003cscript src=\"\"\u003e タグは自動的に許可されていることを忘れないでください。

  • svg_icons string配列 - アイコンサブセットに含める必要があるアイコンのリスト

  • topic thumbnails 寸法の配列 - トピックサムネイルセットで追加の解像度を要求します。これらは非同期で生成されるため、要求したサイズが提供されていない場合は、元の画像にフォールバックする必要があります。詳細については、コミットメッセージを参照してください。

  • serialize_post_user_badges string配列 - ポストデータと共にシリアル化するバッジ名のリスト(バッジテーブルのエントリと一致)。設定されている場合、システムはクライアントサイドレンダリングのために、各ポストに指定されたユーザーバッジを含めます。

これらの新しいフックを多用しているテーマの例として、Topic List Thumbnails があります。その動作を確認するためにコードを見てください。

設定依存のモディファイア

テーマモディファイアは、その値をテーマ設定から取得するように構成することもでき、サイト運営者がテーマのコードを編集せずにモディファイアの動作を上書きできるようにします。モディファイアを設定に依存させるには、about.json でこの構文を使用します。

{
  "modifiers": {
    "modifier_name": {
      "type": "setting",
      "value": "setting_name"
    }
  }
}

たとえば、show_excerpts というテーマ設定があり、それが serialize_topic_excerpts モディファイアを制御するようにしたい場合を考えます。

settings.yml で:

show_excerpts:
  default: false

about.json で:

{
  "modifiers": {
    "serialize_topic_excerpts": {
      "type": "setting",
      "value": "show_excerpts"
    }
  }
}

show_excerpts 設定が変更されると、モディファイアの値は自動的に一致するように更新されます。これにより、サイト運営者が管理者UIを介してテーマの動作をカスタマイズするための柔軟性が提供されます。


このドキュメントはバージョン管理されています - 変更提案はgithubで行ってください。

「いいね!」 35

デビッド、少し頼みすぎかもしれませんが、プラグインからこれにアクセスする方法はありますか:

テーマは about.json ファイル内の修飾子を使用して、追加のサムネイルサイズをリクエストできます:

TLP プラグインをこの新しいスキーマに移行しようとしており、少なくとも当面の間は、プラグインから同じ機能にアクセスできるとありがたいです。

「いいね!」 2

現時点ではありませんが、確認してみます :eyes:

「いいね!」 6

David、サムネイルの一括再生成における正しいアプローチは何でしょうか?

あるサイトで試してみたところ、トピックの約10%が処理された後、処理が停止(あるいは残りを無視)したようです。停止したと推測する理由は、サムネイルが生成されたトピックが最新の10%だったからです。

投稿の再烘焙では解決しないようです。実際、一括再烘焙を実行したのですが、それが原因で混乱を招いたのかもしれません。

image_url が設定されていても、サムネイルが存在しないことに気づきました。

アドバイスをお願いします!

「いいね!」 1

そのカラムは機能せず、まもなく削除されます。必要なのは image_upload_id です。

これは不要です。私は、コンソールをいじらずに新しいテーマをインストールできるようにあえて設計しました。サムネイルは必要なときに非同期で生成されます。例えば:

  • 新しいテーマを追加し、新しい解像度を要求する
  • ユーザーがトピックをリクエストすると、既存のサムネイルが提供されます。存在しないサイズがある場合、Sidekiq ジョブがスケジュールされます。
  • 次に誰かがそのトピックをリクエストすると、正しいサムネイルが存在します

リクエストされたサムネイルのサイズが元画像より大きい場合、サムネイルの生成は行いません。

したがって、これを機能させるために肝心なのは:

私が作成したサムネイルテーマコンポーネントには、このフォールバックロジックの例があります。そこからロジックを流用しても構いません。

「いいね!」 5

フォールバックは thumbnailsl[0] としてシリアライズされますか?はい、すでにその処理は行っています(素晴らしい実装ですね、処理が非常に簡単です)。

一部の画像が基準を満たしていない、あるいは条件に合致していない可能性がありますか?

TLP プラグインの動作では、one-box サムネイルを取得するようになっていますが、ここでは必ずしもそうなっていないと思います。

例えば、時間があれば以下の例を確認してみてください。

これらのサムネイルは条件を満たしていないと思います。サムネイルは null としてシリアライズされています。

はい、これは意図的な変更です。小さなワンボックスのサムネイルを削除してほしいという要望が複数寄せられていたためです。例えば、GitHub のアバターがトピックのサムネイルとして表示されてしまうことがあり、これは通常意図されない挙動でした。

なお、画像が実際のコンテンツそのものであるワンボックス(Instagram や Twitter などの写真など)の場合は、それらが選択されます。

YouTube の動画については、昨日修正しました。

「いいね!」 5

あ、ありがとうございます。確認してくださって嬉しいです。

不思議ですね。ビルドはより新しいはずなのに、いくつか見落とされているようです。

そうですね、それが理由の一つで、自動選択が最適でない場合に備えてサムネイル選択機能を実装しました。この動作をさらに変更する必要があるかもしれませんが、プラグイン内で対応する予定です。

お時間をいただき、ありがとうございます、David!

「いいね!」 2

はい、解決しました。少し無駄な byebug セッションの後、なぜ古い YouTube の投稿にサムネイルが表示されないのか、理由がわからずにおりました。

すると、あることに気づきました。それはこのためです:

ですので、実際にはこの値をかなり大きな数(365 など)に設定した後、再ビルド(rebake)を行う必要があるかもしれません。

ローカルにアップロードされていないものは、サムネイルが作成されないというのは私の認識で正しいでしょうか?…

「いいね!」 4

:+1: 正しいです。これはローカルアップロードの場合にのみ機能します…「最大経過日数」の設定を見直す必要があるかもしれませんね :thinking:

「いいね!」 8

計画はありますので、今週中に実装できるよう努めます。一つ質問ですが、値は動的である必要がありますか?

つまり、解像度は起動時に定義されるのでしょうか、それともランタイム(例:サイト設定経由)で定義されるのでしょうか?

前者の方が簡単ですが、後者も可能かもしれませんね :thinking:

「いいね!」 2

ご覧いただきありがとうございます。

テーマコンポーネントと全く同じ、固定された方法が必要です。

サイト設定があればなお良いですが。

完全な開示のために付け加えます:プラグインからの移行を希望しており、テーマコンポーネントのソリューションとの同等性であれば十分です。

「いいね!」 2

@merefield はこちらです:

コミットメッセージで仕組みが説明されているはずですが、ご質問があればお知らせください。

「いいね!」 7

素晴らしいです。TLP に追加して、動作しているようです!お手伝いいただき、ありがとうございます!

「いいね!」 4

4 つの投稿が新しいトピックに分割されました:JSON エンドポイントからサムネイルを取得する

リモートサーバーの画像(Blogger、Picasa、Amazon S3 などの画像)も対応可能ですか?

Discourse は大規模な画像サイト向けに Amazon S3 上のホスティングをサポートしていますが、すべての画像をローカルサーバーに直接ホストする必要がある場合、この設計手法は欠点のように思えます。

今回の更新により、当サイトでは対応が容易ではありません。当サイトでは画像を他のサーバーでホストしているためです。多くの投稿を抱える関連サーバーへの移行は難しく、また画像の容量が大きすぎるためローカルサーバーでのホスティングも困難です。

これは Discourse の「アップロード」のみを対象に設計されています。S3 や他のサービスを利用している場合も同様です。

他サイトからホットリンクされた画像を自動的にダウンロードするには、download_remote_images サイト設定の使用をお勧めします。

「いいね!」 4

こんにちは、Davidさん。TC で Pro アイコンを使用できるようにするために、何か特別な手順が必要でしょうか?

「いいね!」 1

特にありません。Discourse の他の場所でプロアイコンを使用するのと同じように機能するはずです。おそらく、このプラグイン を使用してプロアイコンを有効にしているのでしょう?

もし動作しない場合はお知らせください。確認いたします :eyes:

「いいね!」 2

はい、その通りです。もう一度掘ってみましょう。夜遅くの返信、ありがとうございます!

「いいね!」 2