Magento何时决定使用哪个商店视图,以及何时设置当前区域设置?
我想知道我应该在哪里进入文件以了解将在fronend中使用哪个商店视图?
答案 0 :(得分:6)
谢谢大家,
我想分享我的发现:
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();
,其设置为语言环境
答案 1 :(得分:2)
如果"将商店代码添加到网址"然后设置设置 Magento还根据网址中的商店代码存在来检测商店。 例如domain.com/en/ 它在Mage_Core_Controller_Request_Http :: setPathInfo()中实现
因此,按优先顺序(最低胜利),Magento使用以下数据来检测商店:
答案 2 :(得分: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()中设置语言环境的整个想法是不正确的。也许有人感到困惑,并且不知道"默认时区"和#34; locale"但它绝对不是一回事!
答案 3 :(得分:0)
要获取当前商店详细信息,请使用以下代码。
$store = Mage::app()->getStore();
$name = $store->getName();