# GeoIP Plugin

**URL:** <https://forum.shopware.com/t/geoip-plugin/37778>\
**Category:** Programmierung\
**Created:** [29. Juni 2016 um 07:49 UTC](https://forum.shopware.com/t/geoip-plugin/37778 "2016-06-29T07:49:24Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![wunderfabrik](https://avatars.discourse-cdn.com/v4/letter/w/e19adc/32.png) [@wunderfabrik](https://forum.shopware.com/u/wunderfabrik)\
**Post date:** [29. Juni 2016 um 07:49 UTC](https://forum.shopware.com/t/geoip-plugin/37778/1 "2016-06-29T07:49:24Z")

</div>

Hallo Zusammen

ich versuche gerade für unseren Shop ein GeoIP Plugin zu basteln, leider bis jetzt nicht so erfolgreich.  
Ziel des Plugins: Erkennung der Herkunft (Land), Wenn Land = CH dann soll eine Modalbox erscheinen mit der Empfehlung auf den Schweizer Shop zu wechseln.

Leider funktioniert das ganze aktuell nicht, daher poste ich mal meinen Code, vlt. kann mir jemand von euch weiterhelfen und mir sagen wo ich den/die Fehler hab. Danke im Voraus.

Bootstrap.php:

```
View()->setTemplate(); // Disable output
       define("_auth",true);
       include(dirname( __PATH__ )."/geoip.inc");
    // GeoIP Abfrage
    $gi = geoip_open("GeoIP.dat", GEOIP_STANDARD);
    $countrycode = geoip_country_code_by_addr($gi, $ipAddress);
    geoip_close($gi); 
    }

}

$ipAddress = $_SERVER['REMOTE_ADDR']; 
$cookie = $_GET["cookie"]; 

if ($cookie == "0") {
setcookie("country", $cookie, time()-3600);  
header ("Location: http://".$_SERVER["SERVER_NAME"]); 
exit;
}   

if ($cookie == "1") {
setcookie("country", $cookie, time()+3600);  
header ("Location:http://".$_SERVER["SERVER_NAME"]); 
exit;
} 

class Shopware_Plugins_Frontend_wfcountry_Bootstrap extends Shopware_Components_Plugin_Bootstrap
{
 public function install()
 {
     $this->subscribeEvent(
         'Enlight_Controller_Action_PostDispatchSecure_Frontend',
         'onFrontendPostDispatch'
     );

     $this->createConfig();

     return true;
 }  
 
    private function createConfig()
    { }
    public function getVersion()
    {
        return '1.0.0';
    }
  

    public function getLabel()
    {
        return 'GeoIP Country Modalbox';
    }
	/**
	 * Return some information about this plugin.
	 *
	 * @return array
	 */
	public function getInfo()
	{
		return array(
			'label' => $this->getLabel(),
			'description' => $this->getLabel(),
			'source' => 'Local',
			'support' => 'info@domain.ch',
			'link' => 'http://www.domain.ch/',
			'autor' => 'Company GmbH',
			'license' => 'proprietary',
			'copyright' => 'Copyright ' . date('Y') . ', Company GmbH',
			'version' => $this->getVersion()
		);
    
    }
    
    public function onFrontendPostDispatch(Enlight_Event_EventArgs $args)
    {
    /** @var \Enlight_Controller_Action $controller */
    $controller = $args->get('subject');
    $view = $controller->View();
    $view->addTemplateDir(
        __DIR__. '/Views'
    );
if (isset($_COOKIE['country'])) { }

else {
if ($countrycode == "CH") {
$view->wfcountry = "yes";
$view->wfdomain = $_SERVER["SERVER_NAME"];
        
}
}   
}
}

```

header.tpl

```
{extends file="parent:frontend/index/header.tpl"}

{block name='frontend_index_header_javascript' append}
{if $wfcountry == "yes"}
{literal}

			var modal = (function(){
				var 
				method = {},
				$overlay,
				$modal,
				$content,
				$close;

				// Zentrieren der MODAL BOX
				method.center = function () {
					var top, left;

					top = Math.max($(window).height() - $modal.outerHeight(), 0) / 2;
					left = Math.max($(window).width() - $modal.outerWidth(), 0) / 2;

					$modal.css({
						top:top + $(window).scrollTop(), 
						left:left + $(window).scrollLeft()
					});
				};

				// Open MODAL BOX
				method.open = function (settings) {
					$content.empty().append(settings.content);

					$modal.css({
						width: settings.width || 'auto', 
						height: settings.height || 'auto'
					});

					method.center();
					$(window).bind('resize.modal', method.center);
					$modal.show();
					$overlay.show();
				};

				// Close MODAL BOX
				method.close = function () {
					$modal.hide();
					$overlay.hide();
					$content.empty();
					$(window).unbind('resize.modal');
				};

				// Generiert HTML
				$overlay = $('<div id="overlay"></div>');
				$modal = $('<div id="modal"></div>');
				$content = $('<div id="content"></div>');
				$close = $('<a id="close" href="//{$wfdomain}/index.php?cookie=1">close</a>');

				$modal.hide();
				$overlay.hide();
				$modal.append($content, $close);

				$(document).ready(function(){
					$('body').append($overlay, $modal);						
				});

				$close.click(function(e){
					e.preventDefault();
					method.close();
				});

				return method;
			}());

			// Warten bis Seite geladen wurde
			$(document).ready(function(){

				$.get('../../../../switzerland.html', function(data){
					modal.open({content: data});
				});
        
			});
		

 {/literal}

{/if}

{/block}
{block name="frontend_index_header_css_screen"}

{/block}

```

&nbsp;

---

<div class="post-metadata">

**Author:** ![sonic](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/sonic/32/25728_2.png) [@sonic](https://forum.shopware.com/u/sonic)\
**Post date:** [29. Juni 2016 um 07:56 UTC](https://forum.shopware.com/t/geoip-plugin/37778/2 "2016-06-29T07:56:32Z")

</div>

Warum es genau nicht funktioniert, kann ich nicht sagen.  
Aber überdenke noch einmal Deinen Ansatz: „Live“ sollte der Shop ja mit Cache laufen - und genau hier könnte ein Problem auf dich&nbsp;zukommen: Die heaer.tpl dürfte aus dem Cache kommen =\> das Plugin dürfte nach dem ersten Aufruf nicht mehr greifen.

Vielleicht sollte die Abfrage in ein widget ausgelagert &nbsp;und durch {action …} aufgerufen werden. Ggf. könntest Du Dich auch z.B. in das Mini-Warenkorb-Widget einklinken.

---

<div class="post-metadata">

**Author:** ![wunderfabrik](https://avatars.discourse-cdn.com/v4/letter/w/e19adc/32.png) [@wunderfabrik](https://forum.shopware.com/u/wunderfabrik)\
**Post date:** [29. Juni 2016 um 08:12 UTC](https://forum.shopware.com/t/geoip-plugin/37778/3 "2016-06-29T08:12:09Z")

</div>

Hallo Sonic

Danke für Deine Antwort. Der Ansatz mit dem widget ist schon mal eine gute Idee das hab ich gar nicht beacht. Danke. Aber dennoch frage ich mich weshalb die header.tpl gar nicht erst geladen wird.

Chache habe ich mehrfach geleert (sowohl Shop als auch Browser).

---

<div class="post-metadata">

**Author:** ![sonic](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/sonic/32/25728_2.png) [@sonic](https://forum.shopware.com/u/sonic)\
**Post date:** [29. Juni 2016 um 08:40 UTC](https://forum.shopware.com/t/geoip-plugin/37778/4 "2016-06-29T08:40:30Z")

</div>

Nach dem Plugin-Beispiel geht die Variablenzuweisen doch mit assign - keine Ahnung, ob eine direkte Zuweisung, wie Du es machst, die Variabel an das Template durchreicht.

```
$view->assign('wfcountry', 'yes');
$view->assign('wfdomain',$_SERVER["SERVER_NAME"]);

```

&nbsp;

---

<div class="post-metadata">

**Author:** ![wunderfabrik](https://avatars.discourse-cdn.com/v4/letter/w/e19adc/32.png) [@wunderfabrik](https://forum.shopware.com/u/wunderfabrik)\
**Post date:** [29. Juni 2016 um 08:44 UTC](https://forum.shopware.com/t/geoip-plugin/37778/5 "2016-06-29T08:44:13Z")

</div>

OK ich probiere das gerne mal aus. Aber ich denke da muss noch ein weiterer Fehler sein. Ich hab Testhalber mal alles bis auf dem CSS aus dem Template genommen und die URL direkt eingetragen. Leider auch ohne erfolg.

---

<div class="post-metadata">

**Author:** ![sonic](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/sonic/32/25728_2.png) [@sonic](https://forum.shopware.com/u/sonic)\
**Post date:** [29. Juni 2016 um 08:48 UTC](https://forum.shopware.com/t/geoip-plugin/37778/6 "2016-06-29T08:48:24Z")

</div>

Ich würde jetzt einfach mal “brutal” ein **die** in den else-block setzen, und gucken, ob das Plugin überhaupt aufgerufen wird.

---

<div class="post-metadata">

**Author:** ![wunderfabrik](https://avatars.discourse-cdn.com/v4/letter/w/e19adc/32.png) [@wunderfabrik](https://forum.shopware.com/u/wunderfabrik)\
**Post date:** [29. Juni 2016 um 08:54 UTC](https://forum.shopware.com/t/geoip-plugin/37778/7 "2016-06-29T08:54:29Z")

</div>

OK das funktioniert schon mal 😉  
Jetzt weiss ich wenigstens, dass das Plugin aufgerufen wird 😉

---

<div class="post-metadata">

**Author:** ![wunderfabrik](https://avatars.discourse-cdn.com/v4/letter/w/e19adc/32.png) [@wunderfabrik](https://forum.shopware.com/u/wunderfabrik)\
**Post date:** [29. Juni 2016 um 09:19 UTC](https://forum.shopware.com/t/geoip-plugin/37778/8 "2016-06-29T09:19:22Z")

</div>

So jetzt bin ich einen schritt weiter.

Dieser Abschnitt scheint das Problem zu sein. bzw. die Datei geoip.inc wird nicht geladen auch wenn ich den Pfad von Hand eingebe. Ich habs sogar mit dem Absoluten Pfad versucht.

Zum Test mal die „brutale“ Methode mit einem **die** bzw. **exit;** in die geoip.inc geschrieben.

&nbsp;

```
 public function includeFileTestAction()
    
     {
   // $this->View()->setTemplate(); // Disable output
       define("_auth",true);
       include(dirname( __PATH__ )."/geoip.inc");
    // GeoIP Abfrage
    $gi = geoip_open("GeoIP.dat", GEOIP_STANDARD);
    $countrycode = geoip_country_code_by_addr($gi, $ipAddress);
    geoip_close($gi); 
    }

```

&nbsp;

---

<div class="post-metadata">

**Author:** ![Thomas](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/thomas/32/8167_2.png) [@Thomas](https://forum.shopware.com/u/Thomas)\
**Post date:** [29. Juni 2016 um 10:51 UTC](https://forum.shopware.com/t/geoip-plugin/37778/9 "2016-06-29T10:51:42Z")

</div>

ggf. kannst Du ja die Basis von Shopware nehmen:&nbsp;[GitHub - shopwareLabs/SwagBrowserLanguage](https://github.com/shopwareLabs/SwagBrowserLanguage)

Dort wird “nur” nach der Browsersprache geprüft aber das könntest Du ja dann einfach durch die GeoIP Prüfung ersetzen.
