[Woltlab Community Framework] Profilfeld schreiben

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • [Woltlab Community Framework] Profilfeld schreiben

    Ich bin zwar recht neu hier, würde mich aber trotzdem über Hilfe freuen:
    Ich würde gerne ein Plugin fertigstellen, das ein unsichtbares Userfeld während des Anmeldungsprozesses anhand einer bestehenden gefüllten Variable füllt. Ich habe mir das Userfeld überlegt da es eine userspezifische Angabe ist, die man hoffentlich auch überall unsichtbar machen kann.
    Nur wie füllt man dieses Feld automatisch im Eventcode? Wieso finde ich den Befehl nicht inder WCF-Doku? :/
  • Vielen lieben Dank schonmal. :)
    Leider weiß ich immer noch nicht des Rätsels Lösung, drum lud ich mir viele Plugins runter und suchte in allen Eventlistenern nach additionalFields (nachdem ich es selbst mit WCF::getUser()->additionalFields[] u.ä. versucht habe), was mir aber auch nur Ergebnisse brachte die ich nicht verstand ($eventObj->additionalFields[], WCF::getTPL()->append() usw.).
    Hast du vielleicht eine einfache Codezeile zur Zuweisung und Abfrage der Benutzerprofilfelder?
    In der Doku sah ich bei der PIP die Gestaltungsoption <hidden>1</hidden>, bringt den Vorteil dass die User das Feld dann nicht mehr ändern können - die Administratoren dann leider auch nicht, oder? Mein Ziel ist ein Feld das von einem Event beschrieben wird und von den Administratoren geändert wird.
  • Jipii schrieb:

    Mein Ziel ist ein Feld das von einem Event beschrieben wird und von den Administratoren geändert wird.

    Aber was hat das ganze mit dem Login ("unsichtbares Userfeld während des Anmeldungsprozesses") zu tun?

    Du suchst jedenfalls ein Benutzerfeld (useroptions), dass nur für bestimmte Benutzergruppen (admins, mods) sichtbar ist.
    Dann orientier dich mal an adminComment. Das ist editable=3 und visible=3.
    hidden wird für allgemeine wcf-options verwendet - Nicht für useroptions.
  • Danke wieder für deine schnelle Antwort. :)

    d0nut schrieb:

    Aber was hat das ganze mit dem Login ("unsichtbares Userfeld während des Anmeldungsprozesses") zu tun?
    Ich wollte das Userfeld während der Anmeldung befüllen. ^^
    Die (mir noch unbekannte) Funktion Profilfelder zu beschreiben ist eh überall gleich, oder?

    d0nut schrieb:

    Das ist editable=3 und visible=3.
    hidden wird für allgemeine wcf-options verwendet - Nicht für useroptions.
    Ah danke, genau, das ist das was ich suchte.
  • Jipii schrieb:

    Die (mir noch unbekannte) Funktion Profilfelder zu beschreiben ist eh überall gleich, oder?

    Nennen wir es mal die Funktion zusätzliche Spalten in einem Datensatz zu beschreiben, der einen Eintrag in einer Tabelle repräsentiert...
    Die Benennung ist eben additinalFields wird sowas wie "Best Practise" sein. In der Doku findest du das assoziative Array nicht. Also kannst du dich nicht darauf verlassen, dass es überall so heißt.
    Aber mit var_dump($eventObj) findest du ja ganz leicht heraus, was dir zur Verfügung steht.
  • Verstehe.

    Zur Info:
    Durch var_dump() fand ich heraus das mir keine derartige Variable zur Verfügung steht.
    Das Aktualisieren des Profilfeldes ist nun aufwändiger als ich dachte:

    Quellcode

    1. // ID des Profilfeldes 'freund' entnehmen
    2. $rowSend = WBBCore::getDB()->sendQuery("SELECT optionID FROM wcf".WCF_N."_user_option WHERE optionName='freund'");
    3. $row = WBBCore::getDB()->fetchArray($rowSend);
    4. // Update auf das Feld 'freund' vornehmen
    5. $result = WCF::getDB()->registerShutdownUpdate("UPDATE wcf".WCF_N."_user_option_value SET userOption".$row['optionID']."='1' WHERE userID='".WCF::getUser()->userID."'");

    Aber es funktioniert. :)
  • Oh ja, getUserOptionID ist wesentlich einfacher. :)

    Zu Testzwecken hatte ich den Eventaufruf wenn ich das Anmeldungsformular auch nur aufrief:

    Quellcode

    1. <eventlistener>
    2. <eventclassname>RegisterPage</eventclassname>
    3. <eventname>assignVariables</eventname>
    4. <listenerclassfile>lib/system/event/listener/RegisterPageKontoListener.class.php</listenerclassfile>
    5. </eventlistener>


    Jetzt möchte ich den Aufruf aber sobald sich ein User erfolgreich registriert hat und seine ID feststeht. Gesucht habe ich unter anderem auf Seite 98 der technischen Dokumentation des WCFs, da stehen aber nur events wie save. Was genau soll ich dem Eventlistener zuweisen damit er das erst nach der Registrierung aufruft?
  • Quellcode

    1. <eventlistener>
    2. <eventclassname>RegisterPage</eventclassname>
    3. <eventname>saved</eventname>
    4. <listenerclassfile>lib/system/event/listener/RegisterPageKontoListener.class.php</listenerclassfile>
    5. </eventlistener>

    Danke :)

    Leider führt er meinen Code nicht aus. Auch die Variablenzuweisung funktioniert nicht. Es hat erstmal etwas gedauert bis ich herausfand dass das Template mit der erfolgreichen Bestätigung im grünen Balken 'redirect' heißt. Es reagiert aber nicht auf die zugewiesenen Variablen die ich in das Template packte.
    Daher meine Fragen:
    • Verfallen vielleicht die Cookies nachdem sich ein User angemeldet hat?
    • Werden Templatevariablenzuweisungen vom genannten Event tatsächlich im Template 'redirect' wiedergegeben (sofern korrekte Zuweisung im Event erfolgt ist)?
  • Oki thx, so hatte ich es auch zwar gemacht, ging aber trotzdem nicht.

    Für alle Googler und Interessierten meine Lösung:
    Denn unerwarteterweise gibt das wcf im Zeitpunkt der Ausführung von register saved keine Userdaten her. Also kann ich keinen Weber in Anmeldungsprozess speichern, da ich die ID des Users für das Profilfeld-Query brauche (WCF::getUser()->userID).

    Jipii schrieb:

    Verfallen vielleicht die Cookies nachdem sich ein User angemeldet hat?
    Getestet - Antwort: Nein! Zum Glück nicht, sodass ich dann den Werber einfach später gespeichert habe, als der User dann 'richtiger' eingeloggt ist (normalerweise beim nächsten Seitenaufruf).

    Schade nur dass auch das nicht in der WCF-Doku steht. :huh: