delahaye / dlh_geocode

2 stars 10 forks source link

Vrohandenen Geocode bei leere Adressangabe zurückgeben #3

Closed reneaye closed 10 years ago

reneaye commented 10 years ago

Hallo Christian,

erstmal vielen Dank für die beiden gut gelungenen Module. Ich habe einen Vorschlag zum dlh_geocode Modul. Hier mein Thread dazu im Forum: https://community.contao.org/de/showthread.php?50188-MetaModels-dlh_googlemaps-Integration-wie-l%F6sen&p=324968#post324968

Es geht darum einen vorhandenen Geocode nicht zu überschreiben, wenn ein leerer Adressstring an die Callback-Funktion geschickt wird.

Ich habe auch eine funktionierende Lösung dazu entwickelt, kann aber nicht sagen, ob die so wirklich "rocksolid" ist, da ich nicht 100% verstehe, was in deiner Callback Funktion passiert.

Folgender Ansatz: ich habe im dcaconfig die Einstellungen so geändert, dass das Feld mit den Geokoordinaten auch an die Callback-Funktion übermittelt wird. Die Callback-Funktion habe ich dann so geändert, dass bei einem leeren Adress-String der Wert aus dem Feld der Geokoordinate per return zurückgeschickt wird.

Ich bin mit GitHub leider noch nicht ganz vertraut, am einfachsten wäre es wohl einen Pull-Request zu schicken, oder?

Danke René

delahaye commented 10 years ago

Ich kann Dir leider nicht sagen, ob das funktioniert, da sich die Methode das "zu einer Adresse zusammenzubastelnde" ja aus Post-Variablen zusammenholt. Im Zweifel kommt ein leerer String zurück. Und die Methode kennt den bisherigen Wert des Zielfeldes nicht. Ggf. schreibst Du Dir da besser eine eigene Callbackfunktion und zapfst nur die Koordinatenabfrage an. Du kannst es aber ja mal posten, ich guck es mir an.

reneaye commented 10 years ago

Ok, supernett von Dir! Hier mal der dcaconfig-Eintrag:

$GLOBALS['dlh_geocode']['address'] = array(
    'format'            => '%s',
    'fieldformat'       => array(
        'action' => 'get',
        'name'   => 'id'
        ),
    'fields_address'    => array('adress_%s'),
    'field_country'     => '',
    'field_language'    => '',
    'field_geocode'     => 'geolocation_%s'
    );

$GLOBALS['TL_DCA']['mm_saf_assets']['fields']['geolocation']['save_callback'][] = array('delahaye\GeoCode','callbackCoordinates');

Hier ist das Wichtige die neue Zeile

'field_geocode'     => 'geolocation_%s'

Damit wird der bereits vorhandene Geocode zur CallBack-Funktion geschickt. (bei mir heisst das Attribut-Feld im MM 'gelocation')

Und hier deine modifizierte Callback-Funktion:

    public function callbackCoordinates()
    {
        $strAction = $GLOBALS['dlh_geocode']['address']['fieldformat']['action'];
        $strIdParam = $GLOBALS['dlh_geocode']['address']['fieldformat']['name'];

        $arrAddress = array();

        foreach($GLOBALS['dlh_geocode']['address']['fields_address'] as $strField)
        {
            if($strIdParam)
            {
                if(!\Input::$strAction($strIdParam))
                {
                    // how Metamodels do it on creation, otherwise save twice to get coords
                    $arrAddress[] = \Input::get('act')=='create' ? \Input::post(sprintf($strField, 'b')) : '';
                }
                else
                {
                    $arrAddress[] = \Input::post(sprintf($strField, \Input::$strAction($strIdParam)));
                }
            }
            else
            {
                $arrAddress[] = \Input::post($strField);
            }
        }

        if(!trim(implode('', $arrAddress)))
        {
            $geocode = \Input::post(sprintf($GLOBALS['dlh_geocode']['address']['field_geocode'], \Input::$strAction($strIdParam)));
            return $geocode;
        }

        $strAddress = vsprintf($GLOBALS['dlh_geocode']['address']['format'], $arrAddress);
        $strCountry = $GLOBALS['dlh_geocode']['address']['field_country'];
        $strLang    = $GLOBALS['dlh_geocode']['address']['field_language'];

        // convert any linebreak to a comma
        $strAddress = preg_replace( "/\r|\n/", ", ", $strAddress );

        return self::getCoordinates($strAddress, $strCountry, $strLang);
    }

Hier ist die entscheidende Änderung in der letzten if-Anweisung (die, mit dem trim-Befehl). Diese if-Anweisung wird bei nur ausgeführt, wenn die Adresse leer ist. Also hole ich mir da die bereits vorhandene Geokoordinate und gebe sie per return als Ergebnis der Funktion wieder zurück.

delahaye commented 10 years ago

Du hast absolut recht, das fluppt. Ich baue es in die nächste Version ein, merci!