Neues Modul "Google Maps"

Qli
Beiträge: 31
Registriert: Mi 3. Dez 2003, 22:17
Kontaktdaten:

Beitrag von Qli » Mo 9. Jul 2007, 16:43

Was mir da spontan einfällt:

Die Felder "Strasse", "Hausnummer", "Postleitzahl", "Ort" und "Land" müssen ausgefüllt sein und dürfen AFAIK keine Leerzeichen enthalten.

Die Strasse "Bei der Lohmühle" hab ich z.B. als "Bei_der_Lohmühle" eingetragen.

Ob "Breite der Karte" bzw. "Höhe der Karte" ausgefüllt sein muss bin ich im Moment überfragt. "Text im Infofenster" kann auf jedem Fall leer bleiben.

rene04
Beiträge: 600
Registriert: Mo 10. Okt 2005, 12:28
Wohnort: Kaiserslautern
Kontaktdaten:

Beitrag von rene04 » Mo 9. Jul 2007, 17:23

keine leerzeichen is aber unschön. wie kommt es dazu?

apropos: alle felder sind ausgefüllt, ohne leerzeichen! selber fehler! vielleicht was falsches (code) gepostet?

gruesse

Qli
Beiträge: 31
Registriert: Mi 3. Dez 2003, 22:17
Kontaktdaten:

Beitrag von Qli » Mo 9. Jul 2007, 17:27

Frag Tommo ;-)

Da Modul ist nicht von mir. Hab es nur auf die neue (?) Google API angepasst.
Wollte es mir immer schon mal ansehen, bin aber ehrlich gesagt noch nicht dazu gekommen. Leerzeichen durch Unterstriche ersetzen hat bislang bei mir immer geklappt.
Ich schick dir dem Code aber noch mal als XML Export, wenn du mir deine Mailadresse per PM schickst.

rethus
Beiträge: 1851
Registriert: Di 28. Mär 2006, 11:55
Wohnort: Mönchengladbach
Kontaktdaten:

Beitrag von rethus » Mo 9. Jul 2007, 19:00

Ich habe das Modul jetzt so angepasst, das es mit allow_url_follow = off funktioniert.

Dafür habe ich eine extra Parser-Klasse geschrieben, die über fsocketopen() die Daten bezieht, diese aber so umbastelt, als seien die Daten von fopen() gekommen.

Die nachfolgende Klasse (class.rssCleaner.php) in das Verzeichnis /contenido/classes kopieren/erstellen:

Code: Alles auswählen

<?php

/* class.rssCleaner.php
 *
 * Copyright (c) 2006 Suther Kommunikationsdesign  All rights reserved.
 * Redistribution of source must retain this copyright notice.
 *
 * Suther Kommunikationsdesign (http://www.suther.de) specializes in
 * website design and software consulting.
 *
 * Version		: 0.0.1
 * Created		: 26.06.2006
 * LastChange by	: Samuel Suther
 * Changes		:
 */

/**
 * Class RssCleaner
 * Use this class to clean RSS-Feed-Data 
 * you've get by fsocketopen()-Methode
 */
class RssCleaner {

var $header;
var $content;

	function cleanRssData_fsocketopen($rssData, $charset="iso8859-1")
	{
		// split Header and Content
		list($strHeader, $strContent) = explode("\r\n\r\n", $rssData, 2);
		$strHeader = explode("\r\n", $strHeader);
		$this->setHeader($strHeader);

		// del first row with stange chars
		list($strAbfall, $strContent) = split("[\r\n]", $strContent, 2);
		// del last row
		$arr 		= split("[\r\n]", trim($strContent));
		array_pop($arr);
		$strContent 	= implode("\r\n",$arr);
		$rssData 	= trim($strContent);
		unset($arr, $strAbfall, $res);
		$this->setContent($rssData);
		// Convert Charset to needs
		$this->convertCharset($charset);
	}

	function convertCharset($toCharset)
	{
		
		foreach($this->header as $row)
		{
			$i=0;
			$row=strtolower($row);
			//if charset != $toCharset convert it
			if(eregi("charset=",$row) && !eregi($toCharset,$row))
			{
				$i++;
				$tmpCharset 	= explode("charset=",$row);
				$charset	= $tmpCharset[1];

				switch($charset)
				{
				case "utf-8":
				$this->setContent(utf8_decode($this->getContent()));
				$this->header[$i] = eregi_replace($charset,$toCharset,$this->header[$i]);
				break;
				}
			}
		}
	}
	
