Wir haben ein bestehendes Theme, das wir testen möchten. Ein Beispiel wäre das Testen verschiedener Stile für die Themenlistenansicht. Dafür verwenden wir Google Optimize A/B-Tests. Derzeit planen wir, 50 % der Nutzer das Theme unverändert zu zeigen und den Rest mit dem aktualisierten Theme. Original und Variante sollten im selben Theme definiert werden, da wir nur mit einem kleinen Teil experimentieren. Das Problem ist, dass die übergeordneten CSS-Klassen denselben Namen haben und wir diese Klassen basierend auf einer spezifischen Variable unterschiedlich stylen möchten. Wie können wir separate Styles auf verschiedene Vorlagen anwenden, wenn sie denselben übergeordneten Klassennamen teilen?
Nachfolgend finden Sie ein vereinfachtes Szenario dessen, was wir erreichen möchten:
Angenommen, ich habe ein Theme, in dem der Stil der Themenliste in common/common.scss so definiert ist:
.topic-list {
tbody {
border: none;
}
tr {
border: none;
}
.example-div {
border: none;
}
}
In meiner Variante möchte ich dies so festlegen:
.topic-list {
tbody {
display: block;
tr {
display: block;
}
}
.example-div {
border: 2px solid black;
}
.another-example-div {
font-size: 10px;
}
}
Die überschriebenen Handlebar-Dateien sehen so aus:
javascripts/discourse/templates/list/custom-topic-list-item.hbr
<div class='example-div'>
Hallo
</div>
javascripts/discourse/templates/list/variant-custom-topic-list-item.hbr
<div class='example-div'>
Hallo,
<div class='another-example-div'>
Freut mich, Sie kennenzulernen
</div>
</div>
Der Klassenname topic-list wird in der Discourse-Komponente erwähnt, aber die Struktur sieht nach dem Rendern so aus:
<table class="topic-list">
<tr class="topic-list-item">
<div class='example-div'>
Hallo
</div>
</tr>
</table>
Ich möchte eine dieser Dateien abhängig von der Benutzer-ID in meiner Header-Datei rendern:
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());
}
},
});
Danke