Ergebnis 1 bis 17 von 17

Thema: processFormData bei der Kontoverwaltung

  1. #1
    Contao-Nutzer
    Registriert seit
    06.08.2010.
    Beiträge
    72

    Standard processFormData bei der Kontoverwaltung

    Hallo,

    ich trage per Hook Neuanmeldungen im System noch in einer zweiten Tabelle ein, das läuft auch.

    Um die Daten aktuell zu halten muss nun beim Ändern der Benutzerdaten über das Frontend auch hier ein update gemacht werden. Ich habe versucht, das über den Hook processFormData zu erledigen. Der Hook wird beim Senden aber nicht ausgeführt. Bei einem anderen Formular(z.B. Kontakt) greift der Hook. Ich hab auch schon validateFormField probiert, aber auch der wird nicht eingebunden. Gibt es noch eine andere möglichkeit, an dieser Stelle die Daten abzufangen?

    Ich arbeite hier mit contao 3.1.0

    Danke für die Hilfe!

    benfolds

  2. #2
    Contao-Urgestein Avatar von cliffparnitzky
    Registriert seit
    08.10.2010.
    Ort
    Lüneburg
    Beiträge
    2.452
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Moin,

    also die beiden HOOKs greifen nur bei Formularen die auch mit dem Formulargenerator erstellt wurden.

    Ich gehe aber mal davon aus, dass du die Aktualisierung der Daten mittels Modul "Perönliche Daten" durchführen lässt.

    Das ist dann ein eigenständiges Formular mit eigener Logik.

    Seit Contao 2.10 gibt es da aber einen HOOK "updatePersonalData" ... probier es damit mal.

    Gruß, cliff

  3. #3
    Contao-Nutzer
    Registriert seit
    06.08.2010.
    Beiträge
    72

    Standard

    das ist super!! Der Hook geht Vielen Dank!

    Woher weißt du das? Gibt's denn noch eine andere Innenquelle anstelle der normalen Doku? Da steht der Hook leider nicht drin...

  4. #4
    Contao-Urgestein Avatar von cliffparnitzky
    Registriert seit
    08.10.2010.
    Ort
    Lüneburg
    Beiträge
    2.452
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Ich habe im Code nachgeschaut, dokumentiert ist das nicht.

    Kenn die Stelle weil ich unter Contao 2.9.x da mal verzweifelt ran wollte.

    Und hatte dann gelesen, dass es ab 2.10 geht.

    Also "Druiden-Wissen" !!!

    Gruß, Cliff

  5. #5
    Contao-Fan Avatar von marcos
    Registriert seit
    09.02.2011.
    Ort
    Schweiz
    Beiträge
    575
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von benfolds Beitrag anzeigen
    das ist super!! Der Hook geht Vielen Dank!

    Woher weißt du das? Gibt's denn noch eine andere Innenquelle anstelle der normalen Doku? Da steht der Hook leider nicht drin...
    Hallo benfolds

    Wie hast du das gemacht bzw. wie sieht dein HOOK aus? Ich habe nähmlich einen ähnlichen Fall. Ich muss beim Ändern des Felds "Website" eine Überprüfung durchführen. Im BE funktioniert die Überprüfung mit save_callback aber im FE beim Modul "Persönliche Daten" funktioniert mein HOOK mit updatePersonalData nicht. Bei meinen Recherchen habe ich zudem einen Beitrag gefunden, bei dem es hies, dass updatePersonalData erst nach dem Speichern der Daten durchgeführt wird; sprich ich kann im Vorhinein keine Überprüfung durchführen. Darum meine Frage: wie hast du das gelöst?

    Vielen Dank im Voraus.

    Gruss
    Marco

  6. #6
    Contao-Urgestein Avatar von cliffparnitzky
    Registriert seit
    08.10.2010.
    Ort
    Lüneburg
    Beiträge
    2.452
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Moin,

    ja, offensichtlich ist das wirklich so. Der HOOK wird erst nach dem Speichern (also wenn alles als korrekt validiert wurde) ausgeführt. Dient wohl eher der Nachbearbeitung.

    Dann müsstest du immer noch einen save_callback für jedes Feld implementieren.

    Gemacht habe ich das zum Beispiel hier.
    Die Implementierung ist dann das.

    Hoffe das hilft.

    Grüße, Cliff

  7. #7
    Contao-Fan Avatar von marcos
    Registriert seit
    09.02.2011.
    Ort
    Schweiz
    Beiträge
    575
    User beschenken
    Wunschliste

    Standard

    Hallo Cliff

    Vielen Dank für deine Antwort.

    Ich habe schon einen save_callback für das Feld "Website". Dieser greift aber nur, wenn ich im Backend bei "Mitglieder" auf "Speichern" klicke. Wenn ich aber im Frontend beim Formular "Persönliche Daten" auf "Speichern" klicke, wird dieser nicht ausgeführt...

    Gruss
    Marco

  8. #8
    Contao-Urgestein Avatar von cliffparnitzky
    Registriert seit
    08.10.2010.
    Ort
    Lüneburg
    Beiträge
    2.452
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Hmm, ja schwer zu sagen was da nicht passt.

    Bei meiner Extension (siehe Code oben) geht es wunderbar.

    Gruß, Cliff

  9. #9
    Contao-Fan Avatar von marcos
    Registriert seit
    09.02.2011.
    Ort
    Schweiz
    Beiträge
    575
    User beschenken
    Wunschliste

    Standard

    Hallo Cliff

    Komisch. Wird denn save_callback auch beim Speichen im FE ausgeführt?

    Bei mir sieht es eigentlich ähnlich aus:

    tl_member.php
    PHP-Code:
    $GLOBALS['TL_DCA']['tl_member']['fields']['website']['save_callback'][] = array('CheckHttp''check'); 
    CheckHttp.php
    PHP-Code:
    //save_callback (Backend)
    public function check($strValue$dc)
    {            
        
    $newWebsite=$this->checkURL($this->Input->post('website'));
        
    $this->Database->prepare("UPDATE tl_member SET website=? WHERE id=?")->execute($newWebsite$dc->id);        
        return 
    $strValue;


    Wie gesagt, im BE funktionierts, im FE nicht. Oder muss ich die Zeile bei config.php entfernen?

    config.php (das wäre eben der HOOK mit updatePersonalData)
    PHP-Code:
    $GLOBALS['TL_HOOKS']['updatePersonalData'][] = array('CheckHttp''checkFEPersonalData'); 

    Gruss
    Marco

  10. #10
    Contao-Urgestein Avatar von cliffparnitzky
    Registriert seit
    08.10.2010.
    Ort
    Lüneburg
    Beiträge
    2.452
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Bist du dir sicher, dass du nicht in der Methode ankommst.

    Würde mal vermuten, dass der neuen Website String nicht in die DB gepustet werden musst. Einfach bearbeiten und dann statt $strValue zurück geben.
    In $strValue sollte auch der übertragene Wert drin stehen (musst also nicht mittels Input holen)

    Gruß, Cliff

  11. #11
    Contao-Fan Avatar von marcos
    Registriert seit
    09.02.2011.
    Ort
    Schweiz
    Beiträge
    575
    User beschenken
    Wunschliste

    Standard

    Hallo Cliff

    Danke für deinen Tipp! Die save_callback Funktion wird wirklich auch via FE aufgerufen.

    Ich habe aber zwei merkwürdige Phänomene:
    1. im BE wird mir die URL erst beim zweitenmal speichern korrigiert. Beim ersten mal speichen (nach dem Eintragen der URL) bleibt das http://, erst beim erneuten Klicken auf "Speichern", wird die URL angepasst.
    2. im FE geschieht nichts. Via Log sehe ich, dass die function check aufgerufen wird aber angepasst in der DB wird nichts. Irgendwie komisch, nicht? Findet er via FE die ID $dc->id nicht?

    Meine Klasse sieht jetzt so aus:

    PHP-Code:
    class CheckHttp extends Controller
    {    
        public function 
    __construct()
        {
            
    parent::__construct();
            
            
    $this->import('Database');
        }

        public function 
    checkURL($url)
        {
            
    //HTTP entfernen
            
    $http = array("http://""http");
            
    $newURL str_replace($http""$url);

            
    //Slash am Ende entfernen
            
    if((substr($newURL, -11))=="/")
                
    $newURL=substr($newURL0, -1);

            return 
    $newURL;
        }

        
    //save_callback (Backend)
        
    public function check($strValue$dc)
        {            
            
    $newWebsite=$this->checkURL($strValue);
            
    $this->Database->prepare("UPDATE tl_member SET website=? WHERE id=?")->execute($newWebsite$dc->id);
            
    $this->log("Function check ".$strValue__CLASS__.'::'.__FUNCTION__TL_GENERAL);        
            return 
    $strValue;
        }



    Danke und Gruss
    Marco

  12. #12
    Contao-Urgestein Avatar von cliffparnitzky
    Registriert seit
    08.10.2010.
    Ort
    Lüneburg
    Beiträge
    2.452
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Moin Marco,

    ja in meinem Code hatte ich sowohl eine Unterscheidung für FE und BE als auch Abfragen, ob $dc gefüllt ist.

    Weiß es nicht mehr genau, mutmaße aber, dass es Gründe hatte

    Insofern guck da vlt. noch mal ab.

    Grüße, Cliff

  13. #13
    Contao-Fan Avatar von marcos
    Registriert seit
    09.02.2011.
    Ort
    Schweiz
    Beiträge
    575
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von cliffen Beitrag anzeigen
    Gemacht habe ich das zum Beispiel hier.
    Die Implementierung ist dann das.
    Hallo Cliff

    Danke für deine Antwort. Ich finde aber keine Abfragen bzgl. $dc. Du verwendest diese Variable in ein paar Funktionen aber sonst habe ich nichts gefunden... suche ich am falschen Ort?

    Danke und Gruss
    Marco

  14. #14
    Contao-Urgestein Avatar von cliffparnitzky
    Registriert seit
    08.10.2010.
    Ort
    Lüneburg
    Beiträge
    2.452
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Nee, sorry, $member hab ich es direkt genannt.

    Es ist wohl so, dass du vom BE einen DataContainer bekommst ... hier holst du member mittels $dc->activeRecord raus.

    Im FE hingegen ist das übergebene Objekt gleich ein member.

    Für die Bearbeitung aus dem FE nutze ich die save_callbacks mit der Methode: saveMemberFromFronted (.....
    Für das Backend kommt dann der onsubmit_callback zum Einsatz, der die Funktion saveMemberFromBackend (... aufruft

    Durch die Prüfung, ob der Übergabewert in saveMemberFromFronted (... nicht vom Typ DataContainer ist, wird die Verarbeitung aus den BE vermieden.
    Das kannst natürlich auch nutzen um den Member zu bestimmen.

    Grüße, Cliff

  15. #15
    Contao-Fan Avatar von marcos
    Registriert seit
    09.02.2011.
    Ort
    Schweiz
    Beiträge
    575
    User beschenken
    Wunschliste

    Standard

    Hallo Cliff

    Ach so, mit save_callback und onsubmit_callback! Colle Idee! So funktioniert's!

    Ich hatte beim BE aber noch ein Problem.

    Ich hatte es zuerst so, wie in deinem Beispiel. $member->id gab die ID aus aber $member->website war immer leer.
    PHP-Code:
    public function checkBE(DataContainer $dc)
    {    
        
    $member $dc->activeRecord;    
        
    $newWebsite=$this->checkURL($member->website);
        
    $this->Database->prepare("UPDATE tl_member SET website=? WHERE id=?")->execute($newWebsite$member->id);


    Ich habe dann diesen Eintrag von Andreas Schempp gefunden: Daten ändern in der onsubmit_callback Funktion.
    Er schreibt hier, dass die Daten mit $dc vor dem Speichern geholt werden. Ich habe es dann, wie von ihm empfohlen, mit $this->Input->post() gelöst.
    Ist das programmier-technisch auch korrekt? (sorry, bin in der ganze OOP-Geschichte noch nicht so fit.. )


    PHP-Code:
    public function checkBE(DataContainer $dc)
    {    
        
    $member $dc->activeRecord;    
        
    $newWebsite=$this->checkURL($this->Input->post("website"));
        
    $this->Database->prepare("UPDATE tl_member SET website=? WHERE id=?")->execute($newWebsite$member->id);    


    Danke und Gruss
    Marco

  16. #16
    Contao-Nutzer
    Registriert seit
    06.08.2010.
    Beiträge
    72

    Standard

    Hallo marcos,

    ich hab ein anderes Problem gehabt. Wir speichern die Userdaten auch noch an einer anderen stellen, das wird dann bei uns per API übergeben. Der einzige Punkt an dem ich noch eingreifen musste war, wenn die email-adresse geändert wurde weil ich manuell den username mit der email gleichsetze. Das hab ich dann ganz ungalant direkt in die DB eingetragen:

    PHP-Code:
    $objWidget->username $objWidget->email;

      
    Database::getInstance()
        ->
    query("UPDATE tl_member SET username = '".$objWidget->email."' WHERE id=".$objWidget->id);

    return 
    $objWidget
    das war's auch schon Aber vermutlich geht bei dir schon alles, oder?

  17. #17
    Contao-Fan Avatar von marcos
    Registriert seit
    09.02.2011.
    Ort
    Schweiz
    Beiträge
    575
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von benfolds Beitrag anzeigen
    das war's auch schon Aber vermutlich geht bei dir schon alles, oder?
    Hallo benfolds

    Danke für die Info. Ja, mit meinem oben geposteten Beispiel funktioniert es

    LG
    Marco

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •