Template und Arrays

  • Hallo,

    ich habe ein Problem mit der Logik, ein Array mit Hilfe eines Templates auszugeben. Das fängt leider schon bei der Übergabe der Daten per WCF:: getTPL()->assign(array( an.

    Vielleicht kann einer von euch mir einen kleinen Schubser geben, ich möchte generell schon selber dahinter kommen.

    Mit dem folgenden Code fülle ich ein mehrdimensionales Array. Ich nehme an, dass ich schon diesen Teil (vor der Übergabe ans Template) nicht so übernehmen kann.


    Das Ergebnis ist einwandfrei:


    Danke, Ramon.

  • Statt ["$item->title","$item->description","$item->link","$item->pubDate"] kannst du auch [$item->title, $item->description, $item->link, $item->pubDate] schreiben, das hat den gleichen Effekt und ist schneller.

    Wie sieht denn deine PHP-Klasse aus die du für die Ausgabe verwendest? Siehe https://github.com/WoltLab/WCF/wi…age#2-php-class

  • Schau dir mal das an:
    https://www.woltlab.com/downloads/manual/wcfdoc_de.pdf
    Zusätzlich noch die ganzen Tutorials von @Black Rider und hier im Forum.

    #Edit: Z.B.: https://kittblog.com/article/2/comm…-eigene-plugin/

    Das Manual habe ich geöffnet und die Beiträge unter kittblog.com waren eine große Hilfe.


    Ich habe den Code nun mal in eine PHP-Klasse umgewandelt und hier kollidiere mit der Logik. ;(

  • Vielen Dank. Da war ich doch schon recht nahe dran, aber auf die Funktion "readData()" wäre ich so schnell nicht gekommen.

    Heute Abend werde ich mir dann mal die Verarbeitung im Template ansehen.

    --
    Ich sehe gerade dass folgender Fehler ausgeworfen wird: WCF::handleException() Unhandled exception: Class 'wcf\page\SimpleXMLElement' not found

    Unter "SimpleXMLElement nutzen" gibt es noch keine Idee dazu.

    Edited once, last by RamonKaes (June 16, 2016 at 9:01 AM).

  • Nein, das sind einfach namspaces und deren Funktionsweise ;)
    Du Arbeitest quasi in einem "unterordner" und wenn du dann keinen "absoluten pfad" angibst geht php davon aus dass die Klasse die du aufrufen möchtest auch dort zu finden ist.

  • Mit folgender Schleife habe ich nun alles erfolgreich ins Template übertragen und es läuft:

    Code
    {foreach from=$content item=f1}
    	<h3><a href="{$f1[2]}">{$f1[0]}</a></h3>
    	<p><small>{$f1[3]}</small></p>
    	<p>{$f1[1]}</p>
    {/foreach}

    Bei der foreach-Schleife in der PHP-Klasse habe ich die mit den eckigen Klammern eingesetzt und gleichzeitig das Datum angepasst:

    PHP
    foreach($data->channel->item as $item) {
    	$this->content[] = [$item->title,$item->description,$item->link,date('d.m.Y H:i', strtotime((string) $item->pubDate))];
    }


    :thumbup: Danke für eure Hilfe

    Edited once, last by RamonKaes (June 16, 2016 at 2:20 PM).

  • Hallo,

    ich empfehle die \wcf\util\HTTPRequest-Klasse, um die Daten herunterzuladen und \wcf\util\XML, um die Daten zu verarbeiten. In beiden Klassen ist auch eine saubere Fehlerbehandlung implementiert: Dazu musst du dann aber noch die geworfenen Exceptions fangen (beispielsweise, wenn der andere Server nicht erreichbar ist), aber das ist auch jetzt schon der Fall.

  • @TimWolla: ich hätte eh gesagt dass es am sinnvollsten wäre nicht bei jedem aufruf aufs neue den Feed zu parsen sondern entweder per cron die neuen sachen zu laden und in der DB zu verwalten oder aber einfach via cache eine statische version zu speichern und dem cach dann ne entsprechend kurze lebensdauer zu geben...

  • Hallo,

    @TimWolla: ich hätte eh gesagt dass es am sinnvollsten wäre nicht bei jedem aufruf aufs neue den Feed zu parsen sondern entweder per cron die neuen sachen zu laden und in der DB zu verwalten oder aber einfach via cache eine statische version zu speichern und dem cach dann ne entsprechend kurze lebensdauer zu geben...

    ja, selbstverständlich. Aber auch in den Cronjob gehört eine passende Fehlerbehandlung.

  • Das wäre ein perfektes PlugIn, mit Cache, CronJob, Fehlerbehandlung, Optionen und alles mit WCF-Boardmitteln.
    Wenn ich die Zeit und die Fähigkeiten hätte so etwas nebenbei umzusetzen, dann würde ich es machen.

    Das kleine Feed-PlugIn hier wird hoffentlich auch nur eine Übergangslösung bleiben. Ich habe es benötigt, da ich einzelne Foren im Dashboard nur begrenzt ausklammern kann. Der RSS-Feed hat mein Dashboard dermaßen dominiert, das dieses keinen Mehrwert mehr für die User darstellte.

    Zudem schaltet sich der CronJob des WCF-RSS-Readers selbstständig ab, postet immer wieder doppelte Einträge und kann keine Media-Daten verarbeiten.
    https://community.woltlab.com/thread/239029-…ren-ausblenden/

  • naja, zur verwendung eines caches ist eigentlich nicht viel nötig, daher vermutlich auch für dich die optimale lösung.
    Im grunde tust du damit nichts anderes als deine getFeed funktion auszulagern, die gesammte logik in sachen speichern usw wird dann dort übernommen:

    das ist alles, wie du siehst ist der großteil 1 zu 1 aus deiner getFeed funktion übernommen. Der cache wird alle 5 minuten automatisch erneuert (maxlifetime ist die lebensdauer in sekunden, kann also auch angepasst werden).
    Ganz oben musst du dann zusätzlich zu use wcf\system\WCF in einer neuen zeile den cache einbinden indem du wcf\system\cache\builder\F1FeedCacheBuilder in einer neuen Zeile hinzufügst.
    in deiner readData funktion fliegt dann das $this->getFeed(); und wird ersetzt durch $this->content = F1FeedCacheBuilder::getInstance()->getData();
    Das sollte alles sein, habs jetzt nicht getestet, aber als Anhaltspunkt sollte es dir denke ich schon helfen ;)

    Die Anderen Punkte die @TimWolla sollten jedoch nicht außer Acht gelassen werden, am besten schaust du die auch mal dort die Klassen an die er erwähnt hat, ich hab das bewusst ausgelassen um dich nicht gleich gänzlich zu überfordern ;)

  • Damit wir uns nicht missverstehen, meine PHP-Fähigkeiten verbieten es eigentlich, dass ich mich überhaupt an ein PlugIn wage. Ich genieße es zwar, wenn sich ein „kleines“ Problem hier so lösen lässt, dass ich es nachvollziehen kann, ich werde aber in diesem Leben kein Programmierer mehr werden.

    Für meine momentanen Bedürfnisse ist das Script völlig ausreichend. Ich kann ja mal einen PlugIn-Wunsch posten, vielleicht hat ja jemand die Muße dieses in vollendeter Form zu erstellen.


    Übrigens bekomme ich folgenden Fehler von F1FeedCacheBuilder.class.php: Serialization of 'SimpleXMLElement' is not allowed

  • OK, die "Serialization" hätte ich vom Tisch :huh:

    Allerdings wird nichts in den Cache geschrieben

    PHP: Cache
    <?php exit; /* cache: wcf_Feeder (generated at Sat, 18 Jun 2016 10:57:50 +0000) DO NOT EDIT THIS FILE */ ?>
    a:0:{}

Participate now!

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