	function getHeader()
	{
		return $this->header;
	}
	
	function setHeader($inHeader)
	{
		$this->header=$inHeader;
	}
	
	function getContent()
	{
		return $this->content;
	}
	
	function setContent($inContent)
	{
		$this->content=$inContent;
	}
}

?>
Im Modul sind auch noch ein paar Anpassungen nötig... zudem hab ich den Code etwas aufgeräumt

Hier der Modul-Code:
INPUT

Code: Alles auswählen

echo"
 <table cellspacing=\"0\" cellpadding=\"5\" border=\"0\">
 <tr valign=\"top\">
  <td width=\"302\" colspan=\"2\"><strong>Ziel</strong></td>
 </tr>
 <tr valign=\"top\">
  <td width=\"302\">Land</td>
  <td><INPUT TYPE=\"text\" NAME=\"CMS_VAR[1]\" VALUE=\"CMS_VALUE[1]\"></td>
 </tr>
<tr>
<td colspan=\"2\"><hr style=\"width: 100%;\"></td>
</tr>
<tr valign=\"top\">
  <td width=\"302\" colspan=\"2\"><strong>Konfiguration</strong></td>
 </tr>
 <tr valign=\"top\">
  <td width=\"302\">Breite der Karte*</td>
  <td><INPUT TYPE=\"text\" NAME=\"CMS_VAR[2]\" VALUE=\"CMS_VALUE[2]\">px</td>
 </tr>
 <tr valign=\"top\">
  <td width=\"302\">Höhe der Karte</td>
  <td><INPUT TYPE=\"text\" NAME=\"CMS_VAR[3]\" VALUE=\"CMS_VALUE[3]\">px</td>
 </tr>
 <tr valign=\"top\">
  <td width=\"302\">Kartenart*</td>
  <td>
<select name=\"CMS_VAR[8]\">
<option value=\"0\">Karte</option>";

    if (CMS_VALUE[8] == 1) {
        echo '<option value="1" selected="selected">Satellit</option>';
    } else {
        echo '<option value="1">Satellit</option>';
    }

    if (CMS_VALUE[8] == 2) {
        echo '<option value="2" selected="selected">Hybrid</option>';
    } else {
        echo '<option value="2">Hybrid</option>';
    }

echo "
</select>
</td>
 </tr>
<tr valign=\"top\">
  <td width=\"302\">Kartenauswahlfunktion anzeigen*</td>
  <td>
<select name=\"CMS_VAR[9]\">
";

    if (CMS_VALUE[9] == 1) {
        echo '<option value="1" selected="selected">Nein</option>';
    } else {
        echo '<option value="1">Nein</option>';
    }

    if (CMS_VALUE[9] == 2) {
        echo '<option value="2" selected="selected">Ja</option>';
    } else {
        echo '<option value="2">Ja</option>';
    }

echo "
</select>
</td>
 </tr>
<tr valign=\"top\">
  <td width=\"302\">Zoomfunktion anzeigen*</td>
  <td>
<select name=\"CMS_VAR[10]\">
";

    if (CMS_VALUE[10] == 1) {
        echo '<option value="1" selected="selected">Aus</option>';
    } else {
        echo '<option value="1">Aus</option>';
    }

    if (CMS_VALUE[10] == 2) {
        echo '<option value="2" selected="selected">Klein</option>';
    } else {
        echo '<option value="2">Klein</option>';
    }
    if (CMS_VALUE[10] == 3) {
        echo '<option value="3" selected="selected">Groß</option>';
    } else {
        echo '<option value="3">Groß</option>';
    }
echo "
</select></td></tr><tr><td colspan=2>
<small>*Wenn Breite < 150px werden automatisch alle Buttons ausgeblendet</small>
</td>
 </tr>";
 echo "</table>"; 
OUTPUT:

Code: Alles auswählen

<?php

cInclude("classes", "class.rssCleaner.php");
// Durch input type=hidden in Post umwandeln

if ( !is_object($db) ) {
        $db = new DB_Contenido;
} 
$sql =" SELECT *
   	FROM con1_branche
   	WHERE id = ".$_GET['id']." "; 

