TYPO3-Testaccount
Testen Sie die aktuellste TYPO3-Version kostenlos und unverbindlich für einen Monat!

Jetzt testen!

Schulungen

Powermail: Google Suchwort mit in Mail übertragen


Autor Nachricht
Verfasst am: 12. 06. 2008 [13:49]
einpraegsam.net
Moderator
Themenersteller
Dabei seit: 17.01.2005
Beiträge: 8849
Anforderung: Falls Besucher über Google kommt und das Kontaktformular nutzt, soll der Suchbegriff mit übermittelt werden


Idee: Eine kleine Userfunc wird über TS auf allen Seiten eingebunden (z.B. page.100). Diese Userfunc holt sich aus dem Referer das Suchwort (wenn vorhanden) und schreibt dies in die Session. Powermail schickt per Hiddenfield (funktioniert natürlich auch mit MailFormPlus) das Suchwort mit


Umsetzung:

Neue PHP Datei direkt im fileadmin anlegen mit Namen user_googlesession.php:
PHP
<?php
 
	// This class adds referer and google searchword to session (for using in powermail later)
	class user_googlesession {
 
		var $allow = array(1,1,1); // enable or disable the infos (1. Searchword, 2. Referer, 3. IP Address)
		var $sesprefix = 'wt_googlesession'; // prefix for session
		var $finalarray = array(); // empty array for session
		var $test = 0; // testmode (show google searchword)
 
 
		// Main function for additional google information
		function user_main($content='', $conf=array()) {
			$this->makeSession();
			if ($this->test === 1) return $this->user_test();
		}
 
 
		// Function to generate the session
		function makeSession() {
			$foo = $this->infoArray(); // Array with information about user
			if (count($foo) > 0 && $foo) { // if array is not empty
				$GLOBALS['TSFE']->fe_user->setKey("ses", $this->sesprefix, $this->infoArray()); // Generate Session with array
				$GLOBALS['TSFE']->storeSessionData(); // Save session
			}
		}
 
 
		// Function infoArray() generates array with needed stuff for session
		function infoArray() {
			$url = parse_url(htmlentities($_SERVER['HTTP_REFERER'])); // every part of the referer in an own array
			if(isset($url['query'])) { // if GET params is set
				preg_match("/q=(.*?)(&amp;|^)/", $url['query'], $output); // give me only the &q="searchword" part
 
				if ($output[1]) { // only if GET param &q= was set
					if ($this->allow[0]) $this->finalarray['searchword'] = urldecode($output[1]); // 1. searchword
					if ($this->allow[1]) $this->finalarray['referer'] = $_SERVER['HTTP_REFERER']; // 2. referer
				}
				if ($this->allow[2]) $this->finalarray['ip'] = $_SERVER['REMOTE_ADDR']; // 3. IP address
			} 
 
			// return whole array
			if (!empty($this->finalarray)) return $this->finalarray; // return info array
		}
 
		function user_test($content='', $conf=array()) {
			$content = 'Sessionentry: ';
			$content .= print_r($GLOBALS['TSFE']->fe_user->sesData[$this->sesprefix]['searchword'], 1);
			if (!empty($content)) return $content;
		}
 
	}
 
?>


Obige PHP file via TS auf allen Seiten einbinden - z.B.:
TYPOSCRIPT
includeLibs.user_googlesession = fileadmin/user_googlesession.php
 
page.100 = USER
page.100.userFunc = user_googlesession->user_main


