Themenmodifikatoren: Eine kurze Einführung

Da Themen immer ehrgeiziger werden, suchen wir nach Möglichkeiten, ihnen zu erlauben, das Kernverhalten auf der Serverseite zu manipulieren. Obwohl sie niemals das gleiche Maß an Kontrolle wie Plugins erhalten werden, können wir einige vordefinierte Hooks für Themes zur Manipulation bereitstellen.

Wir stellen vor: Theme-Modifikatoren :partying_face:

Sie werden mit dem Schlüssel modifiers in der about.json-Datei Ihres Themes angegeben.

Eine 100% aktuelle Liste der Modifikatoren finden Sie im Datenbankschema am Ende von theme_modifier_set.rb, aber hier ist eine kurze Zusammenfassung dessen, was wir bisher haben:

  • serialize_topic_excerpts boolean (Standard: false) - Schließt Auszüge immer ein, wenn Themenschleifen serialisiert werden

  • csp_extensions string array - Fügt Direktiven zur CSP hinzu. Funktioniert genauso wie die alte Methode „extend_content_security_policy“ der Theme-Einstellung. Aber denken Sie daran, einfache \u003cscript src=\"\"\u003e-Tags sind automatisch erlaubt.

  • svg_icons string array - eine Liste von Symbolen, die in den Icon-Subset aufgenommen werden sollen

  • topic thumbnails array of dimensions - fordert zusätzliche Auflösungen im Topic-Thumbnail-Set an. Beachten Sie, dass diese asynchron generiert werden, sodass Sie auf das Originalbild zurückfallen müssen, wenn Ihre angeforderte Größe nicht bereitgestellt wird. Weitere Informationen finden Sie in der Commit-Nachricht

  • serialize_post_user_badges string array - eine Liste von Abzeichennamen (die Einträgen in der badges-Tabelle entsprechen), die zusammen mit Beitragsdaten serialisiert werden sollen. Wenn konfiguriert, fügt das System die angegebenen Benutzerabzeichen jedem Beitrag für das Client-seitige Rendern hinzu.

Ein Theme, das diese neuen Hooks intensiv nutzt, ist Topic List Thumbnails – sehen Sie sich den Code an, um zu sehen, wie es funktioniert.

Einstellungsabhängige Modifikatoren

Theme-Modifikatoren können auch so konfiguriert werden, dass ihr Wert aus einer Theme-Einstellung gezogen wird, wodurch Website-Betreiber das Modifikatorverhalten überschreiben können, ohne den Code des Themes bearbeiten zu müssen. Um einen Modifikator von einer Einstellung abhängig zu machen, verwenden Sie diese Syntax in Ihrer about.json:

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

Wenn Sie beispielsweise eine Theme-Einstellung namens show_excerpts haben und diese den Modifikator serialize_topic_excerpts steuern soll:

In settings.yml:

show_excerpts:
  default: false

In about.json:

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

Wenn die Einstellung show_excerpts geändert wird, aktualisiert sich der Modifikatorwert automatisch, um übereinzustimmen. Dies bietet Website-Betreibern Flexibilität, das Theme-Verhalten über die Admin-UI anzupassen.


Dieses Dokument ist versionskontrolliert – schlagen Sie Änderungen auf github vor.

35 „Gefällt mir“

David, wahrscheinlich ist es etwas faul von mir zu fragen, aber gibt es eine Möglichkeit, dies in einem Plugin zuzugreifen:

Themes können zusätzliche Miniaturbildgrößen anfordern, indem sie einen Modifikator in ihrer about.json-Datei verwenden:

Ich werde versuchen, das TLP-Plugin auf dieses neue Schema zu migrieren, und es wäre gut, zumindest vorübergehend von einem Plugin aus den gleichen Zugriff auf Funktionen zu haben.

2 „Gefällt mir“

Im Moment nicht, aber ich werde mir das ansehen :eyes:

6 „Gefällt mir“

David, was ist der richtige Ansatz für die BULK-Erstellung von Thumbnails?

Ich habe es gerade auf einer meiner Seiten ausprobiert und es scheint, als wären etwa 10 % der Topics verarbeitet worden … dann hat es aufgegeben (oder sich den Rest verkniffen). Ich denke, es ist das Ersteres, weil die Topics, für die Thumbnails erzeugt wurden, die neuesten 10 % waren.

Das Neubacken von Beiträgen scheint nicht zu helfen. Tatsächlich habe ich ein Bulk-Rebake ausgeführt und frage mich, ob das es gestört hat …

Ich stelle fest, dass image_url befüllt sein kann, aber es gibt keine Thumbnails.

Jeder Hinweis wird geschätzt!

1 „Gefällt mir“

Diese Spalte hat keine Funktion und wird sehr bald entfernt. Du solltest stattdessen image_upload_id verwenden.

Dafür sollte kein Bedarf bestehen. Ich habe es bewusst so gestaltet, dass Benutzer neue Themes installieren können, ohne in der Konsole herumprobieren zu müssen. Vorschaubilder werden bei Bedarf asynchron generiert. Zum Beispiel:

  • Du fügst ein neues Theme hinzu, das neue Auflösungen anfordert
  • Ein Benutzer ruft ein Thema auf; wir liefern die vorhandenen Vorschaubilder aus. Falls einige Größen fehlen, planen wir einen Sidekiq-Job ein.
  • Beim nächsten Aufruf des Themas durch jemanden stehen die korrekten Vorschaubilder zur Verfügung

Falls die angeforderte Vorschaubildgröße größer als das Originalbild ist, werden wir keine Vorschaubilder generieren.