$db->query($sql);
if ($db->next_record()) 
{
	$str = $db->f('strasse');
	$hsn = $db->f('nr');
	$plz = $db->f('plz');
        $ort = $db->f('ort');
        $infotextfenster = $db->f('beschreibung');
}
	$land		= "CMS_VALUE[1]";
	if(empty($land))
		$land	= "Germany";
	$width		= CMS_VALUE[2];
	if(empty($width))
		$width 	= "200";
	$height		= CMS_VALUE[3];
	if(empty($height))
		$height = "200";
	$maptyp		= CMS_VALUE[8];
	$mapcontrol 	= CMS_VALUE[9];
	$zoomcontrol 	= CMS_VALUE[10];

if($width<201) $smallBtn = "true";


function get_lat_long($q) 
{
	global $lat,$lon;

	$cleanRss 	= new RssCleaner();
	$q    		= urlencode($q);
        $file 		= "maps.google.com/maps?q=" . str_replace('','+',$q) . "&output=js";
	$tmpPath      	= explode("/","$file",2);

	$fileName      	= explode("/","$file");
	$fileName      	= end($fileName);
	
	$cleanRss->cleanRssData_fsocketopen($fileName);
	$this->rssHeader= $cleanRss->getHeader();
	$rssData 	= $cleanRss->getContent();
	
	$tmp = sendPostRequest($tmpPath[0],"/".$tmpPath[1],"");
        
	#$gm = fopen('http://maps.google.com/maps?q=' . str_replace('','+',$q) . '&output=js','r');
	#$tmp = @fread($gm,30000);
        #fclose($gm);

	 

	$pos	= strpos($tmp,"center");
	$wert	= substr($tmp,$pos,70);
	$lat	= substr($wert,12,9);
	$lon	= substr($wert,35,8);
}

$q = $str.' '.$hsn.', '.$plz.' '.$ort.', '.$land;
$tmp = get_lat_long($q);


if ($maptyp==2){
	$anzeige = "G_HYBRID_MAP";
}elseif ($maptyp==1) {
	$anzeige = "G_SATELLITE_MAP";
}else{
	$anzeige = "G_NORMAL_MAP";
}

?>

<?php 
	echo $wert; 
	$infotext = ereg_replace("(\r\n|\n|\r)", "<br>", $infotextfenster);
?>


<div id="map" style="width: <?php echo $width;?>px; height: <?php echo $height;?>px;overflow:hidden;"></div>
  
<script type="text/javascript">
	//<![CDATA[ 
	function load() 
	{
	
		if (GBrowserIsCompatible()) 
		{
	
			function createMarker(point,html) 
		{
			var marker = new GMarker(point);
			GEvent.addListener(marker, "click", function() {
			marker.openInfoWindowHtml(html);
			});
			return marker;
		}
	
		//Map erstellen und zentrieren, Anzeige der Funktionen
		var map = new GMap2(document.getElementById("map"));
		map.setCenter(new GLatLng(<?php echo $lat;?>, <?php echo $lon;?>), 14, <?php echo $anzeige;?>);
		<?
			// Anzeige der Wechselbuttons für Karte, Hybrid und gemischt
			if ($mapcontrol == 2) {echo "map.addControl(new GMapTypeControl($smallBtn));";}
			if($width > 150)
			{
				if ($zoomcontrol == 2){echo "map.addControl(new GSmallMapControl($smallBtn));";}
				if ($zoomcontrol == 3){echo "map.addControl(new GLargeMapControl($smallBtn));";}
			}
		?>
	
	
		//marker bei klick
		function createMarker(point,html) 
		{
			var marker = new GMarker(point);
			GEvent.addListener(marker, "click", function() {
			marker.openInfoWindowHtml(html);
			});
			return marker;
		}
	
	
	
		var marker1 = createMarker(new GLatLng(<?php echo $lat;?>, <?php echo $lon;?>),"<? echo $infotext;?>");
		map.addOverlay(marker1);
		return true;
		}    
		else {
			alert("Sorry, the Google Maps API is not compatible with this browser");
		}
	}//endload
	//]]>
	
