5

現在、デフォルトの場所にZendアプリケーションがあります www.example.com/{controller}/{action}

しかし、ユーザーが特定の国から訪問した場合、IPアドレスを検出し、このcountryCodeベースのURLにリダイレクトする方法は www.example.com/uk/{controller}/{action}

ユーザーが訪問している国を検出するために、私はヘルパーを作成しました。

require_once '../library/Ipinfo/ip2locationlite.class.php';

class Application_View_Helper_GetLocation extends Zend_View_Helper_Abstract
{
    public function getLocation()
    {

        $ipLite = new ip2location_lite;
        $ipLite->setKey('APIKEY');

        //Get errors and locations
        $locations = $ipLite->getCity($_SERVER['REMOTE_ADDR']);
        $errors = $ipLite->getError();

        $country = strtolower($locations['countryName']);

        return "$country";
    }
}

上記のコードは国名を返します。ユーザーがフランスから訪問している場合、URLが次のようになるようにURLを書き直すにはどうすればよいexample.com/france/{controller}/{action}ですか?

4

2 に答える 2

2

ビューヘルパーをコントローラープラグインにリファクタリングしてリダイレクトします。

コントローラープラグインはリクエストディスパッチループの早い段階で実行できるため、コントローラーが読み込まれてレンダリングされる前に、リクエストをインターセプトして別のレスポンスにリダイレクトできます。以下の例(警告、バグが含まれている可能性があります!)

class App_Plugin_DetectCountry extends Zend_Controller_Plugin_Abstract {

    public function preDispatch(Zend_Controller_Request_Abstract $request) {
        $ipLite = new ip2location_lite;
        $ipLite->setKey('APIKEY');

        //Get errors and locations
        $locations = $ipLite->getCity($_SERVER['REMOTE_ADDR']);
        $errors = $ipLite->getError();

        $country = strtolower($locations['countryName']);

        //Check if set country equals detected country
        if (!isset($_COOKIE['country']) || $country !== $_COOKIE['country']) {
            $_COOKIE['country'] = $country;
            $redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');
            $redirector->gotoUrl($country . '/' . $request->getControllerName() . '/' . $request->getActionName()); 
        }
    }
}
于 2012-07-25T03:23:24.317 に答える
1

IPを検索するのではなく、HTTPヘッダーを使用することについての、@ tripleeeのコメントに同意します。これにより、値が正しくなくなることがよくあります。または、リモートプロキシの背後にいるユーザーに不要な設定を強制することもあります。

ブラウザから指定されたユーザーのロケールに基づいてリダイレクトするために、このコントローラープラグインを試してください。

<?php

class Application_Plugin_Language extends Zend_Controller_Plugin_Abstract
{
    public function routeShutdown(Zend_Controller_Request_Abstract $request)
    {
        /*
        // if you add "localization.default_locale = "en_US" to your application.ini, uncomment the following
        $config = new Zend_Config($this->getOption('localization'), true);
        $loc = (isset($config->default_locale)) ? $config->default_locale : 'en_US';
        */

        $module = $request->getModuleName();
        if ($module != 'default') return ;

        // You can also check a cookie or session value here to see if you can return from the plugin as well

        $loc = 'en_US';

        Zend_Locale::setDefault($loc);

        try {
            $locale = new Zend_Locale(Zend_Locale::BROWSER);
        } catch (Zend_Locale_Exception $e) {
            $locale = new Zend_Locale($loc);
        }

        $language = $locale->getLanguage();  // e.g. "en", "de", "ru" etc.

        $urlHelper = new Zend_Controller_Action_Helper_Url();
        $url = $urlHelper->url(array('module' => $language, 'controller' => 'form', 'action' => 'index'));

        $redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');
        $redirector->gotoUrl($url);
    }
}

このプラグインは、ユーザーが現在デフォルトモジュールを要求している場合、ユーザーのブラウザによって設定された言語に基づいた言語名のモジュールにリダイレクトします。

このコードは、リダイレクト先のモジュールが存在するかどうかを確認するものではないことに注意してください。リダイレクトする前に、言語がサポートされていることを確認する必要があります。

また、ユーザーの希望する言語を含むCookieまたはセッション値のチェックを追加し、それに基づいてリダイレクトすることもできます。

これを追加してプラグインを登録しますapplication.ini

resources.frontController.plugins.language = "Application_Plugin_Language"

言語ではなく国に基づいてリダイレクトする場合は、次のように変更$language = $locale->getLanguage();します$region = $locale->getRegion();

お役に立てば幸いです。

于 2012-07-25T03:37:02.057 に答える