Magento 何时决定使用哪个商店视图,何时设置当前区域设置?
我想知道我应该在哪里进入文件以知道哪个商店视图将在前端使用?
谢谢大家,
我想分享我的发现:
Mage::run()
self::$_app->run(...)
最终调用Mage_Core_Model_App::run()
函数的代码行Mage_Core_Model_App::run()
包括$this->_initCurrentStore($scopeCode, $scopeType);
_initCurrentStore()
:: 使用方法将所有网站、组和商店加载到网站、组和商店对象中_initStores()
。此功能检查站点是网站还是商店组或商店,如果是其中之一,则在那里设置当前商店。如果范围是基础,那么它会通过$this->_checkCookieStore()
$this->_checkCookieStore()
:: 这从 cookie 中获取存储类型$this->getCookie()->get(Mage_Core_Model_Store::COOKIE_NAME);
,在那里它检查它是否是网站、组或存储,并$this->_currentStore = $store;
根据 cookie 返回的值设置当前存储。Mage_Core_Model_App::_checkGetStore()
,这将使用 xpath_of_store_url 检查当前存储,更新 cookie当前语言环境是在Mage_Core_Model_App::init()
调用时设置的,init() 函数有$this->_initEnvironment();
一个语言环境设置
如果设置了“将商店代码添加到网址”设置,则 Magento 还会根据 url 中存在的商店代码检测商店。例如 domain.com/en/ 它在 Mage_Core_Controller_Request_Http::setPathInfo() 中实现
因此,按照优先级(最低获胜)的顺序,Magento 使用以下数据来检测商店:
我也在为 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() 中设置语言环境的整个想法是不正确的。也许有人感到困惑,不知道“默认时区”和“语言环境”之间的区别,但它绝对不是一回事!
要获取当前商店的详细信息,请使用以下代码。
$store = Mage::app()->getStore();
$name = $store->getName();