magento如何知道哪个商店使用?

时间:2012-06-19 05:47:07

标签: magento

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

我想知道我应该在哪里进入文件以了解将在fronend中使用哪个商店视图?

4 个答案:

答案 0 :(得分: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
  8. 当调用Mage_Core_Model_App::init()时设置当前语言环境,init()函数具有$this->_initEnvironment();,其设置为语言环境

答案 1 :(得分:2)

如果"将商店代码添加到网址"然后设置设置 Magento还根据网址中的商店代码存在来检测商店。 例如domain.com/en/ 它在Mage_Core_Controller_Request_Http :: setPathInfo()中实现

因此,按优先顺序(最低胜利),Magento使用以下数据来检测商店:

  1. 检查网址是否包含商店代码 - >用它
  2. 检查是否设置了带商店的Cookie
  3. 使用$ _SERVER [' MAGE_RUN_CODE']和$ _SERVER [' MAGE_RUN_TYPE']
  4. 从默认商店组和默认商店组获取默认商店 来自默认网站

答案 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();