</script> 
Muss mal gesagt werden:
Hier im Forum wird ne Menge gutes Zeug programmiert, aber - nichts für ungut - die Übersichtlichkeit im Code ist bei einem Großteil der Codesniplets meist unter aller Sa... Sa... na Ihr wisst schon :lol:
Erleichtert uns und Euch die Arbeit und Programmiert übersichtlicher. Ihr werdet sehen, das spart euch selbst auch ne Menge Zeit, und bei Problemen wird euch direkt doppelt so gern und schnell geholfen!
Zuletzt geändert von rethus am Di 17. Jul 2007, 13:45, insgesamt 1-mal geändert.

rene04
Beiträge: 600
Registriert: Mo 10. Okt 2005, 12:28
Wohnort: Kaiserslautern
Kontaktdaten:

Beitrag von rene04 » Di 10. Jul 2007, 07:33

hmmm, auch mit diesem code bekomme ich den fehler:

Parse error: parse error, unexpected T_STRING in /var/www/web3/html/contenido/includes/include.con_editcontent.php(644) : eval()'d code on line 1158

was kann das sein? ich hab mal meine include.con_editcontent.php angeschaut, aber ie hat keine 1158 lines.

gruesse rene

rethus
Beiträge: 1851
Registriert: Di 28. Mär 2006, 11:55
Wohnort: Mönchengladbach
Kontaktdaten:

Beitrag von rethus » Di 10. Jul 2007, 09:34

@rene04:
Haste schon mal in Erwägung gezogen, das es auch an anderen Modulen liegen kann, die in dem gleichen Template eingebunden sind.

Hatte mal massive Problem bei nem anderen Modul, weil es sich mit der Benennung von ner Funktion eines anderen Moduls gehackt hat.

Schalte mal alle anderen Module im Template aus - lass nur Google-Maps drin und probier es. Wenns funktioniert fein, dann schaltest du alle Module wieder nach und nach zu und dann wirst du feststellen wo der Fehler liegt.

Übrigens: Wenn du einen Fehler hast, schalte den Debug-modus ein, und hackel den PHP-Code durch... das machen alle von uns :-) :wink:

TIPP: Fehlereingrenzung ist immer der erste Schritt zur Lösung

JochenK
Beiträge: 13
Registriert: Mi 28. Feb 2007, 18:09
Kontaktdaten:

map geht leider keine Sprechblase

Beitrag von JochenK » Mo 16. Jul 2007, 00:18

also mit der letzten anweisung funktioniert das Map modul soweit wie es soll. Bis auf die Tatsache dass der Beschreibungstext und der Marker nicht angezeigt werde.
Ich bekomme aber auch keine Fehler meldung oder sonst was.

Bin für jede Hilfe dankbar.
Gruß

Jochen K

rethus
Beiträge: 1851
Registriert: Di 28. Mär 2006, 11:55
Wohnort: Mönchengladbach
Kontaktdaten:

Beitrag von rethus » Di 17. Jul 2007, 13:48

Jups, da war noch ein kleiner Fehler drin. Hab oben den Code neu gepostet.
Dort ist jetzt auch neuer INPUT-CODE, da ich den Spaß so angepasst habe, das er die Daten nur für einen Eintrag aus der DB nimmt (angepasst für mein Branchenbuch).

Falls du nur den Fehler beheben willst, dann musst du auf die $lat und $lon Werte achten. Bei mir funzte es, wenn ich folgendes geändert habe:
$lon = substr($wert,35,9);
in
$lon = substr($wert,35,8);
Weil da sonst irgendwie ein } dazwischengerutscht war.

JochenK
Beiträge: 13
Registriert: Mi 28. Feb 2007, 18:09
Kontaktdaten:

und ohne diese Db

Beitrag von JochenK » Di 17. Jul 2007, 14:50

Hat sich erledigt: habe das Orginal Input modul mit deinem Ausgabemodul ohne Db Abfrage um bzw zusammengebastelt :lol:


und wenn man dein modul der KontaktDb nicht nutzen will/kann soll/

Wie sieht der Input/output dann aus?

gruss Jochen
Gruß

Jochen K

rethus
Beiträge: 1851
Registriert: Di 28. Mär 2006, 11:55
Wohnort: Mönchengladbach
Kontaktdaten:

Beitrag von rethus » Mi 18. Jul 2007, 15:29

Dann sieht der eigentlich aus wie im 1. Posting hier. Dort trägt man dann eine Adresse ein, und die wird dann angezeigt.

