Skip to content

pixelmatseriks/ipandlanguageredirect

 
 

Repository files navigation

TYPO3 Extension ipandlanguageredirect

TYPO3 FE visitor automatic or manual redirect to another language or another root page.

Introduction

This extension allows multi-language and multi-domain handling with redirects to best fitting pages with best fitting language based on the visitors browser language and region (IP-Address).

An AJAX-request (VanillaJS only - no JavaScript framework is needed) will handle the serverside-domain-logic to redirect or suggest a new webpage or a new language.

Define in your PHP-configuration which countries belongs to which pagetree and which browserlanguage belongs to which frontend language

Screens

Suggest another URI because the current page does not fit:

Installation

  • Install this extension
  • Add a static template (page.5 will be used for the suggest container, page.1555 for the script)
  • Copy the original configuration from ipandlanguageredirect/Configuration/Redirect/Redirect.php to any other location
  • Modify the configuration for your needs
  • Set the new path in the extension manager to your configuration file
  • Have fun!

Example configuration

<?php
return [
    // Quantifiers for the matches (shouldn't be touched)
    'quantifier' => [
        'browserLanguage' => [
            'totalMatch' => 7,
            'wildCardMatch' => 3
        ],
        'countryBasedOnIp' => [
            'totalMatch' => 13,
            'wildCardMatch' => 5
        ],
        'actions' => [
            'referrers' => [
                'totalMatch' => 7,
                'wildCardMatch' => 3,
            ]
        ]
    ],
    // Example action
    'actions' => [
        [
            // Automatic redirect to best fitting uri if visitor comes from a search engine
            'referrers' => [
                'google.',
                'bing.',
                'yahoo.',
                't-online.',
                'yandex.',
                'baidu.'
            ],
            'events' => [
                'redirect'
            ]
        ],
        [
            // For all other cases: Suggest a better fitting page
            'referrers' => [
                '*'
            ],
            'events' => [
                'suggest'
            ]
        ],
        [
            // Disable redirect for pages inside the given pid
            'pidInRootline' => [
                '129',
                '11',
            ],
            'events' => [
                'none',
            ],
        ],
    ],
    // configuration if nothing matches
    'noMatchingConfiguration' => [
        'identifierUsage' => 'worldwide_english',
        'matchMinQuantifier' => 15
    ],
    // main redirect configuration
    'redirectConfiguration' => [

        // Build URI to page 1 if visitors came from anywhere in the world
        1 => [

            // Build URI to language 0 if browser language is not defined here
            0 => [
                'identifier' => 'worldwide_english',
                'browserLanguage' => [
                    '*'
                ],
                'countryBasedOnIp' => [
                    '*'
                ]
            ],

            // Build URI to language 1 if browser language is german "de"
            1 => [
                'identifier' => 'worldwide_german',
                'browserLanguage' => [
                    'de'
                ],
                'countryBasedOnIp' => [
                    '*'
                ]
            ],

            // Build URI to language 2 if browser language is chinese "cn"
            2 => [
                'identifier' => 'worldwide_chinese',
                'browserLanguage' => [
                    'cn'
                ],
                'countryBasedOnIp' => [
                    '*'
                ]
            ],
        ],

        // Build URI to page 2 if visitors came from USA, Canada or Argentina
        2 => [

            // Build URI to language 0 if browser language is not defined here
            0 => [
                'identifier' => 'america_english',
                'browserLanguage' => [
                    '*'
                ],
                'countryBasedOnIp' => [
                    'ca',
                    'us',
                    'ar',
                ]
            ],

            // Build URI to language 1 if browser language is german "de"
            1 => [
                'identifier' => 'worldwide_german',
                'browserLanguage' => [
                    'de'
                ],
                'countryBasedOnIp' => [
                    '*'
                ]
            ],
        ],
    ]
];

TypoScript

If you add the static TypoScript, this lines have an effect:

plugin.tx_ipandlanguageredirect {
	view {
		templateRootPaths {
			0 = EXT:ipandlanguageredirect/Resources/Private/Templates/
			1 = {$plugin.tx_ipandlanguageredirect.view.templateRootPath}
		}
	}
	settings {
		configuration = {$plugin.tx_ipandlanguageredirect.settings.configuration}
	}
}