In Powermail drei verborgene Felder (Hiddenfields) ohne Inhalt anlegen und UID dieser merken (in meinem Beispiel 26, 27 und 2icon_cool.gif.
Als nächstes diese drei Felder über TS aus der Session füllen lassen:

TYPOSCRIPT
plugin.tx_powermail_pi1 {
	prefill {
		uid26 = TEXT
		uid26.data = TSFE:fe_user|sesData|wt_googlesession|searchword
		uid27 = TEXT
		uid27.data = TSFE:fe_user|sesData|wt_googlesession|referer
		uid28 = TEXT
		uid28.data = TSFE:fe_user|sesData|wt_googlesession|ip
	}
}


Das wars...



Improvements:
- Ich habe in meinem Beispiel darauf geachtet, dass der Absender auf der Confirmation Seite das Hidden Field nicht zu Gesicht bekommt, indem ich die anzuzeigenden Felder manuell über das HTML Template eingetragen habe.
- Selbstverständlich lässt sich die IP Adresse sehr viel einfacher über TS füllen, hierzu braucht es das Script nicht - aber ich war schonmal dabei...


Grüße, Alex

ProfilWWW
Verfasst am: 10. 07. 2008 [18:08]
einpraegsam.net
Moderator
Themenersteller
Dabei seit: 17.01.2005
Beiträge: 8849
Hier habe ich mal die Klasse verändert, damt auch noch der Referer in die Session geschrieben wird, wenn von Referer extern:
PHP
<?php
 
	// This class adds referer and google searchword to session (for using in powermail later)
	class user_googlesession {
 
		var $allow = array(1,1,1); // enable or disable the infos (1. Searchword, 2. Referer, 3. IP Address)
		var $sesprefix = array('wt_googlesession', 'wt_referersession'); // prefix for session
		var $finalarray = array(); // empty array for session
		var $test = 0; // testmode (show google searchword)
 
 
		// Main function for additional google information
		function user_main($content='', $conf=array()) {
			$this->makeSession();
			//$this->help();
			if ($this->test === 1) return $this->user_test();
		}
 
 
		// Function to generate the session
		function makeSession() {
			// 1. save google searchword to session if exists
			$foo = $this->infoArray(); // Array with information about user
			if (count($foo) > 0 && $foo) { // if array is not empty
				$GLOBALS['TSFE']->fe_user->setKey("ses", $this->sesprefix[0], $this->infoArray()); // Generate Session with array
				$GLOBALS['TSFE']->storeSessionData(); // Save session
			}
 
			// 2. save refer to session if not conject.com or conject.de
			if (strpos($_SERVER['HTTP_REFERER'], 'yourdomain.com') === false && strpos($_SERVER['HTTP_REFERER'], 'yourdomain.de') === false) { // if referer is from extern
				$GLOBALS['TSFE']->fe_user->setKey("ses", $this->sesprefix[1], $_SERVER['HTTP_REFERER']); // Generate Session with array
				$GLOBALS['TSFE']->storeSessionData(); // Save session
			}
		}
 
 
		// Function infoArray() generates array with needed stuff for session
		function infoArray() {
			$url = parse_url(htmlentities($_SERVER['HTTP_REFERER'])); // every part of the referer in an own array
			if(isset($url['query'])) { // if GET params is set
				preg_match("/q=(.*?)(&amp;|^)/", $url['query'], $output); // give me only the &q="searchword" part
 
				if ($output[1]) { // only if GET param &q= was set
					if ($this->allow[0]) $this->finalarray['searchword'] = urldecode($output[1]); // 1. searchword
					if ($this->allow[1]) $this->finalarray['referer'] = $_SERVER['HTTP_REFERER']; // 2. referer
				}
				if ($this->allow[2]) $this->finalarray['ip'] = $_SERVER['REMOTE_ADDR']; // 3. IP address
			} 
 
			// return whole array
			if (!empty($this->finalarray)) return $this->finalarray; // return info array
		}
 
		function user_test($content='', $conf=array()) {
			$content = 'Sessionentry: ';
			$content .= print_r($GLOBALS['TSFE']->fe_user->sesData[$this->sesprefix[0]]['searchword'], 1);
			if (!empty($content)) return $content;
		}
 
		/*
		function help() {
			if ($_SERVER['REMOTE_ADDR'] == '192.168.20.199') {
				$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery (
					'pid, uid, bodytext',
					'tt_content2',
					$where_clause = 'bodytext LIKE "%www.conject.de%"',
					$groupBy = '',
					$orderBy = '',
					$limit = ''
				);
				if ($res) { // If on current page is a result
					while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { // one loop for every db entry
						//echo $row['bodytext'];
 
 
						$GLOBALS['TYPO3_DB']->exec_UPDATEquery (
							'tt_content_x',
							'uid = '.$row['uid'],
							array (
								'bodytext' => str_replace('www.conject.de','www.conject.com',$row['bodytext'])
							)
						);
 
 
					}
				}
			}
		}
		*/
 
	}
 
?>


Der Rest wie oben (ab in ein Hiddenfield damit)

ProfilWWW
Verfasst am: 02. 01. 2009 [15:20]
einpraegsam.net
Moderator
Themenersteller
Dabei seit: 17.01.2005
Beiträge: 8849
Auf conject.com übertragen wir folgende Daten beim Ausfüllen irgend eines Formulares:
- Link zur Seite des Formulares
- Ausgewählte FE Sprache
- GEO Info (Stadt) des Users (hierzu ist eine kleine userFunc nötig - kann ich bei Interesse auch posten)
- GEO Info (Land) des Users (gleiche userFunc nötig)
- Google Suchwort
- Referer
- Google Adwords Code
- IP

Hier das TS:
TYPOSCRIPT
plugin.tx_powermail_pi1.dynamicTyposcript {
    ai = COA
    ai.wrap = <hr />|
    ai {
    	# Current page
        10 = COA
        10.wrap = <b>conject page:</b>&nbsp;|
        10.10 = TEXT
        10.10.typolink.parameter.data = TSFE:id
        10.10.typolink.returnLast = url
        10.10.wrap = <a href="http://www.conject.com/|">
        10.20 = TEXT
        10.20.data = page:title
        10.20.wrap = |</a>
 
    	# Current language
        20 = COA       
        20.wrap = <b>Preferred language:</b>&nbsp;|
        20.10 = CASE
        20.10.key.data = GPvar:L 
        20.10.default = TEXT
        20.10.default.value = EN
        20.10.1 = TEXT
        20.10.1.value = DE
        20.10.4 = TEXT
        20.10.4.value = RU
        20.10.5 = TEXT
        20.10.5.value = ME
 
    	# Geoinfo City
        30 = COA
        30.10 = USER
        30.10.userFunc = user_pmgeoinfo->city
        30.wrap = <b>City:</b>&nbsp;|
 
        # Geoinfo Country
        40 = COA
        40.10 = USER
        40.10.userFunc = user_pmgeoinfo->country
        40.wrap = <b>Country:</b>&nbsp;|
 
    	# Google Searchword if any
        50 = TEXT
        50.data = TSFE:fe_user|sesData|wt_googlesession|searchword
        50.wrap = <b>Google searchword:</b>&nbsp;|
 
    	# Referer if any
        60 = TEXT
        60.data = TSFE:fe_user|sesData|wt_referersession
        60.wrap = <b>Referer:</b>&nbsp;|
 
    	# Googleaddwords code
        70 = TEXT
        70.data = TSFE:fe_user|sesData|wt_googleaddscode
        70.wrap = <b>Google adwords code:</b>&nbsp;|
 
        # IP address
        100 = TEXT
        100.data = getIndpEnv:REMOTE_ADDR
        100.wrap = <b>IP Address:</b>&nbsp;|
    }
}


ProfilWWW
Verfasst am: 30. 09. 2009 [20:25]
warner3
Dabei seit: 12.06.2009
Beiträge: 42
hierzu ist eine kleine userFunc nötig - kann ich bei Interesse auch posten


kannst du das mal posten?

danke
Profil
Verfasst am: 01. 10. 2009 [10:15]
einpraegsam.net
Moderator
Themenersteller
Dabei seit: 17.01.2005
Beiträge: 8849
z.B.:
PHP
<?php
 
	class user_pmgeoinfo {
 
		var $geoDBpath = 'fileadmin/conject/administration/scripts/GeoLiteCity.dat'; // path to geoip database
		var $ip = ''; // test some ip addresses (e.g. DEU: 83.236.183.130, UAE: 195.229.237.36, UAE: 87.200.131.139, RUS: 89.113.208.15)
 
		// Get country
		function country($content='', $conf=array()) {
			$this->geoInfo(); // init geoip
			if (!empty($this->GEOinfos['countryName'])) return $this->GEOinfos['countryName'];
		}
 
		// Get country ISO code
		function countryISO($content='', $conf=array()) {
			$this->geoInfo(); // init geoip
			$this->GEOinfos['countryCode'] = $this->changeISO_3_2($this->GEOinfos['countryCode']); // changes ISO code from 3 to 2
 
			if (!empty($this->GEOinfos['countryCode'])) return $this->GEOinfos['countryCode'];
		}
 
		// Get city
		function city($content='', $conf=array()) {
			$this->geoInfo(); // init geoip
			if (!empty($this->GEOinfos['city'])) return $this->GEOinfos['city'];
		}
 
		// Get zipFromCity (Extension zip_distance neeeded)
		function zipFromCity($content='', $conf=array()) {
			// config
			global $TSFE;
    		$this->cObj = $TSFE->cObj; // cObject
			$city = $this->cObj->cObjGetSingle($conf['userFunc.']['city'], $conf['userFunc.']['city.']); // get city from typoscript
			if (empty($city)) { // no city defined in typoscript
				$this->geoInfo(); // init geoip
				$city = $this->GEOinfos['city']; // Get city from geoinfo
			}
 
			// Let's go
			if (!empty($city)) { // only if city was given
				if (t3lib_extMgm::isLoaded('zip_distance')) { // if zip_distance is loaded
 
					$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery (
						'zip',
						'tx_zipdistance',
						'city = "'.$city.'"',
						'',
						'',
						'1'
					);
					$row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res);
					if (!empty($row['zip'])) {
						$zip = ($conf['userFunc.']['cutAfter'] > 0 ? substr($row['zip'], 0, $conf['userFunc.']['cutAfter']).$conf['userFunc.']['fillWith'].$conf['userFunc.']['fillWith'].$conf['userFunc.']['fillWith'] : $row['zip']);
						return $zip;
					}
 
				} else die ('zip_distance not loaded!');
			} else return false; // no city given
		}
 
		// Debut output with all available information
		function giveMeAll($content='', $conf=array()) {
			if (!empty($conf['userFunc.']['ip'])) $this->ip = $conf['userFunc.']['ip']; // set ip from typoscript
			$this->geoInfo(); // init geoip
 
			t3lib_div::debug($this->GEOinfos);
		}
 
		#######
 
		// use geo ip if loaded
		function geoInfo() {
			if (t3lib_extMgm::isLoaded('geoip')) {
				require_once(t3lib_extMgm::extPath('geoip').'/pi1/class.tx_geoip_pi1.php');
				$this->media = t3lib_div::makeInstance('tx_geoip_pi1');
				$this->media->init($this->geoDBpath); // Initialize the Geoip Ext
				$this->GEOinfos = $this->media->getGeoIP(($this->ip ? $this->ip : t3lib_div::getIndpEnv('REMOTE_ADDR'))); // get all the infos
			} else die('geoip not loaded!');
		}
 
		// function changeISO_3_2 changes country with ISO code 3 to ISO code 2 (DEU => DE, AUT => AT)
		function changeISO_3_2($country) {
			if (t3lib_extMgm::isLoaded('static_info_tables', 0)) { // if ext static_info_tables is loaded
 
				$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery (
					'cn_iso_2',
					'static_countries',
					'cn_iso_3 = "'.$country.'"',
					'',
					'',
					'1'
				);
				$row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res);
 
				if (!empty($row['cn_iso_2'])) return $row['cn_iso_2'];
			} else die ('static_info_tables not loaded!');
		}
 
	}
 
