Ankündigung

Einklappen
Keine Ankündigung bisher.

Geographische Daten in tl_member bei der registrierung erzeugen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Geographische Daten in tl_member bei der registrierung erzeugen

    Hallo,

    ich meine tl_member mit einem Feld vom Attributtyp "Geographische Daten" erweitert.

    Wenn ich nun neue Mitglieder im Backend anlege und Straße, ZIP und City eingebe, werden die Geo-Koordinaten beim Mitglied im neu angelegten Feld beim Speichern erzeugt. So weit läuft alles perfekt.

    Anders ist es, wenn das neue Mitglied nicht im Backend angelegt wird, sondern über das Registrieren Modul im Frontend der Website. Hier werden alle Daten sauber erfasst, jedoch werden die Geo-Koordinaten nicht erzeugt (erst dann, wenn das Mitglied einmal im Backend geöffnet und gespeichert wird).

    Frage:
    kann man die Erzeugung der Geo-Koordinaten auch mit dem Absenden des Registrierungsformulars "anstoßen"?
    Wenn ja, wie geht das?

    Falls jemand einen Hinweis hat ...

  • #2
    Zitat von Burkhard Beitrag anzeigen
    Hallo,

    ich meine tl_member mit einem Feld vom Attributtyp "Geographische Daten" erweitert.

    Wenn ich nun neue Mitglieder im Backend anlege und Straße, ZIP und City eingebe, werden die Geo-Koordinaten beim Mitglied im neu angelegten Feld beim Speichern erzeugt. So weit läuft alles perfekt.

    Anders ist es, wenn das neue Mitglied nicht im Backend angelegt wird, sondern über das Registrieren Modul im Frontend der Website. Hier werden alle Daten sauber erfasst, jedoch werden die Geo-Koordinaten nicht erzeugt (erst dann, wenn das Mitglied einmal im Backend geöffnet und gespeichert wird).

    Frage:
    kann man die Erzeugung der Geo-Koordinaten auch mit dem Absenden des Registrierungsformulars "anstoßen"?
    Wenn ja, wie geht das?

    Falls jemand einen Hinweis hat ...
    Korrekt. Im Reg-Modul klappt das nicht, weil Contao dort kein DataContainer Objekt übergebt mit den Datensatz-Informationen. https://github.com/contao/core-bundl...ation.php#L267 > 2. parameter ist null. Im Backend kommt das DataContainer object rein

    Du kannst den createNewUser Hook nutzen. Der übergibt alle übermittelten Informationen und den Datensatz des frischen Mitglieds. Die Koordinaten-Ermittlung kannst du direkt aus dem save_callbacks im Geolocation Attribut nutzen bzw. die öffentliche Methode findCoordinates des Geolocation Attributs.
    Nach der Ermittlung das Feld für den jeweiligen Mitglieder-Datensatz speichern.

    Ich kann da morgen was basteln. Heute schaffe ich es nicht mehr.
    Zuletzt geändert von Tim; 23.05.2023, 15:39.
    http://www.premium-contao-themes.com

    Kommentar


    • #3
      Moin Tim,

      wenn du dafür Zeit hättest wäre ich dir sehr dankbar. Ich versuche das dann einmal nachzuvollziehen. Könnte mir vorstellen das sich der ein oder andere Nutzer dieser Forums auch darüber freuen würde und das nicht nur für mich eingesetzt würde. Danke!

      Gruß Burkhard

      Kommentar


      • #4
        Mein Feld heisst "geolocation"

        dcaconfig.php: Die optionalen Felder für das Reg.Modul freischalten und den normalen save_callback des Feldes im Frontend unterbinden. -> würde nur Fehler produzieren, weil das Reg. Modul nicht ausreichend Daten übergibt an den Hook.

        Code:
        $strField = 'geolocation';
        foreach(array('city','street','country','zipcode') as $k)
        {
        $GLOBALS['TL_DCA']['tl_member']['fields'][$strField.'_'.$k]['eval']['feEditable'] = true;
        $GLOBALS['TL_DCA']['tl_member']['fields'][$strField.'_'.$k]['eval']['feViewable'] = true;
        $GLOBALS['TL_DCA']['tl_member']['fields'][$strField.'_'.$k]['eval']['feGroup'] = 'personal';
        }
        if (\TL_MODE == 'FE')
        {
        unset($GLOBALS['TL_DCA']['tl_member']['fields'][$strField]['save_callback']);
        }
        initconfig.php (oder besser: ein eigenes kleines Modul anlegen)

        Code:
        // createNewUser Hook
        $GLOBALS['TL_HOOKS']['createNewUser'][] = array('myClass','createNewUserCallback');
        
        if( !class_exists('myClass') )
        {
            class myClass
            {
                public function createNewUserCallback($intUser, $arrData)
                {
                    $strField = 'geolocation';
        
                    // Adressdaten aus Reg.Formular
                    $arrAddress = array();
                    $arrAddress[] = $arrData[$strField.'_street'] ?? '';
                    $arrAddress[] = $arrData[$strField.'_zipcode'] ?? '';
                    $arrAddress[] = $arrData[$strField.'_city'] ?? '';
                    $arrAddress[] = $arrData[$strField.'_country'] ?? '';
        
                    // Geo attribute
                    $objGeolocationAttributes = new \PCT\CustomElements\Attributes\Geolocation();
        
                    // Koordinaten ermitteln aus Adressdaten
                    $arrCoords = $objGeolocationAttributes->findCoordinates( implode(',', \array_filter($arrAddress) ));
        
                    if( !empty($arrCoords) )
                    {
                        \Contao\Database::getInstance()->prepare("UPDATE tl_member %s WHERE id=?")->set( array($strField=> implode(',',$arrCoords) ) )->execute($intUser);
                    }
                }
            }
        }
        http://www.premium-contao-themes.com

        Kommentar


        • #5
          Danke ich werde das einmal so testen ...

          YES! Das funktioniert perfekt so. Jetzt ist es eine runde Sache.

          Vielen Dank für den Code, Tim
          Zuletzt geändert von Burkhard; 24.05.2023, 12:50.

          Kommentar

          Lädt...
          X