BoardInformationBox

  • Hallo zusammen,

    Ich arbeite zurzeit an einem Board Information Box Plugin mit dem man ua. über jedem Forum eine definierbare Box einfügen kann.
    Diese wird dann per Event Listener an die User Messages übergeben und angezeigt

    Meine Frage ist jetzt allerdings,

    • ist es möglich das ohne weiteres ins Caching einzubeziehen ?
    • Gibt es einen "sinnvolleren" Weg zur Datenbankabfrage ?
    • Wie kann ich innerhalb des Event Listeners die aktuelle Sprache auslesen ?

    Gruss
    Cyb'

    [font='Comic Sans MS, sans-serif'][size=8]Grüsse CybroX
    Offiziell inaktiv ~ Alle Aussagen veraltet.

  • ist es möglich das ohne weiteres ins Caching einzubeziehen ?

    Klar, einfach einen passenden Cachebuilder erstellen und korrekt initialisieren, dann geht das ohne Probleme.

    Gibt es einen "sinnvolleren" Weg zur Datenbankabfrage ?

    Ja, wenn du nur eine Zeile brauchst, empfehl ich dir mit WCF::getDB->getFirstRow() zu arbeiten. So wird auch nur die erste Zeile ausgelesen.
    Außerdem solltest du anstatt mysql_real_escape_string() lieber escapeString() verwenden. Ist ein Alias für WCF::getDB()->escapeString(). Die Funktion beachtet das Datenbank-Backend und ersetzt relevante Zeichen passend zum Datenbanktyp.

    Wie kann ich innerhalb des Event Listeners die aktuelle Sprache auslesen ?

    Ich würde das einfach anders lösen. Der Content deiner InfoBox soll eine Sprachvariable sein können. Dann brauchst du nur die Sprachengine über den Content laufen lassen. Ist es keine Sprachvariable, wird der eingegebene Text ausgegeben. Ist es eine Sprachvariable, wird diese korrekt aufgelöst. Natürlich muss der Benutzer die Sprachvariable dann eben anlegen, wenn er Mehrsprachigkeit benötigt. So ist im WCF die Mehrsprachigkeit gelöst, etwa der Ränge bzw. im Forum der Forennamen.

    P.S.: Nach gutem WCF-Stil sollte deine Variable $bid besser $boardID heißen. Außerdem braucht es keine Backticks in Abfragen. Und ich würde mir auch nochmal anschauen, ob es gut ist, direkt Die Variablenwerte in den HTML-Code einzubauen und ob nicht ggf. ein Escaping nötig ist.

    Einmal editiert, zuletzt von 0xLeon (15. November 2012 um 11:44) aus folgendem Grund: Rechtschreibung

    • Offizieller Beitrag

    Ja, wenn du nur eine Zeile brauchst, empfehl ich dir mit WCF::getDB->getFirstRow() zu arbeiten. So wird auch nur die erste Zeile ausgelesen.
    Außerdem solltest du anstatt mysql_real_escape_string() lieber escapeString() verwenden. Ist ein Alias für WCF::getDB()->escapeString(). Die Funktion beachtet das Datenbank-Backend und ersetzt relevante Zeichen passend zum Datenbanktyp.


    Das geht schon in die richtige Richtung, allerdings ist die Nutzung von escapeString() an dieser Stelle eine potentielle Schwachstelle, wenn man eh nur eine ID erwartet.

    • ID = intval()
    • Alles andere = escapeString()


    Je nachdem wo das Event steckt (ich nehme mal an auf BoardPage?) hast du Zugriff auf $eventObj->board->boardID, das erspart dir die Validierung.

    Alexander Ebert
    Senior Developer WoltLab® GmbH

  • Ersteinmal danke für eure Antworten.
    Ich habe es nun erweitert/ausgebessert, und stehe nun bei der sprachlichen Umsetzung an.

    Das per Sprachvariabeln zu lösen wäre theoretisch eine viel bessere, aber das Problem ist, dass die für jedes Forum erstellt werden müsste - was ja dann logischerweise nicht bei der Installation funktioniert - und ich in der API Dokumentation keine Methode gefunden habe die es erlaubt Sprachvariabeln direkt zu erstellen (falls diese noch nicht existieren) oder zu ändern.
    Übersehe ich da was? - Oder gibt es einen viel einfacheren Weg eine ACP-Option-Textarea in einer Variable zu speichern ?

    [font='Comic Sans MS, sans-serif'][size=8]Grüsse CybroX
    Offiziell inaktiv ~ Alle Aussagen veraltet.

  • Die Variable müsste der Benutzer selber anlegen. Schau dir mal an, wie z.B. die Mehrsprachigkeit der Forentitel gelöst ist. Im Formular zum Erstellen/Bearbeiten von Foren kann der Benutzer einen Text eingeben. Dieser wird dann einfach ausgegeben. Genau so gut kann man dort aber auch eine beliebige Sprachvariable eingeben.
    Dadurch, dass der Inhalt des Titelfelds immer von der Sprachengine verarbeitet wird, wird das entsprechend aufgelöst. Ist dort nur ein Text drinne, ist dieser wohl kaum der Bezeichner einer Sprachvariable. In dem Fall wird der Text einfach unverändert zurück- und dann ausgegeben.
    Ist der Inhalt des Feldes eine gültige Sprachvariable, wird diese ausgelesen und der Inhalt passend zur eingestellten Sprache des Benutzers ausgegeben. Diese Sprachvariable muss vorher aber erst im ACP angelegt werden. Finde ich persönlich sehr elegent gelöst. Wer keine Mehrsprachigkeit benötigt kann einfach den Text eingeben. Wer Mehrsprachigkeit benötigt, kann das zentral über die Sprachvariablen regeln und muss dann nicht an verschiedenen Stellen die verschiedenen Übersetzungen eintragen.

    Alexander: Hab ich wohl einfach nicht drauf geachtet. Nur das mysql_real_escape_string() gesehen und direkt daran hängen geblieben.

Jetzt mitmachen!

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