?>


Extensions im Einsatz:
- zip_distance
- static_info_tables
- geoip

Erklärung gibt es aktuell leider nicht - ich denke, dass man allenfalls Teile herauskopieren und verwenden kann, weil der Rest einfach zu speziell ist...

Cheers, Alex

ProfilWWW
Verfasst am: 30. 06. 2010 [12:21]
MUSIKMANN
Dabei seit: 07.02.2008
Beiträge: 85
Moin Axel,

genau so etwas habe ich noch gesucht. Nun habe ich die User-Func, also deine php-Datei kopiert und entsprechend im Ordner fildeamdin abgelegt. Die anderen Zeilen ins TS geschrieben und wollte durchstarten ...

Leider keine Ausgabe der IP, des Referres und des Suchwortes. Ich habe gesehen, dass die Posts aus 2009 sind und wollte deshalb wissen, ob der Code auch mit Typo3 4.3.3 funktioniert ...

Freue mich von dir zu hören...

Musik & Gruss
Gunnar

Musikmann
Gunnar Hampel
http://www.musikmann.com
ProfilWWW
Verfasst am: 30. 06. 2010 [12:27]
einpraegsam.net
Moderator
Themenersteller
Dabei seit: 17.01.2005
Beiträge: 8849
Sollte auch heute noch funktionieren...

