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


          • #6
            Ich würde mich hier mal einklinken.
            Zunächst eine Frage an Burkhard Hast du die Mitgliedertabelle mit CC erweitert und die Geodatenfelder über CC anlegen lassen oder direkt über dca?

            Wir haben hier die Herausforderung, dass wir CC nutzen, um Listen/Filter für die tl_member zu erstellen. Die Felder werden aber allesamt direkt oder über andere Erweiterungen angelegt (also nicht über Tabelle erweitern).

            ​​​​​​​Unter anderem nutzen wir con4gis für die Kartendarstellung. Hier werden zwei Koordinatenfelder in tl_member (c4g_loc_geoy und c4g_loc_geox) angelegt. Ist es möglich, diese ebenfalls über den CC geocoder befüllen zu lassen. Sowohl beim Speichern im Backend als auch beim Speichern über das Personendaten Modul im Frontend?

            Ziel ist es, eine Umkreissuche mit CC zu ermöglichen und dafür sind ja Geo Koordinaten zwingend erforderlich.

            Kommentar


            • #7
              Möglich ist alles und steht soweit alles oben. In einem submit_callback die Fremdfelder befüllen
              http://www.premium-contao-themes.com

              Kommentar


              • #8
                // Geo attribute $objGeolocationAttributes = new \PCT\CustomElements\Attributes\Geolocation(); // Koordinaten ermitteln aus Adressdaten $arrCoords = $objGeolocationAttributes->findCoordinates( implode(',', \array_filter($arrAddress) ));
                D.h., dass auf diesen Teil des PCT Geolocators überall zurückgegriffen werden kann?

                Kommentar


                • #9
                  Zitat von eblick Beitrag anzeigen

                  D.h., dass auf diesen Teil des PCT Geolocators überall zurückgegriffen werden kann?
                  Natürlich. Die Funktionen kann man sich zu Nutze machen.
                  Wenn das Attribut im Datensatz die Koordinaten bereits ermittelt hat, kann man die auch direkt in die Fremdfelder kopieren.
                  http://www.premium-contao-themes.com

                  Kommentar

                  Lädt...
                  X