Is there a way to reopen a class and overwrite a function?
The one I need to overwrite is function categoryStripe(color, classes) {} on line 15 from here: javascripts/discourse/helpers/category-link.js.es6.
Is there a way to reopen a class and overwrite a function?
The one I need to overwrite is function categoryStripe(color, classes) {} on line 15 from here: javascripts/discourse/helpers/category-link.js.es6.
Das glaube ich. Hast du Developing Discourse Themes & Theme Components gesehen?
Es gibt mehrere Möglichkeiten, das zu tun, was du fragst. Was ist dein Ziel beim Überschreiben von categoryStripe?
Ich möchte es von:
function categoryStripe(color, classes) {
var style = color ? "style='background-color: #" + color + ";'" : "";
return "<span class='" + classes + "' " + style + "></span>";
}
zu:
function categoryStripe(color, classes) {
var style = color ? "style='border: 1px solid #" + color + ";'" : "";
return "<span class='" + "my-class" + classes + "' " + style + "></span>";
}
ändern, also die Hintergrundfarbe durch einen Rahmen ersetzen und eine Klasse hinzufügen.
Was ist der beste Weg, das zu erreichen, Justin?
Das habe ich gelesen, aber soweit ich mich erinnere, wird darin nur die Möglichkeit behandelt, Vorlagen (und Widgets) zu überschreiben, ohne dass Hilfsfunktionen erwähnt werden, oder?"}
Das war in deinem ersten Beitrag keineswegs ersichtlich. Ich denke, du wirst jetzt eine hilfreiche Antwort erhalten, die ich mit Interesse verfolgen werde!
Haben Sie bereits überlegt, die Klasse per JavaScript hinzuzufügen oder den Inline-Style im Stylesheet mit !important zu überschreiben? Zwar können Sie versuchen, diese Methode zu überschreiben, doch wird dies irgendwann scheitern. Das Hinzufügen zum DOM per JS ist wahrscheinlich der stabilste Weg.
Das war im Wesentlichen das, was ich neulich herausfinden wollte. Ich wollte eine benutzerdefinierte Klasse zu Beiträgen in allen Themen hinzufügen (aber nicht zum ursprünglichen Thema/Beitrag). Ich wollte diese benutzerdefinierte Klasse je nach Benutzergruppe und Erstellungsdatum des Themas ein- und ausschalten können, aber ich dachte, dass ich das herausfinden könnte, sobald ich verstanden hätte, wie man die benutzerdefinierte Klasse zu Beiträgen hinzufügt. Ich habe nicht genau das Beispiel gefunden, das ich suchte, aber ein paar andere Dinge haben mich möglicherweise abgelenkt, bevor ich das Beispiel fand.
Ich glaube nicht, dass das funktionieren wird, da die Farbe aus den Kategorieeinstellungen abgerufen werden muss – die Rahmenfarbe wird also für jede Kategorie variieren. (Ich habe meinen Beitrag oben entsprechend aktualisiert.)
Kann dies eventuell über JS abgerufen werden (/hinzufügen zum DOM)? (Falls ja, könntest du mir bitte ein Beispiel geben?)
Ich müsste mich in die Details einarbeiten, um zu prüfen, ob das, was du machst, nur mit JS-Selektoren machbar ist (leider habe ich gerade keine Zeit).
Aber du kannst hier das Hinzufügen einer Klasse sehen: discourse-knowledge-base-theme/javascripts/discourse/components/knowledge-base.js.es6 at 4694d4a8ad788f8884e3341c852d3f77b2c1d103 · discourse/discourse-knowledge-base-theme · GitHub
Du kannst auch Inline-Stile mit JS ändern: Setting CSS Styles using JavaScript | KIRUPA
Danke, Justin, ich werde mir das ansehen.
Oder gibt es eine Möglichkeit, Helpers zu überschreiben (discourse/app/assets/javascripts/discourse/helpers/category-link.js.es6 at b25d9e96c1414bf78b44221da4d385675843991e · discourse/discourse · GitHub), so wie wir Templates/Components/Widgets usw. überschreiben können?
Mir macht es nichts aus, bei Bedarf auf diese Datei zu achten, falls Änderungen vorgenommen werden ![]()
Du kannst versuchen, in deinem Theme eine Datei unter javascripts/discourse/helpers/category-link.js.es6 zu erstellen und dort eine modifizierte Version dieser Funktion hinzuzufügen. Es ist schon eine Weile her, dass ich mich so tief damit beschäftigt habe, daher kann ich nicht garantieren, ob das funktioniert! ![]()
Ja, das sollte funktionieren.
Danke an euch beide!
Letzte Frage (hoffentlich!): Wie erstelle ich dort eine Datei? ![]()
In einem Plugin ist das einfach: Erstelle den Ordner und kopiere und füge es einfach ein!
Ah!!! Danke, Robert!
Ich muss jetzt kurz weg, werde es aber versuchen, sobald ich zurück bin ![]()
Danke, Robert!
Es funktioniert aber nicht ![]()
So habe ich vorgegangen:
rails g plugin CategoryAlternative
Dann habe ich dies hier eingefügt:
In einen helpers-Ordner, den ich erstellen musste:
Danach:
rm -rf tmp
rails s
Es wird im AdminCP angezeigt, aber keine Änderungen werden auf der eigentlichen Seite übernommen (Änderungen werden übernommen, wenn ich die Nicht-Plugin-Version der Datei mit exakt denselben Änderungen bearbeite).
Habe ich etwas übersehen? Muss ich noch etwas konfigurieren?
Kommst du in der JavaScript-Konsole auf Fehler?
Hast du die gesamte Datei einbezogen?
Hinweis: Ich habe den Plugin-Generator nicht verwendet, sondern habe alles manuell erstellt.
Zu dem Zeitpunkt, als ich das geschrieben habe, habe ich das nicht getan (da ich dachte, Justin meinte nur, diese Funktion einzubeziehen). Allerdings hat das Einbeziehen der gesamten Datei dazu geführt, dass es funktioniert – es war jedoch nicht dasselbe wie bei der direkten Bearbeitung der Datei.
Zum Beispiel hat es auf der Seite latest funktioniert, aber nicht im Dropdown-Menü alle Kategorien… was wiederum funktionierte, als ich die Datei direkt bearbeitet habe!
Also habe ich die Änderungen, die ich brauchte, über etwas unordentliches CSS vorgenommen
und musste auch einige Kompromisse eingehen – es ist definitiv besser, als gar nichts tun zu können, aber idealerweise hätte ich etwas bevorzugt, das so einfach ist wie das Ändern eines Kategorienstils, so einfach wie das Bearbeiten einer Vorlage ![]()
Ich würde das auch gerne machen.
Hier ist der Pfad der Datei, die ich in meiner Theme-Komponente überschreiben möchte:
custom_loader\javascripts\discourse\helpers\loading-spinner.js
Aber die JS-Datei wird nicht geladen. Was übersehe ich?