3

お客様のIPで店舗を運営したい。

Magentoのバックエンドでは、ユーザーは国ごとにロードするようにコンクリートストアを構成できます。

一見すると、Mage_Core_Model_Appクラスのメソッドが表示されます。

public function run($params)
{
    $options = isset($params['options']) ? $params['options'] : array();
    $this->baseInit($options);

    if ($this->_cache->processRequest()) {
        $this->getResponse()->sendResponse();
    } else {
        $this->_initModules();
        $this->loadAreaPart(Mage_Core_Model_App_Area::AREA_GLOBAL, Mage_Core_Model_App_Area::PART_EVENTS);

        if ($this->_config->isLocalConfigLoaded()) {
            //$scopeCode = isset($params['scope_code']) ? $params['scope_code'] : '';

            //===============custom scope by country======================

             $scopeCode = Mage::helper('custom/module')->getStoreByGeoip();

            //===============custom scope by country======================

            $scopeType = isset($params['scope_type']) ? $params['scope_type'] : 'store';
            $this->_initCurrentStore($scopeCode, $scopeType);
            $this->_initRequest();
            Mage_Core_Model_Resource_Setup::applyAllDataUpdates();
        }

        $this->getFrontController()->dispatch();
    }
    return $this;
}

良い解決策を得るための私の進歩の中で、私は別の選択肢を考えました。

index.phpに次のコードを記述します。

 Mage::app();
 Mage::Helper('custom/helper')->getRunCodeByGeoio();
 Mage::run($mageRunCode, $mageRunType);

このメソッドは以前にオブジェクトを作成していない場合にのみオブジェクトを作成するため、これはパフォーマンスの危険性はないと思います

/**
     * Get initialized application object.
     *
     * @param string $code
     * @param string $type
     * @param string|array $options
     * @return Mage_Core_Model_App
     */
    public static function app($code = '', $type = 'store', $options = array())
    {
        if (null === self::$_app) {
            self::$_app = new Mage_Core_Model_App();
            self::setRoot();
            self::$_events = new Varien_Event_Collection();
            self::$_config = new Mage_Core_Model_Config();

            Varien_Profiler::start('self::app::init');
            self::$_app->init($code, $type, $options);
            Varien_Profiler::stop('self::app::init');
            self::$_app->loadAreaPart(Mage_Core_Model_App_Area::AREA_GLOBAL, Mage_Core_Model_App_Area::PART_EVENTS);
        }
        return self::$_app;
    }

そして私の質問は......

これは解決策を得るための最良のアプローチですか?

リライトを使ってもMage_Core_Model_Appを変更するのは非常に危険だと思います

ティアでのイベントはありません

別のオプションは、index.phpでビジネスになりましたが、バックエンドによる管理を失いました

検索....、私の要件の多くをカバーする拡張機能を見つけました、 http://www.mageworx.com/store-and-currency-auto-switcher-magento-extension.html それから私はこれを購入するか、同様の拡張。

4

1 に答える 1

2

Magentoやその他のアプリケーションで開発する場合は、コアファイルに触れないようにする必要があります。

これを行うと、将来のアップグレードによって変更が上書きされ、ストアが破損する可能性があります。

最も簡単な方法は、すべてのindex.phpを実行することです。これは、ストアが選択されるエントリポイントであり、実行しているのは、さまざまな基準(つまり、IPアドレス)でストアを選択することだけです。

簡単な方法の1つは、maxmind GeoLiteなどの無料のライブラリを使用することです。http://dev.maxmind.com/geoip/geolite apache モジュールをロードするか、pecl拡張機能を介して、またはプレーンPHPを使用することもできます。

これにより、訪問者の国のISO国コードが返されます。

次に、ストアコードのカントリーISOコードを使用してストアに名前を付けることができます。これにより、IPに応じて正しいストアをロードするのが非常に簡単になります。

このような単純なもの:

$countryCode = getUsersCountryCode(); // which ever method you use in here...

$stores = array(
    'gb',
    'us',
    'fr',
);

if(in_array(countryCode, $stores)) {
    Mage::run(countryCode, 'store');
}
else {
    Mage::run($mageRunCode, $mageRunType);
}

もちろん、Magento拡張機能にすることもできますが、これがはるかに簡単な方法です。必要に応じて、国/店舗のリストをハードコーディングするのではなく、Magentoから取得することもできます。

于 2012-11-13T15:34:16.173 に答える