ProfilWWW
Verfasst am: 13. 07. 2010 [09:53]
MUSIKMANN
Dabei seit: 07.02.2008
Beiträge: 85
Hallo Axel,

ich werde mich dann mal versuchen und hier meine Vorgehensweise mal Schritt für Schritt aufzeigen, denn einen Erfolg konnte ich bisher nicht erzielen.

1. Erstellen der Datei user_googlesession.php (Copie der Datei hier)
2. auf eigenen Space unter root/fileadmin/ legen

3. Eintrag ins TS (Konstanten)
includeLibs.user_googlesession = fileadmin/user_googlesession.php
page.100 = USER
page.100.userFunc = user_googlesession->user_main

4. Eintrag ins TS (Konfiguration)
plugin.tx_powermail_pi1 {
prefill {
uid206 = TEXT
uid206.data = TSFE:fe_user|sesData|wt_googlesession|searchword
uid203 = TEXT
uid203.data = TSFE:fe_user|sesData|wt_googlesession|referer
uid208 = TEXT
uid208.data = TSFE:fe_user|sesData|wt_googlesession|ip
}
}

Was habe ich falsch gemacht?


[Dieser Beitrag wurde 1mal bearbeitet, zuletzt am 13.07.2010 um 09:53.]

Musikmann
Gunnar Hampel
http://www.musikmann.com
ProfilWWW
Verfasst am: 13. 07. 2010 [11:18]
einpraegsam.net
Moderator
Themenersteller
Dabei seit: 17.01.2005
Beiträge: 8849
Das lässt sich von hier aus schwer sagen.

Mögliche Vorgehensweise:
1. Wird die userFunc auf jeder Seite aufgerufen? Testen mit einem Debugoutput.
Falls nein, stimmt was mit der Einbindung nicht (Dateiname und Pfad überprüfen)

2. Werden die Daten wie ip, referer und natürlich auch das googlesuchwort überhaupt in die session eingetragen?
Debugoutput der Sessiondaten in der userFunc vor und nach dem Eintrag in die Session!?
Falls die Daten vor dem Eintrag da sind, aber nicht danach, stimmt das Sessionhandling eventuell nicht (Im Installtool nachsehen)

3. Beim Formularaufruf werden die Felder nicht vorbefüllt (Im Quelltext kontrollieren)

etc...

ProfilWWW