Neuerungen für Entwickler in WoltLab Suite 5.3

  • In den vorherigen drei Teilen haben wir uns primär mit den greifbaren Neuerungen und Verbesserungen der WoltLab Suite 5.3 befasst. In Neuerungen in WoltLab Suite 5.3 (Teil 3) haben wir zuvor beispielsweise die überarbeitete Verwaltung der Benachrichtigungseinstellungen oder die Neugestaltung der Trophäen genauer beleuchtet.


    Wir möchten diese Reihe kurzfristig unterbrechen, um auf Änderungen einzugehen, die für Entwickler von Erweiterungen und Apps von Bedeutung sind. Dieser Teil richtet sich ausschließlich an Entwickler, wir werden erst mit dem nächsten regulären Teil 4 wieder auf weitere Neuerungen für die Betreiber bzw. Nutzer eingehen.

    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:

  • 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?

    MfG

    Fr33chen

  • 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?


  • 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).

    Gruß

    Jörg

    (Jaydee)

  • 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)