page {
	includeJSFooter.ipandlanguageredirect = EXT:ipandlanguageredirect/Resources/Public/JavaScripts/Frontend.min.js
	includeCSS.ipandlanguageredirect = EXT:ipandlanguageredirect/Resources/Public/Css/Frontend.min.css

	# Suggest container that can be slided down
	5 = USER
	5 {
		userFunc = TYPO3\CMS\Extbase\Core\Bootstrap->run
		extensionName = Ipandlanguageredirect
		pluginName = Pi1
		vendorName = In2code
		controller = Redirect
		action = suggest
		switchableControllerActions.Redirect.1 = suggest
	}

	# Container for informations that will be send to an AJAX service
	1555 = COA
	1555 {
		wrap = <script id="ipandlanguageredirect_container"|></script>

		# Uri to send AJAX request to
		10 = TEXT
		10 {
			noTrimWrap = | data-ipandlanguageredirect-ajaxuri="|"|
			typolink {
				parameter.data = TSFE:id
				additionalParams = &type=1555
				returnLast = url
				forceAbsoluteUrl = 1
			}
		}

		# FE language
		20 = TEXT
		20 {
			noTrimWrap = | data-ipandlanguageredirect-languageuid="|"|
			data = GP:L
			intval = 1
		}

		# Root page uid
		30 = TEXT
		30 {
			noTrimWrap = | data-ipandlanguageredirect-rootpageuid="|"|
			data = leveluid:0
		}

		# Fake browser language for testing - e.g. &tx_ipandlanguageredirect_pi1[browserLanguage]=en
		40 = TEXT
		40 {
			noTrimWrap = | data-ipandlanguageredirect-browserlanguage="|"|
			data = GP:tx_ipandlanguageredirect_pi1|browserLanguage
			htmlSpecialChars = 1
			required = 1
		}

		# Fake ip-address for testing - e.g. &tx_ipandlanguageredirect_pi1[ipAddress]=66.85.131.18 (USA)
		50 = TEXT
		50 {
			noTrimWrap = | data-ipandlanguageredirect-ipaddress="|"|
			data = GP:tx_ipandlanguageredirect_pi1|ipAddress
			htmlSpecialChars = 1
			required = 1
		}

		# Fake country for testing (overlays ip-address) - e.g. &tx_ipandlanguageredirect_pi1[countryCode]=us (USA)
		60 = TEXT
		60 {
			noTrimWrap = | data-ipandlanguageredirect-countrycode="|"|
			data = GP:tx_ipandlanguageredirect_pi1|countryCode
			htmlSpecialChars = 1
			required = 1
		}

		# Fake referrer for testing - e.g. &tx_ipandlanguageredirect_pi1[referrer]=www.google.de
		70 = TEXT
		70 {
			noTrimWrap = | data-ipandlanguageredirect-referrer="|"|
			data = GP:tx_ipandlanguageredirect_pi1|referrer
			htmlSpecialChars = 1
			required = 1
		}
	}
}

# AJAX types
redirectAjax = PAGE
redirectAjax {
	typeNum = 1555
	config {
		additionalHeaders = Content-Type: application/json
		no_cache = 1
		disableAllHeaderCode = 1
		disablePrefixComment = 1
		xhtml_cleaning = 0
		admPanel = 0
		debug = 0
	}

	10  = USER
	10 {
		userFunc = TYPO3\CMS\Extbase\Core\Bootstrap->run
		extensionName = Ipandlanguageredirect
		pluginName = Pi1
		vendorName = In2code
		controller = Redirect
		action = redirect
		switchableControllerActions.Redirect.1 = redirect
	}
}
testAjax < redirectAjax
testAjax {
	typeNum = 1556
	10.action = test
	10.switchableControllerActions.Redirect.1 = test
}

Testing

Simulate browserlanguage, country and referrer

http://domain.org/index.php?id=1
&tx_ipandlanguageredirect_pi1[ipAddress]=66.85.131.18
&tx_ipandlanguageredirect_pi1[browserLanguage]=de
&tx_ipandlanguageredirect_pi1[referrer]=www.google.de
&tx_ipandlanguageredirect_pi1[countryCode]=af
&no_cache=1

Note: Be aware that this settings are cached by default. So you have to always add a &no_cache=1

Don't redirect or suggest but show the redirectUri in the browserconsole

http://domain.org/index.php?id=1
&ipandlanguagedebug=1

FAQ

  • Hide Suggest Message
    • Q1: How to disable the suggest message on click on one of my own links?
    • A1: You could add links or other dom elements with attribute data-ipandlanguageredirect-action="hideMessage" anywhere on your page to disable the suggest message. Use case: If the user changes the region or language manually on your site, the message should be dissapear in future.
    • Q2: How to disable the suggest message with a GET parameter?
    • A2: The message will be hidden and the cookie to hide it will be set if the GET parameter &h=1 or &h=3 is given
  • Disable redirect
    • Q1: How to disable the redirect on click on one of my own links?
    • A1: You could add links or other dom elements with attribute data-ipandlanguageredirect-action="disableRedirect" anywhere on your page to disable redirect.
    • Q2: How to disable the redirect with a GET parameter?
    • A2: The redirect will be disabled by settings a cookie if the GET parameter &h=2 or &h=3 is given
  • Cookie Livetime
    • The default cookie livetime is temporarely - as long as the browser is open. This is not adjustable at the moment.
  • Testing
    • Q1: How can I test another IP-address, region or browserlanguage?
    • A1: See part testing
    • Q2: Where can I see which parameters are send and received via AJAX?
    • A2: Open your browser console and check the post request to ?type=1555 - check the parameters or answers

Changelog

Version Date State Description
1.7.0 2017-09-25 Feature Support paid variant of IpApi.co for more then 1000 visitors a day
1.6.4 2017-08-11 Bugfix Fix header output in TYPO3 8
1.6.3 2017-07-28 Bugfix Disable cHash check for AJAX requests in T3 8
1.6.2 2017-07-12 Bugfix Fix small typo in composer.json
1.6.1 2017-04-12 Bugfix Fix getting browserlanguage from chrome
1.6.0 2017-02-04 Feature Redirection should be only once in a session
1.5.3 2017-02-01 Bugfix Make code readable for PHP 5.5
1.5.2 2017-01-31 Task Remove unused typoscript
1.5.1 2017-01-26 Bugfix Avoid JS exception if state == none
1.5.0 2017-01-25 Feature New option to disable functions for a pagetree
1.4.1 2016-11-15 Task Semantic code cleanup for HTML and CSS
1.4.0 2016-11-15 Feature Semantic code cleanup for HTML and CSS
1.3.0 2016-11-07 Feature Hide suggest message on GET parameter
1.2.0 2016-11-03 Feature Allow hideMessage on multi-links now
1.1.0 2016-11-01 Feature Add testing features
1.0.0 2016-11-01 Initial Initial release

About

TYPO3 redirct - browserlanguage and ip-address based

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • PHP 70.5%
  • JavaScript 25.9%
  • CSS 2.4%
  • HTML 1.2%