3

Magento 何时决定使用哪个商店视图,何时设置当前区域设置?

我想知道我应该在哪里进入文件以知道哪个商店视图将在前端使用?

4

4 回答 4

6

谢谢大家,

我想分享我的发现:

  1. Index.php 调用Mage::run()
  2. 它调用 app/mage.php :: run()
  3. 运行函数具有 self::$_app->run(...)最终调用Mage_Core_Model_App::run()函数的代码行
  4. Mage_Core_Model_App::run()包括$this->_initCurrentStore($scopeCode, $scopeType);
  5. _initCurrentStore():: 使用方法将所有网站、组和商店加载到网站、组和商店对象中_initStores()。此功能检查站点是网站还是商店组或商店,如果是其中之一,则在那里设置当前商店。如果范围是基础,那么它会通过$this->_checkCookieStore()
  6. $this->_checkCookieStore():: 这从 cookie 中获取存储类型$this->getCookie()->get(Mage_Core_Model_Store::COOKIE_NAME);,在那里它检查它是否是网站、组或存储,并$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

如果设置了“将商店代码添加到网址”设置,则 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. 从默认商店组获取默认商店,从默认网站获取默认商店组
于 2015-05-19T10:42:52.940 回答
1

我也在为 magento 认证考试而学习,但我不能 100% 确定该地区的反应。我在网上的搜索表明,被广泛接受的答案是:

当前语言环境是在调用 Mage_Core_Model_App::init() 时设置的,init() 函数具有 $this->_initEnvironment(); 有一个语言环境设置

好像有人这么说,每个人都在复制,但我不确定它是否正确。看到语言环境是在 Mage_Core_Model_Locale::__construct() 中决定的,但是在 $this->_initEnvironment() 中没有调用这个构造,因为在这个方法中 Mage_Core_Model_Locale 仅用作静态类。所以这不应该让构造运行:

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 行 App 模型第 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 回答