Neuerungen für Entwickler in WoltLab Suite 5.3

Neue Template-Plugins

Wir haben einige neue Template-Plugins mit dem Ziel eingeführt, die Komplexität von Templates und Phrasen zu verringern und duplizierten Code zu verringern.

anchor

Das anchor-Template-Plugin erzeugt a-HTML-Elemente und ihm können Objekte übergeben werden, die ITitledLinkObject implementieren:

Smarty
{anchor object=$object}
{* generates the same output as: *}
<a href="{$object->getLink()}">{$object->getTitle()}</a>

Alternativ können link- und content-Attribute verwendet werden:

Smarty
{anchor link=$linkObject content=$content}
{* generates the same output as: *}
<a href="{$linkObject->getLink()}">{$content}</a>

wobei $linkObject ILinkableObject implementiert und $content entweder ein Objekt ist, das ITitledObject implement oder eine __toString()-Methode besitzt, oder $content ist eine String oder eine Zahl.

Weitere Informationen sind in unserer Entwickler-Dokumentation zu finden.

user

Links zu Benutzerprofilen werden sehr häufig in Templates erzeugt. Um diese Aufgabe zu vereinfachen, wurde das user-Template-Plugin hinzugefügt, das nur ein UserProfile-Objekt benötigt:

Smarty
{user object=$user}

ist äquivalent zu

Smarty
<a href="{$user->getLink()}" data-object-id="{$user->userID}" class="userLink">{@$user->getFormattedUsername()}</a>

Standardmäßig wird der formattierte Benutzernamen ausgegeben, der als „Benutzer-Darstellung“-Einstellung der relevanten Benutzergruppe verwendet wird. Außerdem werden die Attribute ausgegeben, die benötigt werden, damit das Benutzer-Popover erscheint, wenn man mit der Maus über den Link fährt.

Weitere Informationen, beispielsweise wie mit dem neuen Template-Plugin auch Benutzeravatare ausgegeben werden können, sind in unserer Entwickler-Dokumentation zu finden.

plural

Das plural-Template-Plugins vereinfacht es, Texte zu generieren, bei denen zwischen Singular und Plural unterschieden werden muss, ohne if-Konstrukte zu verwenden. # dient dabei als Platzhalter für den eigentlichen Wert.

Deutsches Beispiel

Smarty
{assign var=numberOfWorlds value=2}
<h1>Hallo {plural value=$numberOfWorlds 1='Welt' other='Welten'}!</h1>
<p>Es gibt {plural value=$numberOfWorlds 1='eine Welt' other='# Welten'}!</p>
{* generates *}
<h1>Hallo Welten!</h1>
<p>Es gibt 2 Welten!</p>

Englisches Beispiel

Smarty
{assign var=numberOfWorlds value=2}
<h1>Hello {plural value=$numberOfWorlds 1='World' other='Worlds'}!</h1>
<p>There {plural value=$numberOfWorlds 1='is one world' other='are # worlds'}!</p>
{* generates *}
<h1>Hello Worlds!</h1>
<p>There are 2 worlds!</p>

Weitere Informationen, insbesondere für Sprachen mit komplexeren Regeln, sind in unserer Entwickler-Dokumentation zu finden.

jslang

Wenn Phrasen in JavaScript-Code verfügbar via Language.addObject() zugänglich gemacht werden, sollte jslang in einfachen Anführungszeichen anstelle von lang verwenden werden, um Probleme mit Anführungszeichen zu vermeiden:

JavaScript
// old
Language.addObject({
    'app.foo.bar': '{lang}app.foo.bar{/lang}',
});
// new
Language.addObject({
    'app.foo.bar': '{jslang}app.foo.bar{/jslang}',
});

Verringere Komplexität von Benachrichtigungsphrasen

Benachrichtigungsphrasen können ziemlich komplex sein, insbesondere für gruppierte Benachrichtigungen. Zusätzlich zum plural-Template-Plugin haben wir weitere Aspekte bei diesen Phrasen geändert, um ihre Komplexität zu verringen:

