既存のテーマを実験的に変更したいと考えています。例えば、トピック一覧の表示スタイルを異なるバージョンでテストするといったケースです。そのために Google Optimize を用いた A/B テストを実施しています。現在、50% のユーザーには変更なしのテーマを、残りの 50% には更新されたテーマを表示する予定です。実験対象が小部分であるため、オリジナルとバリアントは同じテーマ内に定義する必要があります。しかし、親の CSS クラス名が共通しており、特定の値に基づいてそれらの親クラスにスタイルを適用したいという問題に直面しています。同じ親クラス名を持つ異なるテンプレートに対して、どのように個別のスタイルを適用すればよいでしょうか。
以下に、実現しようとしている簡略化されたシナリオを示します。
トピック一覧のスタイルが common/common.scss で次のように定義されているテーマがあると仮定します。
.topic-list {
tbody {
border: none;
}
tr {
border: none;
}
.example-div {
border: none;
}
}
一方、バリアントでは以下のように設定したいと考えています。
.topic-list {
tbody {
display: block;
tr {
display: block;
}
}
.example-div {
border: 2px solid black;
}
.another-example-div {
font-size: 10px;
}
}
オーバーライドされているハンドルバーファイルは以下の通りです。
javascripts/discourse/templates/list/custom-topic-list-item.hbr
<div class='example-div'>
Hello
</div>
javascripts/discourse/templates/list/variant-custom-topic-list-item.hbr
<div class='example-div'>
Hello,
<div class='another-example-div'>
Nice to meet you
</div>
</div>
topic-list クラス名は Discourse コンポーネント内で言及されていますが、レンダリング後の構造は以下のようになります。
<table class="topic-list">
<tr class="topic-list-item">
<div class='example-div'>
Hello
</div>
</tr>
</table>
ヘッダーファイルでユーザー ID に応じてこれらのファイルのいずれかをレンダリングしたいと考えています。
common/header.html
const { findRawTemplate } = require("discourse-common/lib/raw-templates");
const user_id = api.getCurrentUser().id
api.modifyClass('component:topic-list-item', {
renderTopicListItem() {
let template = findRawTemplate("list/custom-topic-list-item");
if (user_id % 2 === 0)
template = findRawTemplate("list/variant-custom-topic-list-item");
if (template) {
this.set("topicListItemContents", template(this).htmlSafe());
}
},
});
よろしくお願いいたします。