Daten aus Datenbank auslesen

  • Hallo Leute,

    ich steck mal wieder bei einer Sache fest die nicht ganz funktioniert.

    Ich möchte ein einfaches KategorieMenü erstellen, welches die Daten (iconName, categoryName...) aus die Datenbank zieht. Ich erstelle also die Tabelle per install.sql, sowie ein Template für die Ausgabe - dazu noch zwei DatabaseObject-Klassen und los gehts. Irgendwas hab ich hier aber sicher noch übersehen... (vielleicht ein Event?)

    Hier mal ein paar Codes

    Category.class


    CategoryList.class

    PHP
    class CagetoryList extends DatabaseObjectList {
    	/**
    	 * @see	wcf\data\DatabaseObjectList::$className
    	 */
    	public $className = 'wcf\data\category\Category';
    }


    categoryList.tpl

    HTML
    <nav class="categoryList">
    	<ul>
    		{foreach from=$categoryList item=category}
            	<li><a href="#">{@$category->categoryName}</a></li>
            {/foreach}
    	</ul>
    </nav>

    jemand auf Anhieb eine Idee?

    Entwicklung und Design moderner Webapplikationen

    kostenloser Support • Vorschläge teilen • Plugins kaufen

    Darkwood.Design

    Einmal editiert, zuletzt von Darkwood.Design (26. September 2012 um 10:01)

  • zum Fehler:
    - also Fehlermeldungen tauchen erstmal keine auf
    - das Paket samt Templates wird erfolgreich installiert und eingebunden
    - nach Installation ist die <nav><ul></ul></nav> leer (logisch da die Tabelle 'wcf1_category' ebenfalls leer ist)
    - füge ich nun aber einen Eintrag in die Tabelle hinzu, bleibt die Navigation immernoch leer, sprich die {foreach} scheint nicht wirklich auf die Tabelle zuzugreifen...

    Zitat

    schaue mal, ob daran der Fehler liegt: CagetoryList -> CategoryList

    meinst du im Template? Ich denke hier ist "{@$category->categoryName}" auf jeden Fall richtig da "$category" ja in der {foreach} definiert wird (nicht categoryList). und der Spaltenname des Datenbankobjekts ist 'categoryName' - sollte also auch stimmen.

    Entwicklung und Design moderner Webapplikationen

    kostenloser Support • Vorschläge teilen • Plugins kaufen

    Darkwood.Design

    • Offizieller Beitrag

    Hallo,

    der Name der Klasse CategoryList ist falsch. Außerdem: Du weißt schon, dass das Framework eigene Category*-Klassen, die auf die wcfN_category-Tabelle zugreifen, mitbringt!?

    Es wäre also gut zu wissen, ob Du die abstrakte Framework-Implementierung verwendest oder etwas eigenes, im letzteren Fall bräuchte man mehr Code, um eine genauere Aussage zu machen. Aber wenn die Liste leer bleibt, heißt das ja, das keine Kategorien gelesen wurden, also muss im Lese-Prozess der Fehler sein.

  • ah danke für deine Hilfe. Den Schreibfehler habe ich korrigiert, hat aber nichts geändert.

    Mit den Category*-Klassen hät ich mir mal erst anschauen sollen - das Ganze soll unabhängig davon sein (hab ich kurzerhand in 'family' umbenannt)

    leider tut sich immernoch nichts - zum besseren Verständnis hab ich das Testpaket mal in den Anhang gepackt
    //edit: <plugin> tag wurde noch ergänzt, da es sich um ein Plugin für eine einfache Endanwendung handelt

    Anmerkung:
    wozu ist eigentlich das Category-System im WCF gedacht? (zur Not könnte man vielleicht doch über die Benutzung nachdenken, von den Tabellen her würde es passen)

    • Offizieller Beitrag

    Hallo hassi_2k7,

    zu templateListener.xml: Im Template mainMenu.xml existiert kein Template-Event, also wird der Code dort auch nicht angezeigt. Selbst wenn es das Event geben würde, würde es zu einem Fehler kommen, weil die Template-Variable $familyList undefiniert ist.

    Zum Category-System im WCF: Das ist dafür gedacht, dass nicht jedes Paket, das Kategorien benötigt, diese selbst implementieren muss, sondern auf die abstrakte Implementierung zurückgreifen kann und nur noch drei minimale ACP-Seiten/Formular-Klassen und eine *CategoryType-Klasse erstellt werden muss. Ein Beispiel wäre beispielsweise eine Wissensdatenbank, die ihre Artikel in verschachtelbare Kategorien sortiert.

  • Hallo hassi_2k7,
    Zu templateListener.xml: Im Template mainMenu.xml existiert kein Template-Event, also wird der Code dort auch nicht angezeigt.


    das Template mainMenu wird durch meine Endanwendung erneuert - und hier exisitiert dieses Event - soweit funktioniert auch alles fehlerfrei (Template wird erfolgreich eingebunden)

    Zitat

    Selbst wenn es das Event geben würde, würde es zu einem Fehler kommen, weil die Template-Variable $familyList undefiniert ist.


    zu einem Fehler kommt es zwar nicht, aber grundlegend hast du Recht. normalerweise würde ich die Variable noch entsprechend definieren(wcf1) - ich habe aber etwas beim 'comment' Paket fürs wcf2 abgeschaut und dort wird scheinbar auch die entsprechende Variable nicht extra definiert - also war meine Logik so, dass diese Variable automatisch über WCF anhand der DatabaseObject-Klassennamen definiert wird(analog der Templates die man ebenfalls nichtmehr zuweisen muss) - scheinbar lieg ich damit aber falsch?

    Freue mich auf dein Feedback.

    edit:
    im Paket *comment* wird die Variable '$commentList' im CommentListener definiert (in Kombination mit dem CommentHandler)... bin mir aber nicht sicher ob ich soetwas wirklich benötige - ich versuch mal einfach einen eventlistener einzubauen, vielleicht hilfts

    Entwicklung und Design moderner Webapplikationen

    kostenloser Support • Vorschläge teilen • Plugins kaufen

    Darkwood.Design

    4 Mal editiert, zuletzt von Darkwood.Design (26. September 2012 um 11:38)

  • so, hab erstmal das Paket ausgemistet - war ja voller Fehler (schade dass das WCF2 aktuell kaum Fehler ausgibt)

    Paket liegt im Anhang. siehe auch die Anmerkung in der FamilyList.class

    Freue mich auf Feedback :)

    EDIT:
    hab noch ein paar Flüchtigkeitsfehler korrigiert - jetzt bin ich aber mit meinem Latein am Ende...

  • Nachtrag:
    ich denke an dem part hängt es jetzt


    hier bin ich mir noch unsicher wie das Ganze mit dem WCF2 umgesetzt wird... denke es hat irgendwas mit dem 'conditionBuilder' zu tun - aber jetzt brauch ich mal einen Denkanstoß

    PS:
    gibt es eine Möglichkeit im WCF2 alle Fehler auszugeben? Die Fehlermeldungen scheinen mir doch recht begrenzt zu sein (normaler Weise dürfte meine Seite mit dem Plugin garnicht mehr laufen)

    Entwicklung und Design moderner Webapplikationen

    kostenloser Support • Vorschläge teilen • Plugins kaufen

    Darkwood.Design

  • Das WCF benutzt PreparedStatements (kann man sich zur Genüge in den Originaldateien abschauen). Was die Fehlermeldungen angeht: Das WCF selber wirft nur Fehlermeldungen, wenn Fehler erwartbar und dementsprechend feststellbar sind.
    Beim momentanen Status des WCF kommt leider erschwerend hinzu, dass einige dieser feststellbaren Exceptions zwar geworfen und gleich gefangen werden, aber im catch-Block nichts gemacht wird. Der Code selber läuft weiter und am Ende weiß niemand, wo der Fehler stattfand. Geloggt wird die SystemException auch erst, wenn sie angezeigt wird. Also hilft einem auch der Log nicht viel weiter.

    Die meisten deiner Fehler dürften an den von allen Entwicklern gehassten inhaltlichen Fehlern liegen. Diese lösen keine Exceptions aus, da rein formal alles richtig zu sein scheint. Inhaltlich ist aber irgendwo ein Fehler versteckt. Das lässt sich bei PHP sehr schwer herausfinden.

    Da gibt es meistens die echo/var_dump-Methode oder die xDebug/Zend Debugger-Methode. Die erste geht dem Prinzip nach die Fehlerursache einzugrenzen. Unter der Annahme, dass das WCF selber keine Fehler aufweist (momentan beim WCF 2 noch nicht wirklich der Fall), wird bei den betroffenen eigenen Dateien Stück für Stück etwas ausgegeben. Funktioniert die Ausgabe, dann liegt bis dahin kein Fehler vor. Liefert die Ausgabe nicht das erwünschte Ergebnis oder erscheint gar nicht, dann weiß man zumindest in welchen Teilstück der Fehler stattfindet.

    Die zweite Methode setzt auf schrittweises Debugging.

    • Offizieller Beitrag

    Nachtrag:
    ich denke an dem part hängt es jetzt


    hier bin ich mir noch unsicher wie das Ganze mit dem WCF2 umgesetzt wird... denke es hat irgendwas mit dem 'conditionBuilder' zu tun - aber jetzt brauch ich mal einen Denkanstoß


    Warum nutzt du dafür nicht eine *List-Implementierung, genau dafür sind die da :)

    gibt es eine Möglichkeit im WCF2 alle Fehler auszugeben? Die Fehlermeldungen scheinen mir doch recht begrenzt zu sein (normaler Weise dürfte meine Seite mit dem Plugin garnicht mehr laufen)


    Das liegt an deiner PHP-Konfiguration, standardmäßig werden nur kritische Fehler von PHP beachtet und alles andere still schweigend ignoriert. Zur Entwicklung bieten sich folgende Einstellungen an:

    Code
    error_reporting = E_ALL
    display_errors = On

    PS: Der Condition-Builder ist für etwas ganz anderes zuständig, mit dem kannst du WHERE-Bedingungen für Prepared Statements erzeugen, siehe auch: https://github.com/WoltLab/WCF/wi…onditionBuilder
    PPS: SQL-Abfragen funktionieren bei WCF 2.0 anders: https://github.com/WoltLab/WCF/wiki/Querying-database

  • danke fürs Feedback, error_reporting habe ich entsprechend angepasst - jetzt nochmal zum Thema Datenbank auslesen...


    Warum nutzt du dafür nicht eine *List-Implementierung, genau dafür sind die da :)


    genau das mach ich doch oder verstehe ich dich falsch?

    familyList.class.php

    edit:
    im Anhang hab ich mal meine /Files/ (nicht wundern, Klassenname hat sich erneut geändert) - bin mir nämlich grad nicht sicher ob ich den eventlistener+handler überhaupt benötige... freue mich auf Hilfe.
    Edit2:
    Der Fehler ist übrigens "Undefined index: pcategoryList"

  • hab jetzt noch ein bisschen rumprobiert, aber den Fehler bekomm ich nicht weg... ich denke der SQL-Part sollte so stimmen(siehe letzte Posting), aber das TPL->assign welches ich in der PcategoryListener.class durchführe funktioniert scheinbar nicht... ist der Listener+Handler vielleicht überflüssig und ich sollte assignVariables() woanders ausführen?

    Freue mich auf einen Denkanstoß :)

    Entwicklung und Design moderner Webapplikationen

    kostenloser Support • Vorschläge teilen • Plugins kaufen

    Darkwood.Design

  • Reicht doch hin...

    Und dann in der Template

    Code
    {foreach from=$objects item=family}

    Warum dann soviel Code reinhauen ??

    MfG Marco

    Einmal editiert, zuletzt von xDeraiser (27. September 2012 um 17:35)

  • Du musst natürlich per EventListener oder einer anderen Anzeigeklasse (*Page, *Form) die Objects auslesen und dann übergeben. Beim Auslesen nur aufpassen, denn in der Dokumentation ist nicht erwähnt, dass getObjects() erst nach readObjects() aufgerufen werden darf.

  • Kommt darauf an, was du machen willst. Bei einer eigenen Seite brauchst du ein Template, eine *Page-Klasse und in diesem Fall wohl deine *List-Klasse. Wenn du eine vorhandene Seite erweiterst, dann brauchst du einen EventListener und deine *List-Klasse.

  • Die Page Datei dazu....

    MfG Marco

  • Danke euch soweit. Das Paket soll nicht über eine extra Seite aufgerufen werden, sondern eine Art Categoriemenü auf allen Seiten werden.
    Also denke ich mal benötige ich eine *Page nicht, sondern einen Eventlistener?

    Doch wie genau müsste dieser Listener aussehen? und benötige ich in meinem Fall auch einen Handler dazu? - Danke für eure Hilfe.

    Entwicklung und Design moderner Webapplikationen

    kostenloser Support • Vorschläge teilen • Plugins kaufen

    Darkwood.Design

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!