Woltlab Suite API ansprechen

  • Hallo zusammen,


    ich habe bereits einige Projekte in PHP umgesetzt, muss aber gestehen, dass ich in Sachen MVC und OOP noch Bedarf habe und ich möchte mir diese Lücken u.a mit der WoltLab Suite füllen.


    Ich habe vor ein Projekt zu starten (die Zeit hat es bisher leider noch nicht zugelassen) und dachte ich frage hier hilfsbereite Coder. Vielleicht kann mir ja tatsächlich jemand hilfreiche Tipps geben. Ich hoffe ich bin hier nicht im falschen Forum - wenn doch, kann der Beitrag gelöscht werden. :)


    Ich habe folgendes vor um generell endlich mal in die Programmierung für die Woltlab Suite einzusteigen:


    Derzeit ist es in der WoltLab Suite standardmäßig möglich Artikel über das Backend zu erstellen (manuell). Ich möchte in Zukunft einen Endpunkt einer bestehenden externen API ansteuern, welcher mir Content vom heutigen Tag liefert. Diesen Content bekomme ich in Form von einer Überschrift, einem Text und ggf. einem Bild wieder (somit also striings). Das passt soweit also erst einmal. Diesen Content möchte ich automatisch pflegen als neue Artikel.


    Bedeutet also über einen Cronjob möchte ich die API anfragen ob es Neuigkeiten zum heutigen Tag gibt,, den Response entgegen nehmen und automatisiert mit dem Content Artikel anlegen.


    Kann mir irgendjemand Starthilfe geben was ich beachten sollte? Jeder kleine Tipp ist definitiv hilfreich - ggf. zum Anlegen von Cronjobs in der Suite und welche Konventionen ich einhalten sollte? Prozedural über PHP wäre das sicherlich in wenigen Schritten startklar, aber innerhalb des Woltlab Frameworks OOP zu arbeiten ist wieder eine ganz andere Geschichte und sicherlich auch in dem Fall die sauberste.


    Ich freue mich auf Antwort.


    Gruß

  • Heyho,

    Der Anfang ist immer schwer, vorallem wenn man bisher nur prozedural programmiert hat. Sind denn die Grundkenntnisse für OOP bei dir vorhanden? (Was Objekte sind? Vererbung? Interfaces? Etc.)


    Die generelle Vorgehensweise wäre die Erstellung einer package.xml, mit der du einen Cronjob registrierst und über das file PiP den Cronjob an sich bereit stellst. Der Cronjob würde deine API abfragen und ggf die ArticleAction create Funktion aufrufen. Wie diese arbeitet findest du am besten als Beispiel in der ArticelForm aus dem ACP ab Zeile 416.

    Damit hättest du alle Infos, die du benötigst. Und nun kommt die entscheidende Frage, was von all dem verstehst du? ^^


    Gruß

    Marcel

  • Erst einmal besten Dank für deine Antwort. Freut mich, dass du mir auf die Sprünge hilfst.

    Sind denn die Grundkenntnisse für OOP bei dir vorhanden? (Was Objekte sind? Vererbung? Interfaces? Etc.)

    ja, natürlich 8o das stellt das geringste Problem dar.



    Und nun kommt die entscheidende Frage, was von all dem verstehst du?

    Soweit fast alles, jetzt weiß ich zumindest schon einmal das der Cronjob über die package.xml registriert wird. Das der Cronjob meine API abfragt und über die create Methode aufruft, ist auch soweit klar aber du hast mir definitiv mit der Referenz zu github weitergeholfen. Ich komm mit der Ordnerstruktur noch nicht so ganz klar.


    DIe einzige Frage die sich für mich noch ergibt ist: Was ist das file PiP?


    Besten Dank! Du hast mir mehr weitergeholfen als du wahrscheinlich glaubst 8o

  • Danke dir :thumbup:. Ich habe endlich Zeit gefunden und mich schon mal ein wenig mit der Pluginentwicklung beschäftigt, ist bisher übersichtlicher als ich eigentlich dachte. Vor allem das Erstellung von Einstellungen ist mega schnell gemacht. Dazu hat die Doku hier aber eine Menge beigetragen und wird sicherlich bei gewissen Punkten noch eine Menge beitragen. Ich hänge gerade bei einem "kleinen" Punkt fest, vielleicht kann mir den jemand beantworten.


    In Controllern rendert man über

    Code
       WCF::getTPL()->assign([
    ]);

    ins Template rein.


    1) Besteht auch die Möglichkeit, dass das Template anders als der Controller heißt? WoltLab kommt ja standardmäßig klar mit "TestPage.class.php" und nimm sich dann test.tpl als Template. Kann ich der package.xml irgendetwas mitgeben oder ggf. auch der Methode getTPL() um ein anderes Template anzusprechen oder in ein anderes Template zu rendern?


    2) Desweiteren habe ich mir bestehende Templates (bspw. MessageSidebar.tpl) angeschaut. Dort wird das Objekt $userProfile genutzt um bspw. den namen des Benutzers auszugeben. In welcher Klasse wird das Objekt in das Template MessageSidebar.tpl gerendet? Ich finds einfach nicht.. Habt ihr irgendeinen Trick, wie ihr von dem Template zur PHP-Klasse (bzw. dem Controller) kommt? Ich weiß nicht woher das $userProfile - Objekt in dem Template kommt. Weiß das hier ggf. jemand? Das ist nicht wirklich relevant für die Entwicklung, aber mein innerer Schweinehund will es wissen ^^


    Bleibt allesamt gesund.


    Grüße

  • Dazu hat die Doku hier aber eine Menge beigetragen und wird sicherlich bei gewissen Punkten noch eine Menge beitragen.

    Das freut mich natürlich zu hören :)

    1) Besteht auch die Möglichkeit, dass das Template anders als der Controller heißt? WoltLab kommt ja standardmäßig klar mit "TestPage.class.php" und nimm sich dann test.tpl als Template. Kann ich der package.xml irgendetwas mitgeben oder ggf. auch der Methode getTPL() um ein anderes Template anzusprechen oder in ein anderes Template zu rendern?

    Jepp:

    https://github.com/WoltLab/WCF…bstractPage.class.php#L89

    https://github.com/WoltLab/WCF…bstractPage.class.php#L95


    Einfach die zwei variabeln definieren in einer Page oder Form und fertig :) Wobei du letzteres nur brauchst, wenn es eine eigene Endanwendung wäre, was ich in deinem Fall nun aber nicht vermute.


    2) Desweiteren habe ich mir bestehende Templates (bspw. MessageSidebar.tpl) angeschaut. Dort wird das Objekt $userProfile genutzt um bspw. den namen des Benutzers auszugeben. In welcher Klasse wird das Objekt in das Template MessageSidebar.tpl gerendet? Ich finds einfach nicht.. Habt ihr irgendeinen Trick, wie ihr von dem Template zur PHP-Klasse (bzw. dem Controller) kommt? Ich weiß nicht woher das $userProfile - Objekt in dem Template kommt. Weiß das hier ggf. jemand? Das ist nicht wirklich relevant für die Entwicklung, aber mein innerer Schweinehund will es wissen

    Die messageSidebar.tpl ist immer nur ein eingebundenes Template und bezieht daher die Informationen aus dem Template und daher wiederum aus der Page Klasse, wo sie dargestellt werden soll. Mal versucht an dem Beispiel der Konversationen zu erklären:


    https://github.com/WoltLab/com…sationMessageList.tpl#L11

    Hier wird das Template einfach nur eingebunden.


    https://github.com/WoltLab/com…rsationMessageList.tpl#L7

    Hier wird die Variabel userProfile definiert


    https://github.com/WoltLab/com…nversation.class.php#L114

    Und bezieht hier her seine Informationen zu einer UserProfile Klasse


    Es gibt also nicht "die" Klasse, die für das Darstellen verantwortlich ist, sondern muss von Objekt zu Objekt immer erst mal definiert werden.


    Gruß

    Marcel

  • Hi,


    Danke für die super Erklärung. Jetzt leuchtet es mir ein. Ich habe gar nicht daran gedacht, dass im Template die Variablen übergeben werden. Ich dachte es muss immer von einer Klasse in die Templates gerendert werden, scheinbar kann ich durch {assign} im Template aber auch eine Variable definieren und dieser einen Wert zuweisen bspw. durch das Aufrufen einer Methode. Das macht jetzt natürlich Sinn und ich hoffe ich habe es nun verstanden. Wobei ich mich halt frage, weshalb das ganze nicht direkt über den Controller im Template verfügbar gemacht wird. Weshalb erst im Template? Würde doch auf das selbe hinaus laufen und einen wirklichen Vorteil erkenne ich jetzt gerade noch nicht.


    Die Beispiele gucke ich mir zu Hause an vielleicht erübrigt meine Frage sich dann, derzeit bin ich noch mit dem Handy online.


    By the way: Wie kann man das Forum hier unterstützen?


    Gruß

    JAY

  • Würde doch auf das selbe hinaus laufen und einen wirklichen Vorteil erkenne ich jetzt gerade noch nicht.

    Ein immer wieder aufkehrendes Problem ist, wenn Variabelnamen im Template gleich sind und von verschiedenen Klassen (z.B. durch weitere Plugins) überschrieben werden. Da macht es dann schon Sinn, wenn man solch allgemeine Variabeln wie $userProfile vor der Verwendung erst zuweist. Ist keine Pflicht, eher als Vorsorge gemeint um potentielle Fehler zu umgehen.


    By the way: Wie kann man das Forum hier unterstützen?

    Wer an der Doku mitarbeiten möchten, ist immer gern eingeladen Einträge zu verfassen. Jedes bisschen Wissen kann anderen helfen ;)

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!