Der kritische Punkt, den man dabei im Hinterkopf behalten muss, ist:

Ein Beispiel für diese Fallback-Logik findest du in dem von mir erstellten Vorschaubild-Theme-Komponenten – du kannst die Logik gerne daraus übernehmen.

5 „Gefällt mir“

Wird der Fallback als thumbnailsl[0] serialisiert? Ja, das behandle ich bereits. (Übrigens eine schöne Implementierung, sehr einfach zu handhaben.)

Ist es möglich, dass einige Bilder die Anforderungen nicht erfüllen oder nicht den Kriterien entsprechen?

Das Verhalten, das wir im TLP-Plugin haben, erfasst One-Box-Thumbnails. Das geschieht hier meiner Meinung nach nicht in jedem Fall.

Schauen Sie sich beispielsweise, wenn Sie Zeit haben, diese Beispiele an:

Ich glaube nicht, dass diese Thumbnails die Anforderungen erfüllen. Die Thumbnails werden als null serialisiert.

Ja, das ist beabsichtigt – wir hatten mehrere Anfragen, kleine Onebox-Miniaturansichten zu entfernen. Beispielsweise landeten Nutzer manchmal mit ihrem GitHub-Avatar als Themen-Miniaturansicht – was selten beabsichtigt ist.

Beachten Sie, dass bei Oneboxes, bei denen das Bild der eigentliche Inhalt ist (wie Fotos von Instagram, Twitter usw.), diese ausgewählt werden.

Was das YouTube-Video betrifft, habe ich das gestern behoben.

5 „Gefällt mir“

Ah, super, danke für die Bestätigung.

Das ist seltsam. Der Build war zwar neuer, aber einige scheinen trotzdem übersehen zu werden.

Ja, das ist auch einer der Gründe, warum ich einen Vorschaubild-Auswähler implementiert habe, falls die automatische Auswahl nicht optimal war. Ich werde dieses Verhalten möglicherweise noch anpassen, aber ich werde versuchen, dies im Plugin umzusetzen.

Danke für deine Zeit, David!

2 „Gefällt mir“

OK, ich habe es herausgefunden. Nach einer etwas ergebnislosen Byebug-Sitzung konnte ich nicht herausfinden, warum ältere YT-Beiträge keine Thumbnails bekamen.

Dann kam es mir wie ein Blitz aus heiterem Himmel. Das liegt daran:

Ich schlage daher vor, dass es tatsächlich notwendig sein könnte, nach der Einstellung auf eine deutlich größere Zahl (365?) neu zu generieren.

Ich glaube, ich liege richtig, wenn ich sage, dass, wenn etwas nicht lokal hochgeladen wird, kein Thumbnail erstellt wird? …

4 „Gefällt mir“

:+1: Richtig, das funktioniert nur bei lokalen Uploads… wir müssen vielleicht die Einstellung „maximale Tage alt

8 „Gefällt mir“

Ich habe einen Plan und werde versuchen, dies diese Woche umzusetzen. Eine Frage: Müssen die Werte dynamisch sein?

Also: Werden die Auflösungen beim Start festgelegt oder zur Laufzeit (z. B. über die Site-Einstellungen)?

Ersteres ist einfacher … aber Letzteres könnte auch möglich sein :thinking:

2 „Gefällt mir“

Danke, dass du dir das angesehen hast.

Ich brauche einfach eine feste Lösung, genau wie beim Theme-Komponenten-Plugin.

Eine Site-Einstellung wäre zwar nett.

Zur vollständigen Offenlegung: Ich möchte das Plugin verlassen, daher wäre eine Parität mit der Theme-Komponenten-Lösung mehr als ausreichend.

2 „Gefällt mir“

@merefield hier ist es:

Hoffentlich erklärt die Commit-Nachricht, wie es funktioniert, aber lass mich wissen, falls du Fragen hast.

7 „Gefällt mir“

Ausgezeichnet. Ich habe es gerade zu TLP hinzugefügt, und es scheint zu funktionieren! Vielen Dank für deine Hilfe!

4 „Gefällt mir“

4 Beiträge wurden in ein neues Thema verschoben: Vorschaubilder aus JSON-Endpunkten abrufen

Können wir es auch für Bilder von einem Remote-Server funktionsfähig machen? Zum Beispiel für Bilder von Blogger, Picasa oder Amazon S3?

Da Discourse das Hosting auf Amazon S3 für große Bildersites unterstützt, scheint diese Designmethode ein Nachteil zu sein, wenn alles direkt auf dem lokalen Server gehostet werden muss.

Mit diesem Update ist es keine einfache Lösung für meine Website, da wir einen anderen Server zum Hosten der Bilder verwenden. Es ist jetzt zu schwierig, zu einem verbundenen Server mit vielen Beiträgen zu wechseln, und gleichzeitig ist die Datenmenge zu groß, um sie auf einem lokalen Server zu hosten.

Dies ist ausschließlich für Discourse-„Uploads

4 „Gefällt mir“

Hallo David, muss man etwas Besonderes tun, um sicherzustellen, dass Pro-Icons in einem TC verwendet werden können?

1 „Gefällt mir“

Nichts Besonderes, nein. Es sollte genauso funktionieren wie die Verwendung von Pro-Icons an anderen Stellen in Discourse. Ich vermute, du verwendest dieses Plugin, um Pro-Icons zu aktivieren?

Falls es nicht funktioniert, lass es mich wissen, und ich werde mir das ansehen :eyes:

2 „Gefällt mir“

Ja, das sind wir. Wir werden noch einmal nachhaken. Danke für die Antwort zu deinem späten Abend!

2 „Gefällt mir“