3

Magentoはいつ使用するストアビューを決定し、現在のロケールはいつ設定されますか?

どのストアビューがfronendで使用されるかを知るために、ファイルのどこに移動すればよいかを知りたいのですが。

4

4 に答える 4

6

みんな、ありがとう。

私の発見を共有したい:

  1. Index.php 呼び出しMage::run()
  2. app/mage.php :: run() を呼び出します
  3. run 関数には 、最終的に関数self::$_app->run(...)を呼び出すコード行がありますMage_Core_Model_App::run()
  4. Mage_Core_Model_App::run()含む$this->_initCurrentStore($scopeCode, $scopeType);
  5. _initCurrentStore():: メソッドを使用して、すべての Web サイト、グループ、およびストアを Web サイト、グループ、およびストア オブジェクトにロードします_initStores()。この関数は、サイトが Web サイトかストア グループかストアかをチェックし、これらのいずれかである場合は現在のストアを設定します。スコープがベースの場合、通過します$this->_checkCookieStore()
  6. $this->_checkCookieStore():: これは cookie からストア タイプを取得し、$this->getCookie()->get(Mage_Core_Model_Store::COOKIE_NAME);それが Web サイト、グループ、ストアのいずれであるかをチェックし$this->_currentStore = $store; 、cookie によって返された値に基づいて現在のストアを設定します。
  7. Mage_Core_Model_App::_checkGetStore()、これは現在のストアを xpath_of_store_url でチェックし、Cookie を更新します

が呼び出されたときに現在のロケールが設定さMage_Core_Model_App::init()れ、 init() 関数に$this->_initEnvironment();はロケールの設定がある

于 2012-07-14T05:18:31.470 に答える
2

「ストア コードを URL に追加」設定が設定されている場合、Magento は URL 内のストア コードの存在に基づいてストアも検出します。例 domain.com/en/ Mage_Core_Controller_Request_Http::setPathInfo() に実装されています。

そのため、優先度の高い順 (最低の勝利) で、Magento は次のデータを使用してストアを検出します。

  1. URL に店舗コードが含まれているかどうかを確認する -> 使用する
  2. ストア付きの Cookie が設定されているかどうかを確認します
  3. $_SERVER['MAGE_RUN_CODE'] と $_SERVER['MAGE_RUN_TYPE'] を使用
  4. デフォルト ストア グループからデフォルト ストアを取得し、デフォルト Web サイトからデフォルト ストア グループを取得します。
于 2015-05-19T10:42:52.940 に答える
1

私もマジェント認定試験の勉強をしていますが、ロケールの応答について 100% 確信が持てません。私の Web での検索は、広く受け入れられている答えが次のとおりであることを示しています。

現在のロケールは、Mage_Core_Model_App::init() が呼び出されたときに設定されます。init() 関数には $this->_initEnvironment(); があります。ロケールの設定がある

誰かが言ったようで、誰もがそれをコピーしているだけですが、それが正しいかどうかはわかりません. ロケールは Mage_Core_Model_Locale::__construct() で決定されますが、このメソッドでは Mage_Core_Model_Locale が静的クラスとしてのみ使用されるため、このコンストラクトは $this->_initEnvironment() で呼び出されません。したがって、これはコンストラクトを実行するべきではありません:

protected function _initEnvironment()
{
    $this->setErrorHandler(self::DEFAULT_ERROR_HANDLER);
    date_default_timezone_set(Mage_Core_Model_Locale::DEFAULT_TIMEZONE);
    return $this;
}

この関数は、タイムゾーンを設定するために Mage_Core_Model_Locale の定数のみを使用しているようです。タイムゾーンはロケールと同じではありません。

ただし、Mage_Core_Model_App では、関数 getLocale() がロケールを適切にインスタンス化します。これにより、コンストラクターが実行され、Mage_Core_Model_Locale::setLocale が実行されます。

Mage_Core_Model_App

public function getLocale()
{
    if (!$this->_locale) {
        $this->_locale = Mage::getSingleton('core/locale');
    }
    return $this->_locale;
}

Mage_Core_Model_Locale

public function __construct($locale = null)
{
    $this->setLocale($locale);
}

public function setLocale($locale = null)
{
    if (($locale !== null) && is_string($locale)) {
        $this->_localeCode = $locale;
    } else {
        $this->_localeCode = $this->getDefaultLocale();
    }
    Mage::dispatchEvent('core_locale_set_locale', array('locale'=>$this));
    return $this;
}

編集:

私がそれをしている間、私はすぐに行って、私が正しいかどうかを確認することにしました. これを行うために、私は追加しました

mageDebugBacktrace(); die();

Mage Core Locale モデルの setLocale() メソッドに。このメソッドは、Locale モデルがその _localeCode プロパティに値を設定する場合です。言い換えれば、これはロケールが設定されるときです。バックトレースは、それにつながったメソッドの呼び出しチェーンを示します。

結果は次のとおりです。

[1] /var/www/magento/htdocs/app/code/core/Mage/Core/Model/Locale.php:94
[2] /var/www/magento/htdocs/app/code/core/Mage/Core/Model/Config.php:1348
[3] /var/www/magento/htdocs/app/Mage.php:463
[4] /var/www/magento/htdocs/app/Mage.php:477
[5] /var/www/magento/htdocs/app/code/core/Mage/Core/Model/App.php:1018
[6] /var/www/magento/htdocs/app/code/core/Mage/Core/Model/Translate.php:347
[7] /var/www/magento/htdocs/app/code/core/Mage/Core/Model/Translate.php:179
[8] /var/www/magento/htdocs/app/code/core/Mage/Core/Model/Translate.php:119
[9] /var/www/magento/htdocs/app/code/core/Mage/Core/Model/App/Area.php:146
[10] /var/www/magento/htdocs/app/code/core/Mage/Core/Model/App/Area.php:121
[11] /var/www/magento/htdocs/app/code/core/Mage/Core/Model/App/Area.php:93
[12] /var/www/magento/htdocs/app/code/core/Mage/Core/Model/App.php:774
[13] /var/www/magento/htdocs/app/code/core/Mage/Core/Controller/Varien/Action.php:512
[14] /var/www/magento/htdocs/app/code/core/Mage/Core/Controller/Front/Action.php:64
[15] /var/www/magento/htdocs/app/code/core/Mage/Core/Controller/Varien/Action.php:407
[16] /var/www/magento/htdocs/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php:250
[17] /var/www/magento/htdocs/app/code/core/Mage/Core/Controller/Varien/Front.php:172
[18] /var/www/magento/htdocs/app/code/core/Mage/Core/Model/App.php:354
[19] /var/www/magento/htdocs/app/Mage.php:684
[20] /var/www/magento/htdocs/index.php:87

行 18 を見ることができます。アプリ モデルの行 354 は次のコードです。

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

これは App モデルの run() メソッドにあります。メソッド全体は次のようになります。

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

        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'] : '';
                $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;
    }

したがって、 baseInit() の最初に呼び出される _initEnvironment() でロケールが設定されるという全体的な考えは正しくありません。誰かが混乱して「デフォルトのタイムゾーン」と「ロケール」の違いを知らなかったのかもしれませんが、それは間違いなく同じではありません!

于 2016-10-10T17:26:05.387 に答える
0

現在の店舗の詳細を取得するには、以下のコードを使用します。

$store = Mage::app()->getStore();
$name = $store->getName();
于 2012-06-19T10:58:15.360 に答える