Uwe
Beiträge: 258
Registriert: Mo 30. Jun 2003, 16:05
Wohnort: Konstanz
Kontaktdaten:

dieses Modul für 4.4.5

Beitrag von Uwe » Fr 27. Jul 2007, 12:54

Hallo,

wie kann man das klasse Modul für die Version 4.4.5 anpassen?

Diese Fehlermeldung in der Templatekonfiguration sieht so aus:

contenido/includes/include.pretplcfg_edit_form.php(131) : eval()'d code on line 46

Für eine kurze Info wäre dankbar.

Viele Grüsse vom Bodensee, Uwe

rethus
Beiträge: 1851
Registriert: Di 28. Mär 2006, 11:55
Wohnort: Mönchengladbach
Kontaktdaten:

Beitrag von rethus » Do 2. Aug 2007, 11:11

Keine Ahnung, ich hab nur die Version 4.6.15.
Ältere Versionen hab ich hier nicht zur Verfügung um es zu testen.

Da wird dir nichts anderes über bleiben, als die debug-ausgabe zu aktivieren, und dich auf die Suche zu machen.

Uwe
Beiträge: 258
Registriert: Mo 30. Jun 2003, 16:05
Wohnort: Konstanz
Kontaktdaten:

Beitrag von Uwe » Do 2. Aug 2007, 11:21

Ok, danke. Fragen kost ja nix ;-)

Viele Grüsse aus Konstanz, Uwe

rethus
Beiträge: 1851
Registriert: Di 28. Mär 2006, 11:55
Wohnort: Mönchengladbach
Kontaktdaten:

Beitrag von rethus » Do 2. Aug 2007, 13:14

Hier noch eine Verbesserung, weil die Ermittlung der Geo-Daten noch buggy war.
Manchmal wurde die ein oder andere Adresse nicht angezeigt, weil die ermittelten Werte von lat: nicht immer die gleiche Zeichenausgabelänge haben.
Ersetzt einfach am Ende der Funktionget_lat_long($q) die Zeilen

Code: Alles auswählen

   $pos   = strpos($tmp,"center");
   $wert   = substr($tmp,$pos,70);
   $lat   = substr($wert,12,9);
   $lon   = substr($wert,35,8);
durch:

Code: Alles auswählen

// Beginne nach lat: und ende vor dem nächsten ,
        $latStart = (int) strpos($wert,"lat:")+ strlen("lat:");
        $latEnd   = (int) strpos($wert,",lng:") - $latStart;
	$lat	  = substr($wert,$latStart,$latEnd);
// Beginne nach lat: und ende vor dem nächsten }
        $lonStart = (int) strpos($wert,"lng:")+ strlen("lng:");
        $lonEnd   = (int) strpos($wert,"}")-$lonStart;
	$lon	  = substr($wert,$lonStart,$lonEnd);
So haben auch die Ständigen Fehler, die aufgrund dieser String-Zusammensetzung hier des öfteren auftauchten endlich ein Ende![/quote]

josh
Beiträge: 156
Registriert: Do 24. Jun 2004, 09:25
Wohnort: Ahlen
Kontaktdaten:

Beitrag von josh » Mi 17. Okt 2007, 16:04

Fuktioniert fast:

Die Daten von Google sind wohl recht unterschiedlich. Ich muste zusätzlich das ändern:

Code: Alles auswählen

   $pos   = strpos($tmp,"center");
   $wert  = substr($tmp,$pos,70);
durch:

Code: Alles auswählen

   $pos   = strpos($tmp,"center"); 
   $pos2  = strpos($tmp,"}");                
   $wert  = substr($tmp,$pos, $pos2); 
ersetzen

dann wie schon oben gepostet:

Code: Alles auswählen

// Beginne nach lat: und ende vor dem nächsten , 
        $latStart = (int) strpos($wert,"lat:")+ strlen("lat:"); 
        $latEnd   = (int) strpos($wert,",lng:") - $latStart; 
   $lat     = substr($wert,$latStart,$latEnd); 
// Beginne nach lat: und ende vor dem nächsten } 
        $lonStart = (int) strpos($wert,"lng:")+ strlen("lng:"); 
        $lonEnd   = (int) strpos($wert,"}")-$lonStart; 
   $lon     = substr($wert,$lonStart,$lonEnd); 

Gesperrt