Da die gesamte Benachrichtigung nun angeklickt werden kann, wurden alle Links mit strong-Elementen im Benachrichtigungstext ersetzt.

Häufig verwendeter Templatecode um Reaktionen oder Labels auszugeben kann durch den Aufruf neuer Methoden ersetzt werden:

Außerdem wurde das häufig verwendete Konstrukt

Smarty
{if $count < 4}{@$authors[0]->getAnchorTag()}{if $count != 1}{if $count == 2 && !$guestTimesTriggered} und {else}, {/if}{@$authors[1]->getAnchorTag()}{if $count == 3}{if !$guestTimesTriggered} und {else}, {/if} {@$authors[2]->getAnchorTag()}{/if}{/if}{if $guestTimesTriggered} und {if $guestTimesTriggered == 1}ein Gast{else}Gäste{/if}{/if}{else}{@$authors[0]->getAnchorTag()}{if $guestTimesTriggered},{else} und{/if} {#$others} weitere Benutzer {if $guestTimesTriggered}und {if $guestTimesTriggered == 1}ein Gast{else}Gäste{/if}{/if}{/if}

in Phrasen für gruppierte Benachrichtigungsnachrichten mit einer neuen Phrase ersetzt:

Smarty
{@'wcf.user.notification.stacked.authorList'|language}

void-Package-Installation-Plugin

Um die Metadaten eines Paketes zu aktualisieren ohne etwas anderes zu ändern, wurde der <void/>-Marker für Update-Anweisungen hinzugefügt:

XML
<instructions type="update" fromversion="1.0.0">
    <void/>
</instructions>

Wenn der <void/>-Marker vorhanden ist, darf es keine weiteren Update-Anweisungen geben.


Weitere Informationen befinden sich in unserem Migrationsguide von WoltLab Suite 5.2 nach WoltLab Suite 5.3 in unserer Entwickler-Dokumentation:

Kommentare 5

Muss ich meine if Abfrage bezüglich des users in meiner Template Box in 5.3 dann auf das neue umbauen oder bleibt der "alte" Code tauglich?

Prinzipiell kannst du dir merken: Solange bei der WSC Version vorne die 5 steht, sollte der bisherige Code funktionieren, solange sich WL an SemVer hält (was sie mWn. ja tuen wollen). Wobei natürlich hier auch seltene Ausnahmen gibt (dies ist aber eig. nicht die Regel)

D.h. man kann nun nicht mehr - wie bislang meistens - etwas gezielt anklicken sondern landet zwangsweise immer beim Objekt?

Das würde mich auch mal interessieren. Ein klassisches Beispiel wäre auch, dass man zunächst zum Benutzerprofil möchte statt zum eigentlichen Objekt.

// Edit: Hat sich erledigt, das geht ja über Avatar trotzdem noch (auch bei mehreren Usern).

Der alte Template-Code ist weiterhin gültig, es ist nicht zwingend erforderlich auf den neuen Code umzusteigen.

Muss ich meine if Abfrage bezüglich des users in meiner Template Box in 5.3 dann auf das neue umbauen oder bleibt der "alte" Code tauglich?

Die Änderungen reduzieren zwar nur etwas den eigenen Code, aber gerade der Ansatz mit plural und den gruppierten Benachrichtigungen hilft extrem. Das wuselte ja vorher nur so von ifs. Klasse, danke dafür!

Da die gesamte Benachrichtigung nun angeklickt werden kann, wurden alle Links mit strong-Elementen im Benachrichtigungstext ersetzt.

D.h. man kann nun nicht mehr - wie bislang meistens - etwas gezielt anklicken sondern landet zwangsweise immer beim Objekt?
Es gibt nämlich durchaus Anwendungsszenarien für geschachtelte Objekte, am einfachsten nehmen wir doch mal die Antwort auf einen Kommentar auf ein Objekt. Bislang habe ich dies so implmentiert, dass der User, das Objekt und die Kommentar-Antwort direkt aufrufbar waren. Zukünftig wäre das dann nur noch die Kommentar-Antwort, richtig?